|
一、 简单了解各控件功能 ( p) D* V1 P7 q
以下是各控件最简单的使用功能,其他功能依具体的实现而介绍。
5 t. k# o2 }. g' @( q& P# Q+ t, o9 i+ ] 1. TquickRep:带有坐标,作为其他报表控件(如TQRBand)的容器,它的Band属性可以自动添加各种类型的TQRBand. 4 { A8 m/ X3 |9 }' Y& j
2. TQRLabel:打印静态的文本(即不是根据数据库值来改变的),作用象Tlabel , Caption的内容就打印出来的内容。 $ d4 ]4 V" M! ~. U3 h
3. TQRDBText:打印数据库字段值,一个值一行。作用象TDBText.把它的DataSet , DataField分别赋予Table1,Company时,将打印Table1所指向的表的Company字段的内容。
D4 m+ E, X$ m 4. TQRSysData:打印系统信息如时间,页码,报表头等。
* P$ } |6 \. P 5. TQRMem非常象TQRLabel,只是它可以打印多行,也是打印静态数据。
7 Y) m7 F/ V, w 6. TQRRichText:打印RichText格式,能够连接到一个Form上的RichEdit控件并打印它的内容,不过必须是32位版本的。 4 m1 H* T7 v8 c: ^7 O
7. TQRShape:打印方框、圆和垂直、水平线。 . }% k; R! H: }
8. TQRImage:打印静态的图片,包括(BMP,WMF,ICON).
2 ~* P" D. L8 V0 {/ b. m 9. TQRDBImage:从数据库接收图片。
, S8 s6 [7 r. }; @% K5 |* X 10. TQRBand:用来确定报表的不同位置应该显示什么内容,它上面可以放控件(参见二)。
0 U6 q% J! c0 H; w& t: N* N5 z, B& ` 11.TQRGoups:Groups可以不限级别的组操作。当你连接了几个datasets到报表时可以通过Groups成组的对dataset进行操作。 / f, z b) @8 y' x0 m
二、 报表的控件摆放循序 + `. d1 Z ?* l/ _' i5 J
出现在所有页上的标题(PageHeader) ( i4 F4 M- |* d3 @: [- X" W
|
- P3 C! G- P* v p/ n2 { e 标题(只有首页才有)(Title)
9 Q' |3 M& u4 L% W+ [" A5 T |
. q6 K" |8 a6 F5 M2 W 所有列的标题(ColumnHeader) ( `" A: g1 E) o7 M
| ! D' t$ s/ g# W& y3 Y9 H
记录的内容,一个字段一列(Detail)
C+ X5 p% A; H. }3 d! |3 v0 ? |
$ L( I% c% D1 y; V 摘要(最后一页才有)(Summary) z& S( P$ P+ x! c/ K, R
| , i- V( \8 b, R& E
出现在所有页上的页脚(PageFooter) 4 _) F* O8 C6 X3 Z. q: J
% w1 W! T7 Q# D! C8 x* c- ]
这些根据设置不同的Band(不是控件,一种类型而已,在其上面可以放其他控件)来定位。总共有六种Band。 2 g" }; M1 U, M* k0 O5 K
三、 一个简单的例子
; `4 T8 x) [. D* J# y7 I, { 这个例子制作打印一张表的部分字段名及该字段数据内容的报表。 7 v. u; s3 u# m \
1. 建立一个新project 7 H6 ]8 Q# l% z$ t* ?
2. 放一个TTable到Form上,DatabaseName设为BCDEMOS,TableName指向Customer表,Active设为true. k; s; I1 P {+ N, R2 p6 `
3. 放一个TquickRep控件在Form上,DataSet属性为Table1.(即要显示上边Table1所指向的表的内)。
! W* y1 _, q" S. S O& w 4.展开TquickRep的Bands属性,设HasDetail为true,这时自动增加个detail band(一个TQRBand控件,故也可以直接放一个TQRBand控件,BandType属性设为detail就行了)。
$ b$ e0 |: F' x- G1 n8 ^2 q5 _6 q 5.放一个TQRDBText控件在detail band上面,设DataSet指向Table1,DataField指向Company。第四步是设置在报表的什么位置显示什么类型的数据,而TQRDBText则具体实现。
( \3 c5 w1 W) q1 ^ 6.选TquickRep控件,按右键,选择”Preview”预览,应该看到表Customer的字段Company的所有字段值。
4 W" O7 O8 H- g: O" w1 S 到这一个简单的例子就OK了,程序实现预览及利用TQRuickRep自带的打印功能只须在Form中加一个按钮,它的OnClick事件为:QuickRep1-> review();
1 L7 ~# n8 Q2 c1 I+ _# s四、 一个使用TQRGoups、TQRExpr控件的报表
0 Z* U; T1 S: o1 N7 B 该报表先列出州名,接着列出该州的所有公司及公司总数,一个州列完后空一行(groups中断),列出新的州名,接着列新州下的所有公司,没有填州名的公司统一列在Unknown state下面。
# z1 V1 M0 Q8 `7 o( A0 q 1. 建立一个新project。
* C) [* y0 M0 j0 c ~1 r 2. 放一个Tquery在Tquickrep上,其SQL属性为:select * from customer order by State,Company;(即根据州、公司排序),DatabaseName为BCDMome,Active为true.
7 C! X$ R3 U) q3 q 3. 放一个TquickRep控件在Form1上,DataSet为Tquery1.
* Y/ h; n. e- m3 ~- r7 T6 M 4. 放一个TQRGroups控件在TquickRep上,这时默认为group header。(任何时候当group中断或更高级别的group中断,这个header都将打印出来,如果有表达式,根据表达式的值显示内容。)接着添加一个group footer band,添加时,放一个TQRBand控件在报表上,连接TQRGroups的FooterBand属性到这个QRBand,这时这个新建的TQRBand就成为Group Footer. (TQRGroup的一个重要特性是表达式,任何时候当表达式的值变时Group都将中断,如表达式是按省列出城市名,当前列出广东省,当属于该省的城市列完后,表达式值改变,这时Group中断,接着显示其他省的城市名。)TQRGroups的Expression属性设为Query1.State(根据不同的州来中断)。 @1 Z. d3 `/ H$ W7 x. c: Z
5. 放一个TQRBand控件在报表上,BandType为rbDetail. 5 [- U! K: B# w8 Q$ i
6.放一个TQRExpr控件在group header上面,其Expression属性为:if(State<>’’,State,’Unknown state’),即如果公司的州没填,就归入Unknown state,否则归入State.
. m/ W# t0 F ^# P3 R# C 7.放三个TQRDBText在Detail上,他们的DataSet都指向Query1,DataField分别指向Company,Contact,Phone. 1 l, P$ @' x8 Z
8.在放一个TQRExpr控件在group Footer上面,Expression为’Customers in’+State+’:’+Str(Count) 作用是在每个州的公司列完后显示该州总共有多少个公司。 , Q1 g" D, G6 k4 I
9.按右键选预览,应该看到不同的州名及其公司和公司公司总数。 9 K0 M2 z \6 V. W% {
五、QuickReport 条件式列印
4 A9 t7 g. g- b, R8 @+ R8 M+ r 可以直接在 TQuickReport 的 OnFilter 事件中写明条件判断,OnFilter事件的引数中有一个以 var 宣告的 PrintRecord 布林型态变数,将这个变数设为 True(预设值), 该笔记录便会印出;反之, 设为False,就不印出这笔记录. h! ~% {" L/ s* G! e$ J6 ]' N
procedure TForm1.QuickReport1Filter(var PrintRecord: Boolean);
1 [/ Z! c4 ^. P+ X- m% A4 ^2 [ begin
. B# a! H& H$ ]9 a PrintRecord := False;
2 s8 ^! Q3 @& P4 b if YourTable.FieldByName('WantedField').AsInteger <= 100 then 6 a6 ? W2 v v5 r* I' c
Exit; & w& u! r# J7 D$ t0 O. B
if YourTable.FieldByName('WantedField').AsInteger >= 150 then % L& V4 O0 Z$ s: J& G$ ~
Exit; - V" |# E. s$ Z7 U9 U' h
PrintRecord := True;
9 C5 z5 H5 z3 e" S6 D |