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

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

[复制链接]
寻路者 发表于 2013-01-05 11:12:46 | 显示全部楼层 |阅读模式
技术原理
! p2 I* y, p; m* a  @4 m! `2 @8 s' T8 O9 T8 j
  通过在TpPReport的BeforePrint事件中对TPrinterDevice的PageSetting属性和PageList属性进行赋值+ G- i4 s0 Y9 t4 e2 s! ?
0 G( N+ S- M7 Z$ o$ [& p0 e; t! y
  为何要如此处理?
  z( C6 Q' H% R% k* W4 e7 g7 h# n- Y0 w2 \! w. Y' c
  根据分析ReportBuilder源码,我们得到如下的调用顺序TppViewer -> TppProducer -> TppPrinterDevice -> TppPageRequest -> TppPublisher,其中 TppPageRequest 封装了打印页范围信息,而TppPrinterDevice 负责将指定的页发送到PrinterCanvas
5 a/ ~7 F' D3 q7 ]+ x! [
; z6 E2 }' O/ W0 W% Z' }  实现步骤# P# B  O1 ^# ?, p5 k

! \2 t% z6 F( v6 H( {0 D# B  1、在调用单元声明一个类私有变量,用于保存打印页范围
9 H- A$ _6 k+ S1 m3 m; s  b
/ M0 u+ \6 B  ^. y  type# d& C( T. {+ ^

: @$ J8 h* e4 q( s  ...
+ z7 g1 I1 B& ~: W% t4 |, {# _5 `# q
  private" u3 Z2 `& K( w- |4 w6 `

: Y9 }4 \# L! [* {: p8 b: d  sPageRange: string;
9 W+ O, ^3 K9 u7 d! N% o# d6 e4 R" t* j& D" ^& h* C& u
  ...
7 y9 g& H% s, F, y% d2 x9 M$ }9 W) [8 N3 s# ~. ?
  end;: }$ _1 _$ u' I- Q7 S2 X0 D

1 U( ]5 z8 H- h, K) P! B! \  2、在调用单元声明一个类私有过程,用于处理TppReport.BeforePrint事件2 Y% K5 x. ?3 l7 F7 G% L
4 C/ ]( B+ p; ~/ V
  procedure TfrmMain.ppReportBeforePrint(Sender: TObject);
5 k" ^, i& p- E- u
" p* W) u/ j9 Q! d0 _  begin1 g2 i: h  r9 }: E' v

2 x( S  b/ I2 Y; ~# e  if Sender is TppReport then
% `6 y7 o# ~1 n! ]) w2 S6 m
: m8 X/ E: h8 B& r0 e% m  if (Sender as TppReport).PrinterDevice <> nil then
: e1 a6 w2 G2 q" h: A& E9 E: j( R2 k7 w) \" x1 x
  begin
" o/ N; y+ s" e( ~1 v- t
, j8 Z& ^& }9 c" j5 v2 K  (Sender as TppReport).PrinterDevice.PageSetting := psPageList;
' U/ ~% h7 @5 j. h, p0 c# I4 L7 ?6 a' k8 P6 w4 m
  ppTextToPageList(sPageRange, (Sender as TppReport).PrinterDevice.PageList, True);
9 ^9 Y7 N! W6 i' R$ N- Z, `6 v+ O+ X
  end;: L' @9 E6 e8 H- K
# M( ]) M" d: S  X& M' |4 C
  end;
" q( v% {- c$ Z( w: U; a" d7 J0 S; ]  c5 z. ]
  3、在打印之前设置打印页范围,将TppReport.BeforePrint引导到自定义过程1 U, w) @8 U, g) `" [8 r

4 K* L$ ~  C6 R4 h8 B  sPageRange := '3-5';5 f) R5 k8 |9 f4 W6 B
9 Y% \- `  z# w: ?) c+ O
  (ppViewer1.Report as TppReport).BeforePrint := ppReportBeforePrint;
, o1 S% B! q9 p7 v. ?2 ]; m+ A6 v1 u% D
  (ppViewer1.Report as TppReport).ShowPrintDialog := False;2 n8 Q( J# t; K
* v9 p# {; x( g) R9 G! n
  ppViewer1.Print;
: N4 C$ z& ], t; I, }' i% {) v9 F: D/ F
  注意事项' L0 N- ~$ D( q* c" @
2 m5 {+ Y; d' P/ k9 ~* H
  1,如果找不到TppReport类别,在接口引用单元添加ppReport单元, i4 R/ S- X# c

3 ?0 B$ ]& H, \  2,如果找不到psPageList类别,在接口引用单元添加ppTypes单元' _; n4 x; t6 Z; W  p

  C. x  I* D5 m; s) u9 E: G6 g  3,如果找不到ppTextToPageList函数,在接口引用单元添加ppUtils单元' ?3 i& a0 D& o1 a4 \* M

# a- @* r. K; G- e  4,sPageRange可以定义三种类型的页范围( T! Y% g9 R5 [  T( z6 A

  }. Y/ S" X: i" z  A:起止页:'3-10'//连接线分隔5 |: V4 w0 I: i# |* r# K
& k+ J/ |; ], t) D8 u
  B:分隔页:'3,5,7'//逗号分隔
" j; i8 I4 _! o0 k
8 Q, |9 U, r, {  q! H% R! M) f' p9 C  C:单独页:'7'
) ^- C/ v2 l; `: q0 U解决一切网站安全,湖盟云防火墙: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:56 , Processed in 0.042144 second(s), 26 queries , Gzip On.

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

    Powered by Discuz! X3.5

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