|
一、 简单了解各控件功能 0 d% u3 ]" N5 Z/ d" S7 T+ v3 j6 F& D
以下是各控件最简单的使用功能,其他功能依具体的实现而介绍。 : h5 g: i" K, z2 p' S( D
1. TquickRep:带有坐标,作为其他报表控件(如TQRBand)的容器,它的Band属性可以自动添加各种类型的TQRBand.
% i+ r3 Y6 B" H: a5 @. A8 ~ 2. TQRLabel:打印静态的文本(即不是根据数据库值来改变的),作用象Tlabel , Caption的内容就打印出来的内容。 . A, |1 t2 R4 n0 m
3. TQRDBText:打印数据库字段值,一个值一行。作用象TDBText.把它的DataSet , DataField分别赋予Table1,Company时,将打印Table1所指向的表的Company字段的内容。 9 [) n! d) {& Y! h# l
4. TQRSysData:打印系统信息如时间,页码,报表头等。 5 N4 r" r2 V6 Y0 L0 I' y; ]
5. TQRMem非常象TQRLabel,只是它可以打印多行,也是打印静态数据。 0 f; P% b. ^" O0 g" x1 S/ _# v# _9 A- k
6. TQRRichText:打印RichText格式,能够连接到一个Form上的RichEdit控件并打印它的内容,不过必须是32位版本的。
: _! ?& b+ I/ p3 h' m 7. TQRShape:打印方框、圆和垂直、水平线。
J# }/ l& s. T 8. TQRImage:打印静态的图片,包括(BMP,WMF,ICON). , a" @9 M q# d9 p
9. TQRDBImage:从数据库接收图片。
5 V( B4 j$ F7 }; n! n& N) v 10. TQRBand:用来确定报表的不同位置应该显示什么内容,它上面可以放控件(参见二)。 4 P3 K) ?4 J+ l0 M' {% G' g y8 d
11.TQRGoups:Groups可以不限级别的组操作。当你连接了几个datasets到报表时可以通过Groups成组的对dataset进行操作。
- M m+ K+ v; |9 D& b# W5 _: r二、 报表的控件摆放循序
0 ~3 s" |- p. J) B/ ^ 出现在所有页上的标题(PageHeader)
. E# S; b* w. b5 p9 F" U, p | # X3 X: Q/ A/ _/ g
标题(只有首页才有)(Title) # t1 z: @# }% Q* d# F0 m
| 0 A/ f$ b9 {+ d2 t" l. Q; J
所有列的标题(ColumnHeader)
9 Y1 e) l, c7 H8 K0 D | E5 _* d1 ^$ H$ Q3 G B @ Q
记录的内容,一个字段一列(Detail)
# Z9 x' K1 Y$ w7 i |
# B$ t$ J2 g4 `3 t* x 摘要(最后一页才有)(Summary) / T" }4 Y: k8 m- f
| ! o& d4 _% [/ j9 b
出现在所有页上的页脚(PageFooter)
, h s) |# {" ]# i$ {7 y9 `
( j) Z; h4 z# D8 c, L( Q# n: z 这些根据设置不同的Band(不是控件,一种类型而已,在其上面可以放其他控件)来定位。总共有六种Band。
& ~$ F' K1 r, P& a# A8 h三、 一个简单的例子 4 Y; h) @! X+ ?% R: ?+ ^- A$ J
这个例子制作打印一张表的部分字段名及该字段数据内容的报表。
) v1 n' Y) T* x8 z4 j3 | 1. 建立一个新project
3 F5 s1 O7 X% k 2. 放一个TTable到Form上,DatabaseName设为BCDEMOS,TableName指向Customer表,Active设为true. ! {, X/ b ^; e# @) a
3. 放一个TquickRep控件在Form上,DataSet属性为Table1.(即要显示上边Table1所指向的表的内)。 & m/ e3 j: I% s# a& I2 Q B5 t
4.展开TquickRep的Bands属性,设HasDetail为true,这时自动增加个detail band(一个TQRBand控件,故也可以直接放一个TQRBand控件,BandType属性设为detail就行了)。 ) @& |$ B, A, b! E4 @- o i
5.放一个TQRDBText控件在detail band上面,设DataSet指向Table1,DataField指向Company。第四步是设置在报表的什么位置显示什么类型的数据,而TQRDBText则具体实现。
; k1 {! @0 R1 j 6.选TquickRep控件,按右键,选择”Preview”预览,应该看到表Customer的字段Company的所有字段值。 7 R" E$ v6 f5 H; @% C" \
到这一个简单的例子就OK了,程序实现预览及利用TQRuickRep自带的打印功能只须在Form中加一个按钮,它的OnClick事件为:QuickRep1-> review();
. _$ M v$ u. ]$ w+ _9 d7 c四、 一个使用TQRGoups、TQRExpr控件的报表 / A1 Z& {5 n: [8 N* Q
该报表先列出州名,接着列出该州的所有公司及公司总数,一个州列完后空一行(groups中断),列出新的州名,接着列新州下的所有公司,没有填州名的公司统一列在Unknown state下面。 ! m5 l( v" T- H# a, V/ ~/ m! f+ R
1. 建立一个新project。 1 w& O S4 Z9 i3 b) z9 V
2. 放一个Tquery在Tquickrep上,其SQL属性为:select * from customer order by State,Company;(即根据州、公司排序),DatabaseName为BCDMome,Active为true.
) X4 P7 b n% s2 u# A" m 3. 放一个TquickRep控件在Form1上,DataSet为Tquery1.
) d! ^) L4 B N) o# T 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(根据不同的州来中断)。 {' O0 x5 N) A( n# E1 a) N! K
5. 放一个TQRBand控件在报表上,BandType为rbDetail. % T2 } E* `5 a
6.放一个TQRExpr控件在group header上面,其Expression属性为:if(State<>’’,State,’Unknown state’),即如果公司的州没填,就归入Unknown state,否则归入State. 4 H# ^+ D; r& k9 q3 S
7.放三个TQRDBText在Detail上,他们的DataSet都指向Query1,DataField分别指向Company,Contact,Phone.
# K; n' ]3 \3 e9 }6 ^$ ]0 g9 a' d 8.在放一个TQRExpr控件在group Footer上面,Expression为’Customers in’+State+’:’+Str(Count) 作用是在每个州的公司列完后显示该州总共有多少个公司。 . |. E! Z7 D3 m# X) }& p
9.按右键选预览,应该看到不同的州名及其公司和公司公司总数。
: o# J6 c* }. G; T五、QuickReport 条件式列印
/ ?- T% @; ?! L5 f, ~ 可以直接在 TQuickReport 的 OnFilter 事件中写明条件判断,OnFilter事件的引数中有一个以 var 宣告的 PrintRecord 布林型态变数,将这个变数设为 True(预设值), 该笔记录便会印出;反之, 设为False,就不印出这笔记录.
" a! E# s; @# w3 _7 {2 T procedure TForm1.QuickReport1Filter(var PrintRecord: Boolean);
f# q% k5 D/ U5 x+ l# S begin & H4 v7 o$ x8 b9 P
PrintRecord := False; + I: E4 m. Q$ V- k1 I5 ?
if YourTable.FieldByName('WantedField').AsInteger <= 100 then ) h* {5 c$ j2 L
Exit;
# O: s B6 y+ n7 M. w. M2 n" s if YourTable.FieldByName('WantedField').AsInteger >= 150 then 0 K' \* M6 |9 S' r
Exit;
' ~# _( B5 |' t8 [$ p% e PrintRecord := True;
# H1 J. g1 j4 a0 H2 G |