数学建模社区-数学中国

标题: QuickReport基本知识 [打印本页]

作者: 韩冰    时间: 2005-1-26 12:33
标题: QuickReport基本知识

一、 简单了解各控件功能 8 H$ U/ m5 J3 b$ b 以下是各控件最简单的使用功能,其他功能依具体的实现而介绍。 8 t% M, |4 W8 ^2 |, M# Q: j 1. TquickRep:带有坐标,作为其他报表控件(如TQRBand)的容器,它的Band属性可以自动添加各种类型的TQRBand. % U# Z6 o8 `9 V# s' h 2. TQRLabel:打印静态的文本(即不是根据数据库值来改变的),作用象Tlabel , Caption的内容就打印出来的内容。 3 M6 c9 H# T; O. K; X 3. TQRDBText:打印数据库字段值,一个值一行。作用象TDBText.把它的DataSet , DataField分别赋予Table1,Company时,将打印Table1所指向的表的Company字段的内容。 ) T+ x+ v* }" t' T; N 4. TQRSysData:打印系统信息如时间,页码,报表头等。 5 z. r7 Y i: k 5. TQRMem非常象TQRLabel,只是它可以打印多行,也是打印静态数据。 3 \4 _) i" C7 x1 \* l0 ` 6. TQRRichText:打印RichText格式,能够连接到一个Form上的RichEdit控件并打印它的内容,不过必须是32位版本的。 , b' J: i+ O1 T( n% s) a: _4 U8 A& d 7. TQRShape:打印方框、圆和垂直、水平线。 & B# m) f: C) Y: t0 @ 8. TQRImage:打印静态的图片,包括(BMP,WMF,ICON). ) E7 U4 c2 f0 _* u 9. TQRDBImage:从数据库接收图片。 ( W S! H& ]: v/ s \, u2 `, `$ Q 10. TQRBand:用来确定报表的不同位置应该显示什么内容,它上面可以放控件(参见二)。 . Y1 `* _! |# S0 K' G2 D3 l 11.TQRGoups:Groups可以不限级别的组操作。当你连接了几个datasets到报表时可以通过Groups成组的对dataset进行操作。

3 Z$ f& x, u3 j7 V9 a' ?9 W' X

二、 报表的控件摆放循序

( s/ A, E. x. @: N- s9 [+ v1 K

出现在所有页上的标题(PageHeader) 0 u5 T- c7 f& d- `* h* r) u! K) p- W ^8 ]$ ] | & b& K6 ^# b- `% `& z 标题(只有首页才有)(Title) $ I* _: n0 E2 @ | 9 A2 O" ?% k* s+ \6 w 所有列的标题(ColumnHeader) ^+ W; B! X* [! ^* @ | ' D! P% n$ |6 F9 q7 e2 e" D 记录的内容,一个字段一列(Detail) 7 @; {' r1 |0 y. S; u8 B+ w9 a | `7 W4 B8 }+ E5 K- w& \; }$ v 摘要(最后一页才有)(Summary) $ F- S- `7 R& b) Y9 @ | ; e9 z: \/ g1 i4 \ 出现在所有页上的页脚(PageFooter) + f( o2 G9 z* d( S& S- S m* V" ^ # r( z! H6 | @9 K" \% w6 H8 f 这些根据设置不同的Band(不是控件,一种类型而已,在其上面可以放其他控件)来定位。总共有六种Band。

3 {* P! [) I Y) V( t0 t1 {3 [

三、 一个简单的例子 # A* N) C' H O5 x8 N4 z7 e( X- O$ K 这个例子制作打印一张表的部分字段名及该字段数据内容的报表。 , T+ z% d: e& O0 n0 ~) o0 P4 k 1. 建立一个新project ; c! @- ^3 d1 I8 p3 U 2. 放一个TTable到Form上,DatabaseName设为BCDEMOS,TableName指向Customer表,Active设为true. & @ u8 V2 a4 z- W; g1 j 3. 放一个TquickRep控件在Form上,DataSet属性为Table1.(即要显示上边Table1所指向的表的内)。 4 B C! p" v4 u( v3 B; B/ v* d2 w+ K0 T 4.展开TquickRep的Bands属性,设HasDetail为true,这时自动增加个detail band(一个TQRBand控件,故也可以直接放一个TQRBand控件,BandType属性设为detail就行了)。 t2 T6 \6 d5 q6 t- X, Q0 M" T 5.放一个TQRDBText控件在detail band上面,设DataSet指向Table1,DataField指向Company。第四步是设置在报表的什么位置显示什么类型的数据,而TQRDBText则具体实现。 T L/ s1 l: h0 R; H 6.选TquickRep控件,按右键,选择”Preview”预览,应该看到表Customer的字段Company的所有字段值。 " @* ^+ G/ o! L1 |* y0 h& w 到这一个简单的例子就OK了,程序实现预览及利用TQRuickRep自带的打印功能只须在Form中加一个按钮,它的OnClick事件为:QuickRep1->review();

1 C; r( n2 T1 @( w8 @2 B

四、 一个使用TQRGoups、TQRExpr控件的报表 7 l. k' ]" x. {- M 该报表先列出州名,接着列出该州的所有公司及公司总数,一个州列完后空一行(groups中断),列出新的州名,接着列新州下的所有公司,没有填州名的公司统一列在Unknown state下面。 - V: H/ A8 O: ? O- h; f 1. 建立一个新project。 + o9 M/ s. ?- ] 2. 放一个Tquery在Tquickrep上,其SQL属性为:select * from customer order by State,Company;(即根据州、公司排序),DatabaseName为BCDMome,Active为true. 9 Y' Z: \7 D3 A2 Y+ R 3. 放一个TquickRep控件在Form1上,DataSet为Tquery1. : k, V: J! Z! J. k$ l 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(根据不同的州来中断)。 % l( e" ]6 f! g3 m7 T3 J/ h 5. 放一个TQRBand控件在报表上,BandType为rbDetail. 0 q, ~+ q" J5 `9 }, g 6.放一个TQRExpr控件在group header上面,其Expression属性为:if(State<>’’,State,’Unknown state’),即如果公司的州没填,就归入Unknown state,否则归入State. 6 \, F: b) D5 ]' D 7.放三个TQRDBText在Detail上,他们的DataSet都指向Query1,DataField分别指向Company,Contact,Phone. ' z! {3 l- C4 t% U& \ 8.在放一个TQRExpr控件在group Footer上面,Expression为’Customers in’+State+’:’+Str(Count) 作用是在每个州的公司列完后显示该州总共有多少个公司。 " x+ V5 V6 I$ n" `: b. w' f4 G6 z 9.按右键选预览,应该看到不同的州名及其公司和公司公司总数。

7 Y- c3 S' M! M8 x

五、QuickReport 条件式列印 3 X( e" c; W* v! _ 可以直接在 TQuickReport 的 OnFilter 事件中写明条件判断,OnFilter事件的引数中有一个以 var 宣告的 PrintRecord 布林型态变数,将这个变数设为 True(预设值), 该笔记录便会印出;反之, 设为False,就不印出这笔记录. & T6 S' G4 Z! _! y& B' ]7 y procedure TForm1.QuickReport1Filter(var PrintRecord: Boolean); 0 k6 u. G2 v }. k) b: G begin # W5 D! {& c; A; o' _/ [ PrintRecord := False; 1 _. ]. }/ S% P- ^7 o; O, {- i& { if YourTable.FieldByName('WantedField').AsInteger <= 100 then 4 c6 S/ J$ g! d, e- Z( ]) Y8 F+ E8 e Exit; & s' G; y( w5 |+ T( A7 A if YourTable.FieldByName('WantedField').AsInteger >= 150 then 4 D" E. k$ w* Q O* z& t) I Exit; 7 _6 V- P0 k# H. y PrintRecord := True; % _9 \9 ^4 S% x- F) Q






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5