|
一、 简单了解各控件功能 8 D4 J- |4 h! v0 T
以下是各控件最简单的使用功能,其他功能依具体的实现而介绍。
. Y9 d. d/ e! S4 V% E- A @ 1. TquickRep:带有坐标,作为其他报表控件(如TQRBand)的容器,它的Band属性可以自动添加各种类型的TQRBand.
C& r, ]! n3 R' X5 ] 2. TQRLabel:打印静态的文本(即不是根据数据库值来改变的),作用象Tlabel , Caption的内容就打印出来的内容。
u4 V" a2 _- s; n' W 3. TQRDBText:打印数据库字段值,一个值一行。作用象TDBText.把它的DataSet , DataField分别赋予Table1,Company时,将打印Table1所指向的表的Company字段的内容。
: S) c; l n9 n- M z 4. TQRSysData:打印系统信息如时间,页码,报表头等。 1 [. M! W( {! y+ q+ G1 E) H
5. TQRMem非常象TQRLabel,只是它可以打印多行,也是打印静态数据。 , ]4 ~& V' v. U, j; L+ a
6. TQRRichText:打印RichText格式,能够连接到一个Form上的RichEdit控件并打印它的内容,不过必须是32位版本的。
`* |" {( P# W8 P! ?& X 7. TQRShape:打印方框、圆和垂直、水平线。 8 b/ E0 p' u4 o; S% g$ h0 d
8. TQRImage:打印静态的图片,包括(BMP,WMF,ICON). " [$ K0 z q6 D
9. TQRDBImage:从数据库接收图片。 ! n1 U1 u* u, C; u. W$ j- V
10. TQRBand:用来确定报表的不同位置应该显示什么内容,它上面可以放控件(参见二)。 % ^) \" K* w1 o" r
11.TQRGoups:Groups可以不限级别的组操作。当你连接了几个datasets到报表时可以通过Groups成组的对dataset进行操作。 / z/ Q; ~& m5 q
二、 报表的控件摆放循序
8 U: s* a; ? ~, [" @; n 出现在所有页上的标题(PageHeader)
. o4 E. C2 q" M. M- D8 ?8 r | + U9 M- Y. t p! n: h+ _
标题(只有首页才有)(Title) 1 k! D! @. ~! Y6 Q6 T
| 0 V e& n7 j8 W ^7 Z- e6 k6 o
所有列的标题(ColumnHeader)
/ o8 ^, _5 l7 X+ A7 t | ' w. _0 r x3 I* D& @1 Q6 n
记录的内容,一个字段一列(Detail) + D: v$ [2 i! L7 |
|
% D# {2 ^; j! S# h t$ w6 ]! O 摘要(最后一页才有)(Summary) % G; H: ~5 Q4 @) _% f
|
: c5 `" M: Z# w) G0 B 出现在所有页上的页脚(PageFooter)
! H: f# m0 }) F ! M6 I, P3 W+ x! N# J. T
这些根据设置不同的Band(不是控件,一种类型而已,在其上面可以放其他控件)来定位。总共有六种Band。
W" n) j4 |$ n7 }' n三、 一个简单的例子 : q9 \( j, y( y* C
这个例子制作打印一张表的部分字段名及该字段数据内容的报表。
2 W+ K1 `) Z6 S, n# D0 C 1. 建立一个新project
7 a- d9 |7 A+ ~$ ^& C 2. 放一个TTable到Form上,DatabaseName设为BCDEMOS,TableName指向Customer表,Active设为true. # Y$ t; ~+ ?+ `7 ~3 _7 J- e* a* E' N
3. 放一个TquickRep控件在Form上,DataSet属性为Table1.(即要显示上边Table1所指向的表的内)。 - x( J) a% K- R- {. r, ^
4.展开TquickRep的Bands属性,设HasDetail为true,这时自动增加个detail band(一个TQRBand控件,故也可以直接放一个TQRBand控件,BandType属性设为detail就行了)。
) Y- `$ ~8 A: J5 z 5.放一个TQRDBText控件在detail band上面,设DataSet指向Table1,DataField指向Company。第四步是设置在报表的什么位置显示什么类型的数据,而TQRDBText则具体实现。 6 N. R$ \6 C8 t
6.选TquickRep控件,按右键,选择”Preview”预览,应该看到表Customer的字段Company的所有字段值。
1 l( h q' T. _% [& A/ J- d& i 到这一个简单的例子就OK了,程序实现预览及利用TQRuickRep自带的打印功能只须在Form中加一个按钮,它的OnClick事件为:QuickRep1-> review(); ! v/ R6 ~; W) g7 W* w5 b
四、 一个使用TQRGoups、TQRExpr控件的报表
+ T2 S; C: j* E# c. [* ^) O* b7 M 该报表先列出州名,接着列出该州的所有公司及公司总数,一个州列完后空一行(groups中断),列出新的州名,接着列新州下的所有公司,没有填州名的公司统一列在Unknown state下面。
' h4 j6 T) Y+ t% _# k 1. 建立一个新project。
' r4 `- H7 m l9 N 2. 放一个Tquery在Tquickrep上,其SQL属性为:select * from customer order by State,Company;(即根据州、公司排序),DatabaseName为BCDMome,Active为true. / d7 `, O) y5 n8 Z7 c
3. 放一个TquickRep控件在Form1上,DataSet为Tquery1.
+ H, b. [3 K% e) X" W/ R 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(根据不同的州来中断)。
, Q; w" o. `& L! e; y; r! ` 5. 放一个TQRBand控件在报表上,BandType为rbDetail. ) n: ^! C# t! X2 D* @
6.放一个TQRExpr控件在group header上面,其Expression属性为:if(State<>’’,State,’Unknown state’),即如果公司的州没填,就归入Unknown state,否则归入State. 6 T2 D$ u1 X, ^1 G0 y9 i
7.放三个TQRDBText在Detail上,他们的DataSet都指向Query1,DataField分别指向Company,Contact,Phone. ( m$ N' o2 E1 e% }6 l8 \
8.在放一个TQRExpr控件在group Footer上面,Expression为’Customers in’+State+’:’+Str(Count) 作用是在每个州的公司列完后显示该州总共有多少个公司。 , {: T. I2 B4 e& }- S
9.按右键选预览,应该看到不同的州名及其公司和公司公司总数。
. _. r" c0 J g) P P& R h. r五、QuickReport 条件式列印 + C" J/ G0 Y/ J- P; z& f+ x
可以直接在 TQuickReport 的 OnFilter 事件中写明条件判断,OnFilter事件的引数中有一个以 var 宣告的 PrintRecord 布林型态变数,将这个变数设为 True(预设值), 该笔记录便会印出;反之, 设为False,就不印出这笔记录.
2 M' E9 d7 O' I4 D/ I: [ procedure TForm1.QuickReport1Filter(var PrintRecord: Boolean); : O7 r' I# C) ^
begin & c9 o( M8 V. J
PrintRecord := False;
5 ~, S: d% T6 p' ?- K: F3 o( u$ S* b if YourTable.FieldByName('WantedField').AsInteger <= 100 then
. A7 m6 ?& x0 F8 o8 O' a2 u Exit; 9 m* d2 n; i3 ~: A
if YourTable.FieldByName('WantedField').AsInteger >= 150 then
' @4 J5 Z) M1 P6 H6 x Exit; 4 M' a+ D e; {) f$ T4 x
PrintRecord := True; , W; v- m2 [, j; N1 s
|