数学建模社区-数学中国

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

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

一、 简单了解各控件功能 0 q% X$ g5 e/ o G! t. O2 O3 p0 S 以下是各控件最简单的使用功能,其他功能依具体的实现而介绍。 6 S& `. ~3 z9 i( k' d 1. TquickRep:带有坐标,作为其他报表控件(如TQRBand)的容器,它的Band属性可以自动添加各种类型的TQRBand. ) N8 M( A8 v+ F4 ~$ T+ N 2. TQRLabel:打印静态的文本(即不是根据数据库值来改变的),作用象Tlabel , Caption的内容就打印出来的内容。 ) S9 u* y+ v N! d0 K 3. TQRDBText:打印数据库字段值,一个值一行。作用象TDBText.把它的DataSet , DataField分别赋予Table1,Company时,将打印Table1所指向的表的Company字段的内容。 ) V" N: |4 k; U# k8 f 4. TQRSysData:打印系统信息如时间,页码,报表头等。 1 I9 d/ V+ W( k! i1 t 5. TQRMem非常象TQRLabel,只是它可以打印多行,也是打印静态数据。 . A7 v: U0 L; ^ 6. TQRRichText:打印RichText格式,能够连接到一个Form上的RichEdit控件并打印它的内容,不过必须是32位版本的。 ( w$ c( g' E2 ]1 w2 u8 D$ v& @, O 7. TQRShape:打印方框、圆和垂直、水平线。 5 n; A9 @. a' L! `7 ^& o 8. TQRImage:打印静态的图片,包括(BMP,WMF,ICON). 4 j9 M! a2 i5 S 9. TQRDBImage:从数据库接收图片。 ' v& r, d1 Q, Y# j; O 10. TQRBand:用来确定报表的不同位置应该显示什么内容,它上面可以放控件(参见二)。 5 N o8 P: ~2 r; n' Y# S 11.TQRGoups:Groups可以不限级别的组操作。当你连接了几个datasets到报表时可以通过Groups成组的对dataset进行操作。

1 D7 I. _# m; p0 v9 f

二、 报表的控件摆放循序

l3 L0 ^$ k8 R" n" N+ `% U

出现在所有页上的标题(PageHeader) 2 n" o* G. {0 i% g | / K3 ^+ M+ e1 F3 ~' Y4 P6 n 标题(只有首页才有)(Title) + p# h3 p% ~9 s; U3 j# ? | 7 i5 r$ G1 r5 a( k7 }# L 所有列的标题(ColumnHeader) ( p: F( O0 W7 H$ v/ ]( b" K | H* t2 |' W2 d) s* z; ` 记录的内容,一个字段一列(Detail) ; ]( u& f- p; k1 B* P | - b- d! A+ M* O9 L8 l. c/ c9 ]7 m 摘要(最后一页才有)(Summary) 1 T+ S& O7 E( M; d6 j4 \4 N | ; `! l* x1 k- G: m) c0 A7 ^. D 出现在所有页上的页脚(PageFooter) + _2 b( x2 k0 i6 X+ f) h / x6 ]$ ]3 n+ E' C& n. l 这些根据设置不同的Band(不是控件,一种类型而已,在其上面可以放其他控件)来定位。总共有六种Band。

8 @* o# H( F: a# M9 V- N

三、 一个简单的例子 3 C, ?! o8 L. P, [5 X! f 这个例子制作打印一张表的部分字段名及该字段数据内容的报表。 7 D) }. N7 Q# }: O) Y1 w* [ 1. 建立一个新project 4 A; X7 j% w4 g t7 _: W2 y7 [- Y6 n 2. 放一个TTable到Form上,DatabaseName设为BCDEMOS,TableName指向Customer表,Active设为true. : m% v! B" Z3 Z' [( [ 3. 放一个TquickRep控件在Form上,DataSet属性为Table1.(即要显示上边Table1所指向的表的内)。 - j* Z2 o8 x. i9 y$ l# `+ ] 4.展开TquickRep的Bands属性,设HasDetail为true,这时自动增加个detail band(一个TQRBand控件,故也可以直接放一个TQRBand控件,BandType属性设为detail就行了)。 2 \; c7 m5 X6 `- }$ p 5.放一个TQRDBText控件在detail band上面,设DataSet指向Table1,DataField指向Company。第四步是设置在报表的什么位置显示什么类型的数据,而TQRDBText则具体实现。 Z5 m% _# l6 u1 M0 P/ [ 6.选TquickRep控件,按右键,选择”Preview”预览,应该看到表Customer的字段Company的所有字段值。 7 y' u I& o% ^: g9 n7 ] 到这一个简单的例子就OK了,程序实现预览及利用TQRuickRep自带的打印功能只须在Form中加一个按钮,它的OnClick事件为:QuickRep1->review();

3 g$ T% h# R T @

四、 一个使用TQRGoups、TQRExpr控件的报表 5 b6 P J. }# j: [* ?+ ?) b 该报表先列出州名,接着列出该州的所有公司及公司总数,一个州列完后空一行(groups中断),列出新的州名,接着列新州下的所有公司,没有填州名的公司统一列在Unknown state下面。 + T8 v+ K2 u3 @7 x, V7 L) p 1. 建立一个新project。 7 \( r, ^0 ]7 K$ ]% F" r( } 2. 放一个Tquery在Tquickrep上,其SQL属性为:select * from customer order by State,Company;(即根据州、公司排序),DatabaseName为BCDMome,Active为true. / u. Y2 w% l: o9 ?2 Z 3. 放一个TquickRep控件在Form1上,DataSet为Tquery1. + D! K+ Y* a- o) u; f 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(根据不同的州来中断)。 + v( h. J7 b( y 5. 放一个TQRBand控件在报表上,BandType为rbDetail. , E0 J' R. T' ^7 K- d 6.放一个TQRExpr控件在group header上面,其Expression属性为:if(State<>’’,State,’Unknown state’),即如果公司的州没填,就归入Unknown state,否则归入State. , t5 `( Y( l$ w# B& i 7.放三个TQRDBText在Detail上,他们的DataSet都指向Query1,DataField分别指向Company,Contact,Phone. - q5 h" |# Y8 L0 s 8.在放一个TQRExpr控件在group Footer上面,Expression为’Customers in’+State+’:’+Str(Count) 作用是在每个州的公司列完后显示该州总共有多少个公司。 7 ?* j: Q1 s5 L) B& c 9.按右键选预览,应该看到不同的州名及其公司和公司公司总数。

+ `1 f8 R, s5 ~" {

五、QuickReport 条件式列印 8 u3 y+ k! |# G9 U; I 可以直接在 TQuickReport 的 OnFilter 事件中写明条件判断,OnFilter事件的引数中有一个以 var 宣告的 PrintRecord 布林型态变数,将这个变数设为 True(预设值), 该笔记录便会印出;反之, 设为False,就不印出这笔记录. . Y. r: D, |4 A4 n/ l* F procedure TForm1.QuickReport1Filter(var PrintRecord: Boolean); 0 a( u' @# `% |1 X. [ begin ; Y9 |- ]7 M5 b" g PrintRecord := False; * G5 V# n9 I6 O. U; s' M6 n if YourTable.FieldByName('WantedField').AsInteger <= 100 then . v$ z' s+ r2 G* f0 a& w Exit; - ?4 a1 F% @' g7 ]+ P if YourTable.FieldByName('WantedField').AsInteger >= 150 then 3 s1 l# a7 {7 _" V" N Exit; / x5 O, T4 k- e PrintRecord := True; 2 c/ |: {7 z; h6 E. b$ y0 \0 I






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