|
一、 简单了解各控件功能
7 F: s9 G* [6 U3 R6 J 以下是各控件最简单的使用功能,其他功能依具体的实现而介绍。 " j: Z# W y0 y% v ^ `
1. TquickRep:带有坐标,作为其他报表控件(如TQRBand)的容器,它的Band属性可以自动添加各种类型的TQRBand.
7 d3 x: G1 G! W. `7 F# I' [, Y 2. TQRLabel:打印静态的文本(即不是根据数据库值来改变的),作用象Tlabel , Caption的内容就打印出来的内容。
4 J8 ~% k* f% y" C; }2 f U) l 3. TQRDBText:打印数据库字段值,一个值一行。作用象TDBText.把它的DataSet , DataField分别赋予Table1,Company时,将打印Table1所指向的表的Company字段的内容。
& L: m8 Y: q* u# j 4. TQRSysData:打印系统信息如时间,页码,报表头等。 3 b/ Z: V* n+ O; v" P3 \; }; j
5. TQRMem非常象TQRLabel,只是它可以打印多行,也是打印静态数据。
0 D; |4 Z" d8 y. g( x9 q, ? 6. TQRRichText:打印RichText格式,能够连接到一个Form上的RichEdit控件并打印它的内容,不过必须是32位版本的。
t. o+ g1 D9 ^: @5 L' \2 c; ?0 E 7. TQRShape:打印方框、圆和垂直、水平线。 # `4 [6 ]6 S% E: _! h
8. TQRImage:打印静态的图片,包括(BMP,WMF,ICON). - R/ h' J9 `; M* H% k8 W
9. TQRDBImage:从数据库接收图片。 / r! V/ X' Z! i' @" P, i
10. TQRBand:用来确定报表的不同位置应该显示什么内容,它上面可以放控件(参见二)。 4 b% m, \. @. L8 g
11.TQRGoups:Groups可以不限级别的组操作。当你连接了几个datasets到报表时可以通过Groups成组的对dataset进行操作。
) r) `5 |, {8 U. G) C" u二、 报表的控件摆放循序
m7 H% C& U2 {& v 出现在所有页上的标题(PageHeader) % [9 U; `# R" \7 _! Q' J+ d, n
|
3 ~. a% m% H& X 标题(只有首页才有)(Title)
8 n6 r3 |, Y4 U% W. P |
" t w* t% N6 K# B, f 所有列的标题(ColumnHeader)
7 M/ t1 i2 i# i' W" E |
9 I& z+ m( l5 K# J 记录的内容,一个字段一列(Detail)
: Z0 p, r8 W+ s8 K1 |4 [6 E | 1 s4 [( H* ~% b& E# A1 g' v3 ~
摘要(最后一页才有)(Summary) & I% P* K3 j4 p
| ; t% j3 U% k- [& v+ ]0 B; |
出现在所有页上的页脚(PageFooter) 3 p1 t: d9 w/ {5 S- ^$ f
/ {" _, L8 f$ x6 C9 a2 V2 C( T; T 这些根据设置不同的Band(不是控件,一种类型而已,在其上面可以放其他控件)来定位。总共有六种Band。
$ a) c, j7 ^. Q三、 一个简单的例子 ! o! o. P/ ?5 V; {4 M8 [) K
这个例子制作打印一张表的部分字段名及该字段数据内容的报表。
$ O6 G% k6 }& A2 K. m 1. 建立一个新project
$ X: T% S- b2 x' O7 Z$ @ 2. 放一个TTable到Form上,DatabaseName设为BCDEMOS,TableName指向Customer表,Active设为true. " j* S; a3 ?* i' w7 r2 A* s$ u( Q
3. 放一个TquickRep控件在Form上,DataSet属性为Table1.(即要显示上边Table1所指向的表的内)。
( F( V' B4 \1 `9 C$ b) R4 J 4.展开TquickRep的Bands属性,设HasDetail为true,这时自动增加个detail band(一个TQRBand控件,故也可以直接放一个TQRBand控件,BandType属性设为detail就行了)。 ' F* w& e% j8 C5 }
5.放一个TQRDBText控件在detail band上面,设DataSet指向Table1,DataField指向Company。第四步是设置在报表的什么位置显示什么类型的数据,而TQRDBText则具体实现。 " d- I& K0 ~9 u# L4 }
6.选TquickRep控件,按右键,选择”Preview”预览,应该看到表Customer的字段Company的所有字段值。 4 b4 U3 ?$ m0 _% ^- S/ Z8 I( @$ ^
到这一个简单的例子就OK了,程序实现预览及利用TQRuickRep自带的打印功能只须在Form中加一个按钮,它的OnClick事件为:QuickRep1-> review();
# [6 |- \3 b* d. r1 P四、 一个使用TQRGoups、TQRExpr控件的报表
. h: g+ V% a( c* t( P% u: M& _ 该报表先列出州名,接着列出该州的所有公司及公司总数,一个州列完后空一行(groups中断),列出新的州名,接着列新州下的所有公司,没有填州名的公司统一列在Unknown state下面。 ' T" i* e3 q% V, H2 n; ^
1. 建立一个新project。
9 }, d0 D4 o4 K 2. 放一个Tquery在Tquickrep上,其SQL属性为:select * from customer order by State,Company;(即根据州、公司排序),DatabaseName为BCDMome,Active为true.
3 y+ B7 ]0 Y% j# j2 E2 m 3. 放一个TquickRep控件在Form1上,DataSet为Tquery1. ) f% g5 I4 K# D
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(根据不同的州来中断)。 7 Q+ N# u: k' F6 c) @! u b, {
5. 放一个TQRBand控件在报表上,BandType为rbDetail.
: w, L2 x3 N; y 6.放一个TQRExpr控件在group header上面,其Expression属性为:if(State<>’’,State,’Unknown state’),即如果公司的州没填,就归入Unknown state,否则归入State.
4 s9 F; ?' o( }8 i7 } 7.放三个TQRDBText在Detail上,他们的DataSet都指向Query1,DataField分别指向Company,Contact,Phone.
0 Z# p( B- M# s# d! U' ~& e$ w8 Q 8.在放一个TQRExpr控件在group Footer上面,Expression为’Customers in’+State+’:’+Str(Count) 作用是在每个州的公司列完后显示该州总共有多少个公司。
$ U/ k5 j# \* \ r! }. [% {! m! X 9.按右键选预览,应该看到不同的州名及其公司和公司公司总数。
: n' ]/ l6 W. D% u' S1 u$ s* G4 w五、QuickReport 条件式列印 9 n6 B4 z! y) y# U; J e* B! ~
可以直接在 TQuickReport 的 OnFilter 事件中写明条件判断,OnFilter事件的引数中有一个以 var 宣告的 PrintRecord 布林型态变数,将这个变数设为 True(预设值), 该笔记录便会印出;反之, 设为False,就不印出这笔记录. 2 p/ Z( v# ^8 x+ @
procedure TForm1.QuickReport1Filter(var PrintRecord: Boolean); ( ?2 s2 _0 k1 a+ \. Z8 d
begin
9 d# U5 T1 k5 q8 Q- V4 X2 T PrintRecord := False; ( a2 R" x$ [4 X5 ]5 \
if YourTable.FieldByName('WantedField').AsInteger <= 100 then ) i% O' G. f( O- q' h+ i
Exit; / Q& f# E; a* y
if YourTable.FieldByName('WantedField').AsInteger >= 150 then : x1 P" }- S3 T/ `
Exit; . Z$ {3 @# p- k
PrintRecord := True; ' D: u. }7 ~$ ?4 l
|