技术原理
! 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 |