|
一、 简单了解各控件功能
9 N2 @( K2 z; P( g, D8 A2 | q 以下是各控件最简单的使用功能,其他功能依具体的实现而介绍。 3 U$ O v1 P, K2 _3 A
1. TquickRep:带有坐标,作为其他报表控件(如TQRBand)的容器,它的Band属性可以自动添加各种类型的TQRBand.
' D$ d" s7 w$ @* t/ A, P" P 2. TQRLabel:打印静态的文本(即不是根据数据库值来改变的),作用象Tlabel , Caption的内容就打印出来的内容。
$ s7 {) {6 h$ i9 z5 f6 ~& U' s3 P5 w 3. TQRDBText:打印数据库字段值,一个值一行。作用象TDBText.把它的DataSet , DataField分别赋予Table1,Company时,将打印Table1所指向的表的Company字段的内容。 ( ?% O4 B% ^: @9 f! a
4. TQRSysData:打印系统信息如时间,页码,报表头等。 ' O$ @3 h! W2 x k& h8 [
5. TQRMem非常象TQRLabel,只是它可以打印多行,也是打印静态数据。 + w7 S3 c; C$ w2 T3 x3 E4 Z
6. TQRRichText:打印RichText格式,能够连接到一个Form上的RichEdit控件并打印它的内容,不过必须是32位版本的。 * w6 n3 F7 f) L
7. TQRShape:打印方框、圆和垂直、水平线。
& v" l9 m( d5 e' E 8. TQRImage:打印静态的图片,包括(BMP,WMF,ICON).
! |. M3 l5 A9 I: v+ T: h O; p 9. TQRDBImage:从数据库接收图片。
$ p, P! H8 C- Y+ c& n5 h 10. TQRBand:用来确定报表的不同位置应该显示什么内容,它上面可以放控件(参见二)。 . a2 j1 V `% W$ n/ Z4 R
11.TQRGoups:Groups可以不限级别的组操作。当你连接了几个datasets到报表时可以通过Groups成组的对dataset进行操作。
- ~; X5 _3 R9 h+ S; m0 q二、 报表的控件摆放循序 ' b W5 e; d1 x, }" F; f
出现在所有页上的标题(PageHeader)
4 l% I' i5 e1 }* L( I | & c! b# h, J5 V( I; t7 R( d+ R1 s
标题(只有首页才有)(Title) # l8 s8 ` i) Y5 w. Y
| ; D. e% @ V3 C2 L3 u, J9 f" ^
所有列的标题(ColumnHeader)
+ Z7 f& {. E. C. P4 t' U |
) X6 d1 l# }( @6 b8 l: Y0 M6 r" ]7 T3 R 记录的内容,一个字段一列(Detail)
+ ?" z) I) V0 B3 e | 7 ~4 m% y: c6 F# k; L# M
摘要(最后一页才有)(Summary) 5 @: _0 e2 M: T
| 3 i$ m- O2 z$ |7 c# s4 R
出现在所有页上的页脚(PageFooter) d& ?) Z0 S, G+ g0 `; K2 g
3 q: ~4 ~2 l& L/ V9 ?- I3 F1 w9 D
这些根据设置不同的Band(不是控件,一种类型而已,在其上面可以放其他控件)来定位。总共有六种Band。
% x& F4 y/ {5 O6 z三、 一个简单的例子
: y- I' a" P q: h* s6 \% P 这个例子制作打印一张表的部分字段名及该字段数据内容的报表。
$ x E+ u/ F1 H) ]+ y1 a 1. 建立一个新project ' i% t+ ]2 a% q
2. 放一个TTable到Form上,DatabaseName设为BCDEMOS,TableName指向Customer表,Active设为true.
f2 O3 \2 S1 t- j s( W; L 3. 放一个TquickRep控件在Form上,DataSet属性为Table1.(即要显示上边Table1所指向的表的内)。 # W: B; u3 O+ ]" I5 [" O5 S
4.展开TquickRep的Bands属性,设HasDetail为true,这时自动增加个detail band(一个TQRBand控件,故也可以直接放一个TQRBand控件,BandType属性设为detail就行了)。 * Y' W3 _) M6 R" h# g' x
5.放一个TQRDBText控件在detail band上面,设DataSet指向Table1,DataField指向Company。第四步是设置在报表的什么位置显示什么类型的数据,而TQRDBText则具体实现。 6 W {% Q" i. ~
6.选TquickRep控件,按右键,选择”Preview”预览,应该看到表Customer的字段Company的所有字段值。 1 `" G* m5 C4 `7 r# y( q7 t9 a. {# h
到这一个简单的例子就OK了,程序实现预览及利用TQRuickRep自带的打印功能只须在Form中加一个按钮,它的OnClick事件为:QuickRep1-> review(); & I' g% a) l! [( W7 Z/ O
四、 一个使用TQRGoups、TQRExpr控件的报表 . c0 Z% Q4 t R
该报表先列出州名,接着列出该州的所有公司及公司总数,一个州列完后空一行(groups中断),列出新的州名,接着列新州下的所有公司,没有填州名的公司统一列在Unknown state下面。
6 ]; r8 j, n* z } T 1. 建立一个新project。 . z6 u6 J. U2 i" t, o
2. 放一个Tquery在Tquickrep上,其SQL属性为:select * from customer order by State,Company;(即根据州、公司排序),DatabaseName为BCDMome,Active为true.
2 e# `' Y7 U+ G% {: D 3. 放一个TquickRep控件在Form1上,DataSet为Tquery1.
' O) v( }1 {. l, s* b& A. D! H, d. { 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(根据不同的州来中断)。 - d$ b8 A) S* J1 F
5. 放一个TQRBand控件在报表上,BandType为rbDetail.
0 ?3 ~' s8 u7 Q8 s2 S 6.放一个TQRExpr控件在group header上面,其Expression属性为:if(State<>’’,State,’Unknown state’),即如果公司的州没填,就归入Unknown state,否则归入State. % z/ Z: C4 [' T; U% W9 u5 z' T
7.放三个TQRDBText在Detail上,他们的DataSet都指向Query1,DataField分别指向Company,Contact,Phone.
; A% n+ t8 E0 o9 q5 D3 D 8.在放一个TQRExpr控件在group Footer上面,Expression为’Customers in’+State+’:’+Str(Count) 作用是在每个州的公司列完后显示该州总共有多少个公司。 ' E2 F e- s9 `# w1 m+ B
9.按右键选预览,应该看到不同的州名及其公司和公司公司总数。
" v$ Q2 G% E/ P五、QuickReport 条件式列印
1 N z0 h) U3 \) H 可以直接在 TQuickReport 的 OnFilter 事件中写明条件判断,OnFilter事件的引数中有一个以 var 宣告的 PrintRecord 布林型态变数,将这个变数设为 True(预设值), 该笔记录便会印出;反之, 设为False,就不印出这笔记录. ( y8 v# x/ C1 I R+ c$ z7 K
procedure TForm1.QuickReport1Filter(var PrintRecord: Boolean); ' E. p: r! t5 A1 n% O
begin
- f, x' j1 L* a8 A2 v" V$ B9 |3 M PrintRecord := False; ' m5 M; t6 R. n# y7 g; ^* w
if YourTable.FieldByName('WantedField').AsInteger <= 100 then
/ K1 J7 }: o& x) e Exit;
. c: C4 U7 T8 N; [) Q if YourTable.FieldByName('WantedField').AsInteger >= 150 then
* m; E9 q) }- r+ a" d1 j9 U- T- C3 v Exit; % V9 L. Z3 O. ^2 `7 B8 o
PrintRecord := True; 1 W; k' c2 l0 U" u, m' x
|