|
一、 简单了解各控件功能 6 X# W3 g- V+ a, N. \+ [
以下是各控件最简单的使用功能,其他功能依具体的实现而介绍。
4 J% ?* K6 z9 X! o3 f 1. TquickRep:带有坐标,作为其他报表控件(如TQRBand)的容器,它的Band属性可以自动添加各种类型的TQRBand.
: l$ f: L4 P: }: j 2. TQRLabel:打印静态的文本(即不是根据数据库值来改变的),作用象Tlabel , Caption的内容就打印出来的内容。 : ?1 k2 ^; j( v
3. TQRDBText:打印数据库字段值,一个值一行。作用象TDBText.把它的DataSet , DataField分别赋予Table1,Company时,将打印Table1所指向的表的Company字段的内容。 & c4 H C0 F8 F
4. TQRSysData:打印系统信息如时间,页码,报表头等。 1 q8 [/ e/ z" D
5. TQRMem非常象TQRLabel,只是它可以打印多行,也是打印静态数据。
9 s4 r& i& ~& i9 f& B- [ 6. TQRRichText:打印RichText格式,能够连接到一个Form上的RichEdit控件并打印它的内容,不过必须是32位版本的。 . @, K1 q6 M6 ^! A% @
7. TQRShape:打印方框、圆和垂直、水平线。
" H' G5 A* V8 I7 M9 e 8. TQRImage:打印静态的图片,包括(BMP,WMF,ICON).
\! Y3 e+ c3 @5 L- W 9. TQRDBImage:从数据库接收图片。
" x( z, }; S! u! q+ E! ]7 ~ 10. TQRBand:用来确定报表的不同位置应该显示什么内容,它上面可以放控件(参见二)。 4 q$ n9 o* a* u. Y
11.TQRGoups:Groups可以不限级别的组操作。当你连接了几个datasets到报表时可以通过Groups成组的对dataset进行操作。
1 l/ o' w% e. C- ^+ A, U S二、 报表的控件摆放循序
9 h# |! ?" q+ w- p& x/ q0 q 出现在所有页上的标题(PageHeader) ; S. S. u I# u z; U
| # d; @! V; k. I* z: J% B" w6 ~
标题(只有首页才有)(Title) " G, N! [# ^% Z$ c o: o0 i5 g" V/ U. h
| + s. M1 j+ A) l3 [- N1 z
所有列的标题(ColumnHeader)
: [+ S; N$ g( T1 b) ~8 o$ l" k) ^ |
k8 j+ k1 W* S4 B 记录的内容,一个字段一列(Detail) `1 }# J0 T4 R, j
|
( ?. h# N. E& o- d( ]% L1 ]* V 摘要(最后一页才有)(Summary) 8 S: c, d4 o# ^ a$ }0 W& ^" i
| + v5 y. ]' o I3 ]- s
出现在所有页上的页脚(PageFooter) 2 Y( m2 N% G6 \8 N, a" X4 H8 E7 L
7 B3 O" P) F& V0 V( N" D, K
这些根据设置不同的Band(不是控件,一种类型而已,在其上面可以放其他控件)来定位。总共有六种Band。 4 Q, N: k; m5 A1 C. g
三、 一个简单的例子
. }; o- s5 |- X/ i 这个例子制作打印一张表的部分字段名及该字段数据内容的报表。
1 n3 M5 N/ ^1 _# X9 C5 n( f0 K1 j 1. 建立一个新project
% M8 D1 V& h- }% ~2 d! Q 2. 放一个TTable到Form上,DatabaseName设为BCDEMOS,TableName指向Customer表,Active设为true.
" Z- d3 s$ U+ m0 w; f! D 3. 放一个TquickRep控件在Form上,DataSet属性为Table1.(即要显示上边Table1所指向的表的内)。 . X S3 A) I4 K1 ?9 z
4.展开TquickRep的Bands属性,设HasDetail为true,这时自动增加个detail band(一个TQRBand控件,故也可以直接放一个TQRBand控件,BandType属性设为detail就行了)。
5 Q+ E9 e2 W7 x$ z }# U9 K 5.放一个TQRDBText控件在detail band上面,设DataSet指向Table1,DataField指向Company。第四步是设置在报表的什么位置显示什么类型的数据,而TQRDBText则具体实现。 ( H: v3 @ q0 }) w) N
6.选TquickRep控件,按右键,选择”Preview”预览,应该看到表Customer的字段Company的所有字段值。
; p2 v/ [! p2 P) `1 N+ b% u/ Z 到这一个简单的例子就OK了,程序实现预览及利用TQRuickRep自带的打印功能只须在Form中加一个按钮,它的OnClick事件为:QuickRep1-> review(); 2 u. z( M( E8 ?
四、 一个使用TQRGoups、TQRExpr控件的报表
5 j- i& d" j d1 @4 L) h 该报表先列出州名,接着列出该州的所有公司及公司总数,一个州列完后空一行(groups中断),列出新的州名,接着列新州下的所有公司,没有填州名的公司统一列在Unknown state下面。
2 P! }" M) K+ e+ M: L6 ^ 1. 建立一个新project。 / H- n0 p, D6 Z" _; r
2. 放一个Tquery在Tquickrep上,其SQL属性为:select * from customer order by State,Company;(即根据州、公司排序),DatabaseName为BCDMome,Active为true. 4 I* T$ l. P* L O1 _: X1 Z
3. 放一个TquickRep控件在Form1上,DataSet为Tquery1. . b+ y3 o0 }# w% M! D+ L* O$ k' [
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 r3 l9 R: l2 z }: P5 e" l S' |5 U 5. 放一个TQRBand控件在报表上,BandType为rbDetail. }$ `) K1 ~- T, x/ w5 ~; q. H
6.放一个TQRExpr控件在group header上面,其Expression属性为:if(State<>’’,State,’Unknown state’),即如果公司的州没填,就归入Unknown state,否则归入State. ; |" h: Z4 n9 |4 Q# o/ [. M! c
7.放三个TQRDBText在Detail上,他们的DataSet都指向Query1,DataField分别指向Company,Contact,Phone.
6 g l) g# o5 J V 8.在放一个TQRExpr控件在group Footer上面,Expression为’Customers in’+State+’:’+Str(Count) 作用是在每个州的公司列完后显示该州总共有多少个公司。 : V4 A4 w S3 L/ }* x& @
9.按右键选预览,应该看到不同的州名及其公司和公司公司总数。 ( c- F. \7 r& N# l& M$ ~
五、QuickReport 条件式列印
, P3 s& |5 |- h( M$ f; [ 可以直接在 TQuickReport 的 OnFilter 事件中写明条件判断,OnFilter事件的引数中有一个以 var 宣告的 PrintRecord 布林型态变数,将这个变数设为 True(预设值), 该笔记录便会印出;反之, 设为False,就不印出这笔记录.
; e: o5 F3 t" k* Q0 l7 z+ k: O( k procedure TForm1.QuickReport1Filter(var PrintRecord: Boolean); 4 p& K( W; U$ W. J
begin
) r: Y) A( E7 O% n B- a PrintRecord := False;
n; {& N b( J) W2 \5 f if YourTable.FieldByName('WantedField').AsInteger <= 100 then }; `( Z$ f* o/ |
Exit; + J/ n/ z9 |. w
if YourTable.FieldByName('WantedField').AsInteger >= 150 then
3 D3 v2 Q' z9 v5 O7 V7 m4 ] Exit; ; A9 b5 q8 ?$ w5 P
PrintRecord := True; 4 h5 D/ z, p, l' j7 W
|