2005-6-23 fh@mail.trisunwyse.com
技術原理
     通過在TpPReport的BeforePrint事件中對TPrinterDevice的PageSetting屬性和PageList屬性進行賦值
為何要如此處理?
根據(jù)分析ReportBuilder源碼,我們得到如下的調(diào)用順序TppViewer -> TppProducer -> TppPrinterDevice -> TppPageRequest -> TppPublisher,其中 TppPageRequest 封裝了打印頁范圍信息,而TppPrinterDevice 負責將指定的頁發(fā)送到PrinterCanvas
實現(xiàn)步驟
  1、在調(diào)用單元聲明一個類私有變量,用于保存打印頁范圍
  type
    ...
  private
    sPageRange: string;
    ...
  end;
  2、在調(diào)用單元聲明一個類私有過程,用于處理TppReport.BeforePrint事件
procedure TfrmMain.ppReportBeforePrint(Sender: TObject);
begin
  if Sender is TppReport then
    if (Sender as TppReport).PrinterDevice <> nil then
    begin
      (Sender as TppReport).PrinterDevice.PageSetting := psPageList;
      PPTextToPageList(sPageRange, (Sender as TppReport).PrinterDevice.PageList, True);
    end;
end;
  3、在打印之前設置打印頁范圍,將TppReport.BeforePrint引導到自定義過程
  sPageRange := '3-5';
  (ppViewer1.Report as TppReport).BeforePrint := ppReportBeforePrint;
  (ppViewer1.Report as TppReport).ShowPrintDialog := False;
  ppViewer1.Print;
注意事項
  1,如果找不到TppReport類別,在接口引用單元添加ppReport單元
  2,如果找不到psPageList類別,在接口引用單元添加ppTypes單元
  3,如果找不到ppTextToPageList函數(shù),在接口引用單元添加ppUtils單元
  4,sPageRange可以定義三種類型的頁范圍
     A:起止頁:'3-10'//連接線分隔
     B:分隔頁:'3,5,7'//逗號分隔
     C:單獨頁:'7'
新聞熱點
疑難解答