|
一、 简单了解各控件功能
& K# p' X. @5 m* c) { 以下是各控件最简单的使用功能,其他功能依具体的实现而介绍。 . V) l+ Q; k; u
1. TquickRep:带有坐标,作为其他报表控件(如TQRBand)的容器,它的Band属性可以自动添加各种类型的TQRBand. 8 u6 w* \- p0 |" N8 H
2. TQRLabel:打印静态的文本(即不是根据数据库值来改变的),作用象Tlabel , Caption的内容就打印出来的内容。
2 T& u. Y9 z& l% s6 A 3. TQRDBText:打印数据库字段值,一个值一行。作用象TDBText.把它的DataSet , DataField分别赋予Table1,Company时,将打印Table1所指向的表的Company字段的内容。 0 n8 A) w+ D. v3 `3 |. s
4. TQRSysData:打印系统信息如时间,页码,报表头等。 . ^, I# h _; W7 t1 C3 S/ L+ `/ W7 e
5. TQRMem非常象TQRLabel,只是它可以打印多行,也是打印静态数据。 5 ]: h9 i6 F* P# V
6. TQRRichText:打印RichText格式,能够连接到一个Form上的RichEdit控件并打印它的内容,不过必须是32位版本的。
; X( `5 ?. p/ M" W' ]) }# W 7. TQRShape:打印方框、圆和垂直、水平线。 2 a% [& @! k [- @
8. TQRImage:打印静态的图片,包括(BMP,WMF,ICON). & H& Z r- J1 i. \/ m) G' O
9. TQRDBImage:从数据库接收图片。 ! ?" w7 g+ @+ D" D0 c
10. TQRBand:用来确定报表的不同位置应该显示什么内容,它上面可以放控件(参见二)。 / x3 Q' Q/ a' R6 q+ j+ K
11.TQRGoups:Groups可以不限级别的组操作。当你连接了几个datasets到报表时可以通过Groups成组的对dataset进行操作。
4 I. T! h6 J n" e e" G二、 报表的控件摆放循序 0 N8 W x" N6 |6 n' k5 f9 R. l
出现在所有页上的标题(PageHeader) % q7 a, z' O& Z) B, I
|
5 H, R4 m5 t* D S 标题(只有首页才有)(Title)
( Q' l m% p4 O- s j X" n |
" J( k- [& a% c [ 所有列的标题(ColumnHeader) 8 ^8 T5 B3 m. j$ x) i+ V
| * s k c: k+ L! A' f
记录的内容,一个字段一列(Detail) ) {% k8 O6 ?5 Y8 Y9 ?+ z
| . F. f: ~0 f) S( z4 O. D* {9 R. r! J
摘要(最后一页才有)(Summary)
+ v% J, Q5 `4 [7 b9 a | ! ^- O4 J, o J/ m! F# w
出现在所有页上的页脚(PageFooter)
/ w: R' D! u; r: O# | / |( T, K. \5 ~8 O% A& J$ `
这些根据设置不同的Band(不是控件,一种类型而已,在其上面可以放其他控件)来定位。总共有六种Band。 - R$ j) a! g. G2 A) @
三、 一个简单的例子
" f7 J5 ?$ o5 P. ^/ F 这个例子制作打印一张表的部分字段名及该字段数据内容的报表。 0 h$ n% ~- J2 p* G8 m' N% @% o
1. 建立一个新project 5 P8 e6 R3 t X& Y# D% y. U
2. 放一个TTable到Form上,DatabaseName设为BCDEMOS,TableName指向Customer表,Active设为true.
1 c% m$ v( J: U 3. 放一个TquickRep控件在Form上,DataSet属性为Table1.(即要显示上边Table1所指向的表的内)。 $ }. b- ~% [0 r3 y5 e
4.展开TquickRep的Bands属性,设HasDetail为true,这时自动增加个detail band(一个TQRBand控件,故也可以直接放一个TQRBand控件,BandType属性设为detail就行了)。
7 T, p1 G1 `1 k$ I( c 5.放一个TQRDBText控件在detail band上面,设DataSet指向Table1,DataField指向Company。第四步是设置在报表的什么位置显示什么类型的数据,而TQRDBText则具体实现。
) J' b5 v3 a( b; g 6.选TquickRep控件,按右键,选择”Preview”预览,应该看到表Customer的字段Company的所有字段值。 / v5 h+ d2 Y# S8 v g1 R
到这一个简单的例子就OK了,程序实现预览及利用TQRuickRep自带的打印功能只须在Form中加一个按钮,它的OnClick事件为:QuickRep1-> review();
d! l" j9 h, W9 T8 X8 ~四、 一个使用TQRGoups、TQRExpr控件的报表
8 i* w! z4 e$ B j' V$ C( A 该报表先列出州名,接着列出该州的所有公司及公司总数,一个州列完后空一行(groups中断),列出新的州名,接着列新州下的所有公司,没有填州名的公司统一列在Unknown state下面。
/ @6 ?: {4 v6 n 1. 建立一个新project。 ; h% j/ l# N3 \+ W1 B# h
2. 放一个Tquery在Tquickrep上,其SQL属性为:select * from customer order by State,Company;(即根据州、公司排序),DatabaseName为BCDMome,Active为true. 9 y* F4 L) ?8 P7 c3 ?4 y
3. 放一个TquickRep控件在Form1上,DataSet为Tquery1.
; E! X: u" ?9 q' I# B' n8 E6 V7 p 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(根据不同的州来中断)。
8 y a% s0 N" }, G2 n 5. 放一个TQRBand控件在报表上,BandType为rbDetail.
9 w* c# m5 d+ a8 F/ s2 L6 b 6.放一个TQRExpr控件在group header上面,其Expression属性为:if(State<>’’,State,’Unknown state’),即如果公司的州没填,就归入Unknown state,否则归入State.
) P6 r- C0 w- [8 }5 n 7.放三个TQRDBText在Detail上,他们的DataSet都指向Query1,DataField分别指向Company,Contact,Phone.
$ ?% B) u" {/ V 8.在放一个TQRExpr控件在group Footer上面,Expression为’Customers in’+State+’:’+Str(Count) 作用是在每个州的公司列完后显示该州总共有多少个公司。 # X: o! n s" f, n* X3 ?
9.按右键选预览,应该看到不同的州名及其公司和公司公司总数。 9 ~ H+ u9 l1 |+ z/ b
五、QuickReport 条件式列印 9 k" ` I+ e. H. s# \* D, A9 F
可以直接在 TQuickReport 的 OnFilter 事件中写明条件判断,OnFilter事件的引数中有一个以 var 宣告的 PrintRecord 布林型态变数,将这个变数设为 True(预设值), 该笔记录便会印出;反之, 设为False,就不印出这笔记录.
+ |# e6 `# b( S H8 w# {: t procedure TForm1.QuickReport1Filter(var PrintRecord: Boolean);
p# {' U! f; g; X% k begin 5 V F! Q* K: ]1 t
PrintRecord := False; 3 g. [1 _) N- T ~, {/ P! w
if YourTable.FieldByName('WantedField').AsInteger <= 100 then & F% b9 y& Y) @" p+ i6 M0 z
Exit; ( w# ?2 f z" s# V3 I7 w
if YourTable.FieldByName('WantedField').AsInteger >= 150 then 3 l, `: h/ V' L2 h! B% p9 e
Exit; ( M9 b4 R: a9 E3 |3 M! K
PrintRecord := True; ! _+ }( ]0 ]/ f8 r. q4 H
|