|
一、 简单了解各控件功能
* f. D# `" f. l9 q' X5 _ 以下是各控件最简单的使用功能,其他功能依具体的实现而介绍。 2 s5 d: Q& q" T4 _4 U8 _( e+ g
1. TquickRep:带有坐标,作为其他报表控件(如TQRBand)的容器,它的Band属性可以自动添加各种类型的TQRBand. 1 |0 j' K8 Q/ a M* r
2. TQRLabel:打印静态的文本(即不是根据数据库值来改变的),作用象Tlabel , Caption的内容就打印出来的内容。 5 K+ p( N- G, h/ @& Z) q( Y
3. TQRDBText:打印数据库字段值,一个值一行。作用象TDBText.把它的DataSet , DataField分别赋予Table1,Company时,将打印Table1所指向的表的Company字段的内容。 + g9 c# l* c# W6 G# K$ ^7 n$ J
4. TQRSysData:打印系统信息如时间,页码,报表头等。
3 ~0 d' @' X: v* A 5. TQRMem非常象TQRLabel,只是它可以打印多行,也是打印静态数据。 3 l3 t/ _. k7 h5 B7 e- B
6. TQRRichText:打印RichText格式,能够连接到一个Form上的RichEdit控件并打印它的内容,不过必须是32位版本的。
3 Q1 }) y: x6 K+ C. n Z+ P 7. TQRShape:打印方框、圆和垂直、水平线。
$ ]6 z: `& k3 H3 n' i' S$ A2 w 8. TQRImage:打印静态的图片,包括(BMP,WMF,ICON). + q+ W" n$ o; i' P& ^0 A
9. TQRDBImage:从数据库接收图片。
& ~; T( p1 b0 o 10. TQRBand:用来确定报表的不同位置应该显示什么内容,它上面可以放控件(参见二)。 / b( [7 v9 f8 c3 W9 g; F& _
11.TQRGoups:Groups可以不限级别的组操作。当你连接了几个datasets到报表时可以通过Groups成组的对dataset进行操作。 7 d* _# Q3 [: m; M# s9 K8 k
二、 报表的控件摆放循序 : m' k" c: m& u8 S. Y# d/ u( g
出现在所有页上的标题(PageHeader) 1 F' R" p1 `6 S8 F! |7 b
|
' S# c: p, @, A4 ] 标题(只有首页才有)(Title)
& S- E( B! u( w5 c5 |8 a6 r' p9 { |
+ n# X! l" c5 R 所有列的标题(ColumnHeader) $ _; i5 A, Q/ I2 P- s
|
/ r j9 d0 ?$ D$ p4 j 记录的内容,一个字段一列(Detail)
1 q; s% j9 |6 x3 M8 G: e |
+ o }* f7 u0 b, M) ^- y" g" _2 R9 p 摘要(最后一页才有)(Summary)
! P" M0 B# w3 S7 J4 R3 F) n |
3 b: v; _1 F6 ^$ u% K 出现在所有页上的页脚(PageFooter)
& `0 w- r- K/ ?& y! T; ]
5 b; b3 U( [2 b. G 这些根据设置不同的Band(不是控件,一种类型而已,在其上面可以放其他控件)来定位。总共有六种Band。
% h S9 H' ~* U+ c+ f* J三、 一个简单的例子
: A3 v/ |' q1 z 这个例子制作打印一张表的部分字段名及该字段数据内容的报表。
" w5 t4 ~0 ^! I 1. 建立一个新project # O/ G" {: @8 b" ~* W
2. 放一个TTable到Form上,DatabaseName设为BCDEMOS,TableName指向Customer表,Active设为true.
$ R+ W! O, x* D r I$ s 3. 放一个TquickRep控件在Form上,DataSet属性为Table1.(即要显示上边Table1所指向的表的内)。
& c+ Q$ d o3 j' r 4.展开TquickRep的Bands属性,设HasDetail为true,这时自动增加个detail band(一个TQRBand控件,故也可以直接放一个TQRBand控件,BandType属性设为detail就行了)。
9 U* p" Z! p; L7 ]9 R' x 5.放一个TQRDBText控件在detail band上面,设DataSet指向Table1,DataField指向Company。第四步是设置在报表的什么位置显示什么类型的数据,而TQRDBText则具体实现。 7 ~* ?! e. r! e7 j/ p) \
6.选TquickRep控件,按右键,选择”Preview”预览,应该看到表Customer的字段Company的所有字段值。 $ X n+ x3 q: o+ ~* a# }
到这一个简单的例子就OK了,程序实现预览及利用TQRuickRep自带的打印功能只须在Form中加一个按钮,它的OnClick事件为:QuickRep1-> review();
/ E* z* P4 a! t% o四、 一个使用TQRGoups、TQRExpr控件的报表
( |" Y) W1 g0 w: p 该报表先列出州名,接着列出该州的所有公司及公司总数,一个州列完后空一行(groups中断),列出新的州名,接着列新州下的所有公司,没有填州名的公司统一列在Unknown state下面。
7 u6 W: o I5 X: H; d0 i- P 1. 建立一个新project。 / `+ p l/ w, {8 R/ m8 ?
2. 放一个Tquery在Tquickrep上,其SQL属性为:select * from customer order by State,Company;(即根据州、公司排序),DatabaseName为BCDMome,Active为true. ( H& @3 G8 g$ c0 q$ o4 W
3. 放一个TquickRep控件在Form1上,DataSet为Tquery1. $ y' y; Y) |5 R' O0 Q* _
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(根据不同的州来中断)。 + y9 s1 Z" J& ]/ v
5. 放一个TQRBand控件在报表上,BandType为rbDetail.
/ J, V, x, P; i2 C9 E 6.放一个TQRExpr控件在group header上面,其Expression属性为:if(State<>’’,State,’Unknown state’),即如果公司的州没填,就归入Unknown state,否则归入State.
( @$ F$ p5 T: U, `) _8 M% T) `9 { 7.放三个TQRDBText在Detail上,他们的DataSet都指向Query1,DataField分别指向Company,Contact,Phone.
$ ^' w) z2 k! J. L0 l 8.在放一个TQRExpr控件在group Footer上面,Expression为’Customers in’+State+’:’+Str(Count) 作用是在每个州的公司列完后显示该州总共有多少个公司。 ) g8 d; G n. E7 B$ u* o
9.按右键选预览,应该看到不同的州名及其公司和公司公司总数。 - {0 d% X3 v5 @% `
五、QuickReport 条件式列印
: e k3 h0 }# _9 }; V# e3 L 可以直接在 TQuickReport 的 OnFilter 事件中写明条件判断,OnFilter事件的引数中有一个以 var 宣告的 PrintRecord 布林型态变数,将这个变数设为 True(预设值), 该笔记录便会印出;反之, 设为False,就不印出这笔记录.
7 I6 Q7 s6 u6 f/ x2 D6 E/ b procedure TForm1.QuickReport1Filter(var PrintRecord: Boolean); 8 P3 M4 A" x$ {1 V, b
begin # B8 u5 T1 a7 Q! h$ ?
PrintRecord := False; ! i% H" D4 D' S4 k8 `
if YourTable.FieldByName('WantedField').AsInteger <= 100 then
5 ^* @4 c/ F3 ^3 K# n# o Exit;
* Z( @# i4 b* G if YourTable.FieldByName('WantedField').AsInteger >= 150 then
1 b0 a5 ]. v, j( Q% | Exit;
" l7 ~# R0 S% V$ A, _( Z PrintRecord := True; 5 r) ?$ P: x2 {# B9 {4 o' u
|