|
一、 简单了解各控件功能 % P. ?1 T9 }* f' E I
以下是各控件最简单的使用功能,其他功能依具体的实现而介绍。
0 m$ w* t, x$ j, J, q2 f5 m5 X 1. TquickRep:带有坐标,作为其他报表控件(如TQRBand)的容器,它的Band属性可以自动添加各种类型的TQRBand.
: c" d: \$ e. h+ G4 ]1 r 2. TQRLabel:打印静态的文本(即不是根据数据库值来改变的),作用象Tlabel , Caption的内容就打印出来的内容。 + w* Y4 }& L3 Y( r4 Q* a
3. TQRDBText:打印数据库字段值,一个值一行。作用象TDBText.把它的DataSet , DataField分别赋予Table1,Company时,将打印Table1所指向的表的Company字段的内容。
, M: x. ?" Z Y- w% n1 c8 i% l& P 4. TQRSysData:打印系统信息如时间,页码,报表头等。
l, T6 e# `0 N7 ? 5. TQRMem非常象TQRLabel,只是它可以打印多行,也是打印静态数据。
; _; X5 ]; R5 {6 f8 | 6. TQRRichText:打印RichText格式,能够连接到一个Form上的RichEdit控件并打印它的内容,不过必须是32位版本的。 $ W, A" P; y# m k4 {! S
7. TQRShape:打印方框、圆和垂直、水平线。 ) v# n8 z' c7 n1 H& n9 [# N
8. TQRImage:打印静态的图片,包括(BMP,WMF,ICON). . _- m+ }# T* i9 c9 j' U: Y
9. TQRDBImage:从数据库接收图片。
$ \$ B0 \* e$ _! X a! a+ L 10. TQRBand:用来确定报表的不同位置应该显示什么内容,它上面可以放控件(参见二)。 1 N0 K) e/ y" v0 l$ b9 c
11.TQRGoups:Groups可以不限级别的组操作。当你连接了几个datasets到报表时可以通过Groups成组的对dataset进行操作。
# m' y. t5 r5 ?: A/ y$ `& I二、 报表的控件摆放循序 " |' Q3 }$ ^/ t
出现在所有页上的标题(PageHeader) 1 s7 |( H( N1 u6 a8 s2 C. y
|
; j; m0 H) A7 t2 m0 u 标题(只有首页才有)(Title)
, j, ~/ F& u" F; D$ O; r | 6 R; ]3 g* m% m7 g: _
所有列的标题(ColumnHeader)
8 q8 y: N: j$ M |
4 ^) P1 P3 `; h _ m5 c 记录的内容,一个字段一列(Detail) 3 Z8 T5 [# I! u" P% H% |* _+ m
|
2 k3 g0 O" x7 y! z 摘要(最后一页才有)(Summary) . T6 X- n# f W0 T0 S
| / g3 u# G; n" t# g4 _1 d
出现在所有页上的页脚(PageFooter)
2 w3 ]7 x- A1 a& n7 r, ?
. S8 ~0 J, t1 n# ? 这些根据设置不同的Band(不是控件,一种类型而已,在其上面可以放其他控件)来定位。总共有六种Band。
7 S7 r% m1 M: I三、 一个简单的例子 8 Q8 }; [5 K: |( H- f7 @& p8 N
这个例子制作打印一张表的部分字段名及该字段数据内容的报表。 8 [: C( k& N5 v% U! F
1. 建立一个新project
8 e# i8 m. }! X- ~9 L, Q5 K# Y1 T: b 2. 放一个TTable到Form上,DatabaseName设为BCDEMOS,TableName指向Customer表,Active设为true. 0 x' z: }2 T3 x C
3. 放一个TquickRep控件在Form上,DataSet属性为Table1.(即要显示上边Table1所指向的表的内)。 + W) Z5 d, D/ ^9 m2 J% s
4.展开TquickRep的Bands属性,设HasDetail为true,这时自动增加个detail band(一个TQRBand控件,故也可以直接放一个TQRBand控件,BandType属性设为detail就行了)。
1 D1 s% D) u: y, {! d: I3 t; r- k 5.放一个TQRDBText控件在detail band上面,设DataSet指向Table1,DataField指向Company。第四步是设置在报表的什么位置显示什么类型的数据,而TQRDBText则具体实现。 3 O/ I' W: I' @6 x: H% c- J
6.选TquickRep控件,按右键,选择”Preview”预览,应该看到表Customer的字段Company的所有字段值。
! u4 {& t3 s L, a6 t5 s" R! [1 Q" p( Q 到这一个简单的例子就OK了,程序实现预览及利用TQRuickRep自带的打印功能只须在Form中加一个按钮,它的OnClick事件为:QuickRep1-> review(); ( m2 o8 \; Q# r: U9 ~4 ^, _
四、 一个使用TQRGoups、TQRExpr控件的报表 0 z( G+ c; b+ F1 l+ a# G' A" q E
该报表先列出州名,接着列出该州的所有公司及公司总数,一个州列完后空一行(groups中断),列出新的州名,接着列新州下的所有公司,没有填州名的公司统一列在Unknown state下面。 ; m. X5 ? O) G- [, B9 R t
1. 建立一个新project。
9 Q7 R1 v R. E* v3 f9 r 2. 放一个Tquery在Tquickrep上,其SQL属性为:select * from customer order by State,Company;(即根据州、公司排序),DatabaseName为BCDMome,Active为true.
0 n! \6 x: @7 w. u) E8 E 3. 放一个TquickRep控件在Form1上,DataSet为Tquery1. 5 [+ `+ H' n* o9 g9 D& i
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(根据不同的州来中断)。 : ?9 t' T7 \/ o% f
5. 放一个TQRBand控件在报表上,BandType为rbDetail. : G% q" t' Y$ ^9 K* i. O, _
6.放一个TQRExpr控件在group header上面,其Expression属性为:if(State<>’’,State,’Unknown state’),即如果公司的州没填,就归入Unknown state,否则归入State. . `9 A. C$ r8 _$ w4 D2 E
7.放三个TQRDBText在Detail上,他们的DataSet都指向Query1,DataField分别指向Company,Contact,Phone.
, K' X+ W/ t1 k4 T- P 8.在放一个TQRExpr控件在group Footer上面,Expression为’Customers in’+State+’:’+Str(Count) 作用是在每个州的公司列完后显示该州总共有多少个公司。
% n3 `6 K* ^* ] 9.按右键选预览,应该看到不同的州名及其公司和公司公司总数。
8 ~+ e3 ]' V+ [) H五、QuickReport 条件式列印 : y, b0 b% A* j
可以直接在 TQuickReport 的 OnFilter 事件中写明条件判断,OnFilter事件的引数中有一个以 var 宣告的 PrintRecord 布林型态变数,将这个变数设为 True(预设值), 该笔记录便会印出;反之, 设为False,就不印出这笔记录.
1 p' d3 k( q6 ^ procedure TForm1.QuickReport1Filter(var PrintRecord: Boolean); 4 l" C+ z* a4 m( q
begin
( L1 F. G/ Z7 y( Z) ~ PrintRecord := False; ) o8 N b& C( e7 Y4 e, l3 @+ ] j
if YourTable.FieldByName('WantedField').AsInteger <= 100 then * }& L5 E4 x* ~
Exit; 0 [: W& a4 X& H: n3 ~
if YourTable.FieldByName('WantedField').AsInteger >= 150 then
6 R0 }6 P s, f2 d Exit;
8 y" D' s; S* d2 K. a3 w5 _4 H PrintRecord := True; 1 |# d' Q, j8 J0 d
|