寻路者 发表于 2013-01-05 11:12:46

ReportBuilder设置打印页范围技巧

技术原理

  通过在TpPReport的BeforePrint事件中对TPrinterDevice的PageSetting属性和PageList属性进行赋值

  为何要如此处理?

  根据分析ReportBuilder源码,我们得到如下的调用顺序TppViewer -> TppProducer -> TppPrinterDevice -> TppPageRequest -> TppPublisher,其中 TppPageRequest 封装了打印页范围信息,而TppPrinterDevice 负责将指定的页发送到PrinterCanvas

  实现步骤

  1、在调用单元声明一个类私有变量,用于保存打印页范围

  type

  ...

  private

  sPageRange: string;

  ...

  end;

  2、在调用单元声明一个类私有过程,用于处理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函数,在接口引用单元添加ppUtils单元

  4,sPageRange可以定义三种类型的页范围

  A:起止页:'3-10'//连接线分隔

  B:分隔页:'3,5,7'//逗号分隔

  C:单独页:'7'
解决一切网站安全,湖盟云防火墙:hnhack.com

pengdan 发表于 2013-01-05 11:25:01

只是随便看看,寻找合适的帖子

◇|OvЁ寶 发表于 2026-09-15 06:32:13

这个思路很新颖,打开了新世界的大门,谢谢分享

ソ﹏九〃 发表于 2026-09-23 00:09:47

学习到了,之前一直没注意过这个点,受教了

ソ﹏九〃 发表于 2026-09-26 05:15:54

蹲了这么久,终于看到有价值的讨论,支持一下!

20120506 发表于 2026-10-12 04:47:13

楼主辛苦了,整理这么多内容,必须点赞收藏

weihunchunan 发表于 2026-10-15 06:28:48

这个分享太实用了,刚好能用到,感谢楼主!

西万路小混混 发表于 2026-10-17 04:47:49

内容很干货,没有多余的废话,值得反复看

林宇 发表于 2026-10-18 07:25:07

分析得很透彻,很多细节都说到点子上了~
页: [1]
查看完整版本: ReportBuilder设置打印页范围技巧