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