找回密码
 加入怎通
查看: 731|回复: 8

[关于百度] ReportBuilder设置打印页范围技巧

[复制链接]
寻路者 发表于 2013-01-05 11:12:46 | 显示全部楼层 |阅读模式
技术原理: S& R8 K* N, m) E
1 E9 M/ P4 n& X+ i0 R% _4 M
  通过在TpPReport的BeforePrint事件中对TPrinterDevice的PageSetting属性和PageList属性进行赋值
+ _) t& j2 [8 v
: o" _6 p, w, Y! \$ [" P6 z; ]  为何要如此处理?; f& f/ d9 d- b

. x& i$ w/ o# f2 m4 m$ ]5 d0 E3 o  根据分析ReportBuilder源码,我们得到如下的调用顺序TppViewer -> TppProducer -> TppPrinterDevice -> TppPageRequest -> TppPublisher,其中 TppPageRequest 封装了打印页范围信息,而TppPrinterDevice 负责将指定的页发送到PrinterCanvas& U5 v& M4 R% z
8 u5 s( v5 e  e1 v
  实现步骤
7 `/ g  }) \" [. w" j% N$ O
3 W% }4 v/ h! d% _3 Q& f  1、在调用单元声明一个类私有变量,用于保存打印页范围/ a8 {9 a$ E' t$ Q; p
% `0 f" }" T; C# V' G
  type
2 e( k! I! f9 H' y7 o. j* o. F8 b% \6 |5 Y0 |
  ...
. [, r+ H- r( Q/ Y$ t) {) j" ]1 U! C, v$ u
  private0 C& ^* I- X- G8 r$ P

7 n+ S" j* @1 P  sPageRange: string;9 D) a% b% {% _1 k9 B. [  }/ ?
. L: `) V7 x- o
  ...& {  N4 E$ q: G/ T# }* I

/ r! S; C0 f4 b3 Y  end;
. N* u: w2 ^! r' b+ @2 J
5 _3 N% g" k. E9 O6 r7 W2 e  2、在调用单元声明一个类私有过程,用于处理TppReport.BeforePrint事件
3 l/ J# Q7 L4 a  E+ P7 u" L- R, X4 K+ U* A' f* N
  procedure TfrmMain.ppReportBeforePrint(Sender: TObject);0 y  h4 E3 o8 M8 W! V6 |
+ L0 R% w/ }1 t6 S( Z  w) n2 }
  begin8 H9 K5 z; b. J- v0 n9 |
1 k$ ~4 ]4 Z$ M/ A# _4 l
  if Sender is TppReport then
; a0 S0 J9 a$ B$ e$ v; g; z' [
9 O) o# f  ?4 E! {  if (Sender as TppReport).PrinterDevice <> nil then
( n  j) ^" x5 t  \- h. V; X7 Y
) _- Q  W. F7 f8 x0 ^  begin6 ~; u+ U7 I9 f: O
7 H; k/ }% C4 u. y" R) @
  (Sender as TppReport).PrinterDevice.PageSetting := psPageList;
7 e9 s/ C8 o. j5 d# Q% E: M& X
5 }0 b7 Y, ]4 g7 ?+ C" E3 ?  ppTextToPageList(sPageRange, (Sender as TppReport).PrinterDevice.PageList, True);8 D- c: D' c/ H# @

3 y: j; Z: X$ Y* g) Z  end;
3 k( {# R( Q2 A3 R) i+ Y. i2 _2 l* Y- }+ N* f. G% ]  X) D
  end;
5 W$ d  l& e0 T5 k3 K7 I- d* x/ t# {/ r) v) _
  3、在打印之前设置打印页范围,将TppReport.BeforePrint引导到自定义过程
" F: ^, W3 q8 Y" |  T( M3 `
9 Z6 g0 i! e. Y% O  q- T  sPageRange := '3-5';
( W, ]. W6 a4 U  s
  d! H% K; P9 a6 M2 [3 L# ^  (ppViewer1.Report as TppReport).BeforePrint := ppReportBeforePrint;# s5 @  |: q, j, N- ]8 k& a; V

6 e  \; O* d! i6 B  ?  @  (ppViewer1.Report as TppReport).ShowPrintDialog := False;, u7 [2 g3 J$ P! O$ v; |
! a0 f# y5 ]! }- ^1 N: s* t
  ppViewer1.Print;
! _& g/ S: ^! W4 z7 M# j
; B- w$ `# Z3 S/ F# W5 M  注意事项
: p6 \! E) Q  `5 ~3 q
# f7 ~- G) p# b* W. x% M. t0 n0 K2 O  1,如果找不到TppReport类别,在接口引用单元添加ppReport单元' p4 x. r* x# \5 I9 B
1 q% ?) y$ b- k0 a3 E# X+ t6 H" N1 d
  2,如果找不到psPageList类别,在接口引用单元添加ppTypes单元4 d$ B5 T  Q; y9 A. {% g, {: t1 z
, ?. E6 h" l1 n9 r% u% I
  3,如果找不到ppTextToPageList函数,在接口引用单元添加ppUtils单元& L7 v) q& C4 d
& b& @- ^( G3 I$ x+ i
  4,sPageRange可以定义三种类型的页范围. P1 t' [5 Y  _* g
  D  w  f) J& [& H
  A:起止页:'3-10'//连接线分隔
) F- S8 _- r/ D3 ?& i% d
# \; N# w* r2 {% w; q, ]  B:分隔页:'3,5,7'//逗号分隔) T' z# O( V6 K8 I6 T0 ~& ]$ B( k: b" d

' N; J2 M% \* Y2 a  C:单独页:'7'0 w& y* \$ ?% b1 n2 H
解决一切网站安全,湖盟云防火墙: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 | 显示全部楼层
分析得很透彻,很多细节都说到点子上了~
回复

使用道具 举报

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-10-31 19:47 , Processed in 0.051494 second(s), 25 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表