|
一、 简单了解各控件功能
5 L m9 h9 D2 n/ O' t 以下是各控件最简单的使用功能,其他功能依具体的实现而介绍。
' M, F+ H+ _" L/ F H2 ]3 @ 1. TquickRep:带有坐标,作为其他报表控件(如TQRBand)的容器,它的Band属性可以自动添加各种类型的TQRBand.
9 t V I$ }' y 2. TQRLabel:打印静态的文本(即不是根据数据库值来改变的),作用象Tlabel , Caption的内容就打印出来的内容。 1 S( q, M' R" M4 Z- Z8 W
3. TQRDBText:打印数据库字段值,一个值一行。作用象TDBText.把它的DataSet , DataField分别赋予Table1,Company时,将打印Table1所指向的表的Company字段的内容。 & V, F1 \% [% `: [
4. TQRSysData:打印系统信息如时间,页码,报表头等。 : ^' I1 Q3 k0 }4 f* Z
5. TQRMem非常象TQRLabel,只是它可以打印多行,也是打印静态数据。 / W5 @- K& u8 F: d( \
6. TQRRichText:打印RichText格式,能够连接到一个Form上的RichEdit控件并打印它的内容,不过必须是32位版本的。
" R2 Z, u6 `2 _5 h% z 7. TQRShape:打印方框、圆和垂直、水平线。 P9 A& M2 K: ?: ?
8. TQRImage:打印静态的图片,包括(BMP,WMF,ICON). % b5 j7 b$ [. a
9. TQRDBImage:从数据库接收图片。
$ ]" J+ {7 j, k 10. TQRBand:用来确定报表的不同位置应该显示什么内容,它上面可以放控件(参见二)。 $ j" V& S4 a8 K( p
11.TQRGoups:Groups可以不限级别的组操作。当你连接了几个datasets到报表时可以通过Groups成组的对dataset进行操作。
2 p$ ^& i3 l/ {4 ^二、 报表的控件摆放循序
( \) _4 d- k* C4 E+ G4 G 出现在所有页上的标题(PageHeader)
( _9 o2 z) r- L i+ O | 5 j l/ R; }0 c6 b }
标题(只有首页才有)(Title) 1 I; W3 I! C* Y/ z" U$ D
| 1 D& D1 ~3 k# s
所有列的标题(ColumnHeader) 7 j0 c0 g2 O8 ^
|
$ L+ x. S/ T% A) _2 {( y7 \( j 记录的内容,一个字段一列(Detail) 8 h' _" J! R* J, t* r0 O0 V( n% j
| % v% g7 O4 a, _7 Z, ]5 r) |- V
摘要(最后一页才有)(Summary) * Z6 T7 t! }" U' c. f
|
3 d: @0 Z" V% x* w% d 出现在所有页上的页脚(PageFooter) : H4 C3 p( p& K9 J* r
: \2 a( s, Z, y% |/ _7 V% J
这些根据设置不同的Band(不是控件,一种类型而已,在其上面可以放其他控件)来定位。总共有六种Band。
/ }' k2 m& F$ |2 A4 i- ]三、 一个简单的例子 5 T' y: o2 Y2 K4 H9 n7 _
这个例子制作打印一张表的部分字段名及该字段数据内容的报表。
4 ~1 y7 m3 S( S+ Q y 1. 建立一个新project
) N4 ]% h' v7 B$ [2 e 2. 放一个TTable到Form上,DatabaseName设为BCDEMOS,TableName指向Customer表,Active设为true.
* |8 v" j$ B7 \& x5 E8 S# h 3. 放一个TquickRep控件在Form上,DataSet属性为Table1.(即要显示上边Table1所指向的表的内)。
. K& v* C: p* @6 b5 t 4.展开TquickRep的Bands属性,设HasDetail为true,这时自动增加个detail band(一个TQRBand控件,故也可以直接放一个TQRBand控件,BandType属性设为detail就行了)。 ) g: x. P, z! y) O) u( ~: U
5.放一个TQRDBText控件在detail band上面,设DataSet指向Table1,DataField指向Company。第四步是设置在报表的什么位置显示什么类型的数据,而TQRDBText则具体实现。 & `1 d+ i! z' x8 c
6.选TquickRep控件,按右键,选择”Preview”预览,应该看到表Customer的字段Company的所有字段值。
U8 Y4 V: { Y6 `) }% B. k: `3 L 到这一个简单的例子就OK了,程序实现预览及利用TQRuickRep自带的打印功能只须在Form中加一个按钮,它的OnClick事件为:QuickRep1-> review();
) [: ~$ h4 ~/ N# i7 ~四、 一个使用TQRGoups、TQRExpr控件的报表
! m: d: m# S7 I s- P 该报表先列出州名,接着列出该州的所有公司及公司总数,一个州列完后空一行(groups中断),列出新的州名,接着列新州下的所有公司,没有填州名的公司统一列在Unknown state下面。 9 P% ]( T% L' D
1. 建立一个新project。 * ~' Y6 N" p% F2 E# K
2. 放一个Tquery在Tquickrep上,其SQL属性为:select * from customer order by State,Company;(即根据州、公司排序),DatabaseName为BCDMome,Active为true.
. |! M6 R O' Y7 R6 ?# x/ i3 H# e 3. 放一个TquickRep控件在Form1上,DataSet为Tquery1. , w5 f8 @; i( T. X, F, m
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(根据不同的州来中断)。
6 ~% l, S# c: t% u% n: Z 5. 放一个TQRBand控件在报表上,BandType为rbDetail. : d: \3 Q3 _# }- V \9 J+ ?1 x& ]# b
6.放一个TQRExpr控件在group header上面,其Expression属性为:if(State<>’’,State,’Unknown state’),即如果公司的州没填,就归入Unknown state,否则归入State. * l- Q! A- r6 P4 S
7.放三个TQRDBText在Detail上,他们的DataSet都指向Query1,DataField分别指向Company,Contact,Phone.
0 p" g" t# t! q! ?/ n 8.在放一个TQRExpr控件在group Footer上面,Expression为’Customers in’+State+’:’+Str(Count) 作用是在每个州的公司列完后显示该州总共有多少个公司。
. w* r2 ]0 w. p+ q3 n% ~ 9.按右键选预览,应该看到不同的州名及其公司和公司公司总数。
2 b* v2 d, z k- P" x" U五、QuickReport 条件式列印
4 Z8 m3 a7 k' x7 l6 c0 x6 [ 可以直接在 TQuickReport 的 OnFilter 事件中写明条件判断,OnFilter事件的引数中有一个以 var 宣告的 PrintRecord 布林型态变数,将这个变数设为 True(预设值), 该笔记录便会印出;反之, 设为False,就不印出这笔记录.
3 @7 s# c! u' C: k6 G8 j procedure TForm1.QuickReport1Filter(var PrintRecord: Boolean); ( e2 a- d0 I, D S1 m9 U* R7 Z
begin 4 }" y+ v: [ [0 J$ I' E, c4 L
PrintRecord := False;
* S' j: ]3 e6 G* | if YourTable.FieldByName('WantedField').AsInteger <= 100 then
1 Q+ }( M; r+ h Exit;
6 q2 Q( D# M+ U! A7 H* W if YourTable.FieldByName('WantedField').AsInteger >= 150 then 7 m p8 M$ G- ~* F m
Exit; ; W9 R- x8 i ?0 {, Z' S0 V
PrintRecord := True; * E& Y" a% t( {1 {) ~ }% |
|