DesignerHide属性:当一个报表有多个Band时,选择查找Band变得比较麻烦,设置DesignerHide属性为True时,没有选择到的Band内容被隐藏。
GroupDataView 和GroupKey属性:如果想要以相应的数据结果作为报表分组的依据,那么就必须设置这两个属性,GroupDataView是相应的数据源,GroupKey是数据源的索引,分组是靠GroupKey中的值进行分组的。
DataBand:是直接作用于数据库,且可以在其中摆放相应数据库报表组件,这样通过它就可以让相应的报表具有数据库书库打印功能。其中DataView属性是设置相应的数据源,GroupDataView是相应的报表中的分组数据源。
DataCycle:与DataBand相似的地方在于循环的显示数据,DataBand是数据库内容的循环打印,而DataCycle不需要使用Region,它打印的区域为页面,每页只能打印一个组件设计好的内容。使用DataBand是根据Region的范围来分页,而DataCycle则是每一页只现实一条信息根据数据的多少分页。
CalcOp:该组件提供了报表相应的计算功能,具体的使用会在以后讲解。
CalcTotal:与CalcOp结合使用来完成日常报表的统计功能。
隔了好长时间终于有时间继续向大家介绍RAVE了,这次主要介绍Delphi7下的Rave组件。打开Delphi7,看到的rave页如下:
Delphi7下的Rave
包括有RvProject、RvSystem、RvNDRWriter、RvCustomConnection、RvDataSetConnection、RvTableConnection、RvQueryConnection、RvRenderPreview、RvRenderPrinter、RvRenderPDF、RvRenderHTML、RvRenderRTF、RvRenderText这几个组件。
lRvProject组件
在使用rave报表中,这个组件是最为重要的一个,是使用频率最高的一个组件,开发人员可以通过这个报表完成报表的打印、文件的生成、输出,土过此事可以使用设计状态,也可以通过它来点用相应的报表设计器。
属性:
DLLFile:发行报表时需要的dll文件,在5.0以后用户不需要单独发行相应的动态链库文件了。
Engine: 指定相应报表生成的目的地,一般的情况下,是RvSystem,也就是说它可以打印、打印预览、生成打印文件。当然也可以选择RvNDRWriter组件,那么报表输出的结果是RTF、HTML、PDF、TXT其中的一种。
LoadDesigner: 允许用户调用报表设计器,如果它的值为true,那么最终用户就可以调用报表设计器;如果它的值为False,那么最终用户就没有权力调用报表设计器。
ProjectFile:相应报表项目文件,指定详细目录路径。
StoreRAV:要将报表文件嵌入到exe文件中,在这里就要填入相应的报表项目文件。
主要方法:
SelectReport方法:
Function SelectReport(ReportName:String; FullName:Boolean):Boolean;
ReportName是相应的报表名称,FullName则表示是否以报表的全程作为报表的名称。
Execute方法:
打印选择的相应报表文件,报表时被SelectReport选择的。
RvProject1.Execute;
ExecuteReport方法:
RvProject1.ExecuteReport(ReportName:String);
ReportName是相应的报表的名称。
Open方法:
RvProject1.Open; 打开相应的报表以共操作。
Close方法:
RvProject1.Close; 关闭一个报表的操作。
l RvSystem组件
打印或者预览报表时,进行打印参数设置的。使用时与RvProject结合。
属性:
DefaultDest:指定打印的方式。
rdPreview:预览;
rdFile:文件;
rdPrinter:打印机。
RulerType:相应的标尺单位。
rtNone:没有标尺;
rtHorizCm:横向标尺,单位为厘米;
rtVertCm:纵向标尺,单位为厘米;
rtBothCm:先是所有的标尺,单位为厘米;
rtHorizIn: 横向标尺,单位为英寸;
rtVertIn: 纵向标尺,单位为英寸;
rtBothIn:所有标尺,单位为英寸;
SystemFiler:报表打印文件参数的设置。如果DefaultDest属性为rbFile,则需要设置这里的属性值。
SystemOptions:所有报表输出设置属性。
SystemPreview:报表预览参数的设置。如果DefaultDest属性为rdPreview,则需要设置这里的属性值。
SystemPrinter:报表打印参数的设置。如果DefaultDest属性为rdPrinter ,则需要设置这里的属性值。
SystemSetup:是对是否允许打印,是否允许打印机设置等参数的设置。
TitlePreview:更改报表预览的窗体的名称,例如可以将Report Preview改为报表预览。
TitleSetup:更改报表输出窗体的名称,例如可以将Output Options改为输出设置。
TitleStatus:报表状态窗体名称,例如可以将Report Status改为报表状态。
主要方法:
OverridePreview方法,OverrideSetup方法,OverrideStatus方法:
这三个方法可以对报表设置、打印设置、报表预览窗体进行覆盖,在后面会介绍如何通过这几个方法是窗体为中文。
l NDRWriter组件
使用该组件实现自定义报表预览。
l RvDataSetConnection组件,RvTableConnection组件, RvQueryConnection组件
使用这三个组件实现数据库的连接。
l RvRenderPDF组件, RvRenderHTML组件, RvRenderRTF组件,RvRenderText组件
报表生成相应文件的组件,可让报表生成相应的pdf、html、rtf、text文件。但生成文件对中文不支持,会出现乱码。
前面两篇,向大家介绍了RAVE的组件,从今天开始向大家介绍如何建立报表。首先要感谢li jack等各位朋友给我发的电子邮件,鼓励我继续写下去。今天也查了一下RAVE一词的意思。
RAVE在辞典上的翻译为“咆哮”。 rave-up喧闹的宴会, 狂欢聚会,我们经常也听到锐舞派对,也就是RAVE PARTY。
要对Rave文化追根溯源其实不太容易,并非是因为其无从追溯,恰恰相反,正因为它涵盖的面太广,根基太深,所以反而让人有些无从入手。从远的来说,Rave与各块大陆上土著部落的祭典仪式有着相当的渊源,因为这些祭典通常也是通过音乐与紧密的鼓点而使人进入某种超验状态;从近的来说,Rave又与60年 代的嬉皮文化与迷幻实验有着密不可分的关系,两代年轻人除了装扮不同,许多心理状态与行为方式其实都有值得注意的相似之处。
真正当代的将新式音乐与舞曲相结合的Rave运动起源于英国。10多年前,Rave首先出现在曼彻斯特和伊比沙岛(英国著名度假胜地)。1987年末及1988年初,两个并无关系的团体--Schoom和Genesis P开始在英国组织彻夜的舞会,前者是以house音乐为主,而后者以hardcore为主。与此同时,Rave在德国登陆,在柏林等大城市很受欢迎。很快,Rave在英德两地吸引了数以万计的青少年,更吸引了许多来自美国的DJ。
现在Rave已经是欧、美、日,甚至港台最时兴、最UNDERGROUND的一种青少年娱乐形式,Rave文化从一开始便被打上了高科技的烙印,从急速疯狂的前卫电子舞曲,新奇剌激的影像视觉,到Sharp得眼花缭乱的装束,Rave与E-Life,已经成为科技对青年文化影响的见证。
当然我也不知道为什么Nevrona公司把这个报表组件叫做rave,也许和锐舞有着一定的关系吧,就像java咖啡。
言归正传,我们开始建立一张简单的报表,打开Delphi7, 新建一个工程,打开Tools下的Rave Designer,在Rave 设计器的page1中,拖放Text,我们在text属性中写入文字内容,例如,“我的第一张报表” ,通过Font属性更改字体和字的大小,颜色等。拖放Memo组件,在text属性中输入文字可以看到一个多行的文本。拖放Bitmap组件,在FileLink属性中选取插入图片的位置,就可以看到在报表中显示了一张图片。
点击[Execute Report]或者F9,则查看到运行后报表。
上一篇向大家介绍了建立一张简单报表的过程。这篇文章向大家介绍rave报表代码编程实例。窗体上放置组件:RvSystem, Button即可。
具体代码如下:
##################################################################################
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, RpDefine, RpBase, RpSystem;
type
TForm1 = class(TForm)
RvSystem1: TRvSystem;
Button1: TButton;
procedure RvSystem1Print(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.RvSystem1Print(Sender: TObject);
var
I1: integer;
S1: string[20];
S2: string[20];
Bitmap: TBitmap;
PolyLineArr: array[1..6] of TPoint;
begin
with Sender as TBaseReport do begin
{ 打印表头和表尾 }
SectionTop := 0.75; //顶端
SetFont('黑体',26); //设置字体
Underline := true; //下划线
Home;
YPos := 1.0;
FontRotation :=20;//旋转角度
PrintCenter('我的报表',PageWidth / 2);
SetFont('宋体',10);
SectionBottom := 10.75;
PrintFooter(' 第' + IntToStr(CurrentPage) + '页',pjLeft); //页码
PrintFooter('日期: '+DateToStr(Date)+' ',pjRight); //日期
SectionBottom := 10.5;
YPos := 1.5;
SetFont('宋体',12);
SetTopOfPage;
Home;
{ 打印列标题 }
ClearTabs;
SetPen(clBlack,psSolid,1,pmCopy); { 设置画笔为一个点宽 }
SetTab(0.5,pjCenter,3.5,0,BOXLINEALL,0);
SetTab(NA,pjCenter,1.0,0,BOXLINEALL,0);
SetTab(NA,pjCenter,1.5,0,BOXLINEALL,0);
SetTab(NA,pjCenter,1.5,0,BOXLINEALL,0);
Bold := true;
Tab(-2,NA,-2,-2,NA); { 画出具有粗边框的表格 }
Print('Name');
Tab(NA,NA,-2,-2,NA);
Print('Number');
Tab(NA,NA,-2,-2,NA);
Print('Amount 1');
Tab(NA,-2,-2,-2,NA);
Println('Amount 2');
Bold := false;
{ 打印具有边框的数据 }
ClearTabs;
SetTab(0.5,pjLeft,3.5,2,BOXLINEALL,0);
SetTab(NA,pjCenter,1.0,2,BOXLINEALL,0);
SetTab(NA,pjRight,1.5,2,BOXLINEALL,10);
SetTab(NA,pjRight,1.5,2,BOXLINEALL,0);
for I1 := 1 to 10 do begin
Str(I1 * 1.23:2:2,S1);
Str(I1 * 98.76:2:2,S2);
Print(#9'LastName' + IntToStr(I1) + ', ');
SetFont('Times New Roman',8);
Print('FirstName M.');
SetFont('Times New Roman',12);
Println(#9 + IntToStr(I1) + #9'$' + S1 + #9'$' + S2);
end; { for }
{ 打印具有阴影的数据 }
ClearTabs;
SetTab(0.5,pjLeft,3.5,2,BOXLINENONE,0);
SetTab(NA,pjCenter,1.0,2,BOXLINENONE,0);
SetTab(NA,pjRight,1.5,2,BOXLINENONE,0);
SetTab(NA,pjRight,1.5,2,BOXLINENONE,0);
for I1 := 11 to 20 do begin
If Odd(I1) then begin
TabShade := 0;
end else begin
TabShade := 15;
end; { else }
Str(I1 * 1.23:2:2,S1);
Str(I1 * 98.76:2:2,S2);
Print(#9'LastName' + IntToStr(I1) + ', ');
SetFont('Times New Roman',8);
Print('FirstName M.');
SetFont('Times New Roman',12);
Println(#9 + IntToStr(I1) + #9'$' + S1 + #9'$' + S2);
end; { for }
ClearTabs;
{ 分栏报表 }
ClearTabs;
SetTopOfPage;
SectionBottom := 8.0;
Home;
SetFont('宋体',12);
Bold := true;
Underline := true;
Print(' 分栏报表 (LinesLeft/ColumnLinesLeft/LineNum/ColumnNum)');
SetTopOfPage; { Set top of page to current YPos }
Bold := false;
Underline := false;
Italic := false;
Home; { Goto home position }
SetColumns(4,0.5); { Create 4 columns with 0.5" between each }
while ColumnLinesLeft > 0 do begin
Println(IntToStr(LinesLeft) + '/' + IntToStr(ColumnLinesLeft) + '/' +
IntToStr(LineNum) + '/' + IntToStr(ColumnNum));
end; { while }
{ 具有边框的分栏报表 }
ClearTabs;
SetTopOfPage;
SectionBottom := 10.5;
Home;
SetFont('Times New Roman',12);
Bold := true;
Italic := true;
Print('Boxed Columns');
SetTopOfPage; { Set top of page to current YPos }
Bold := false;
Italic := false;
Home; { Goto home position }
ClearTabs;
SetPen(clBlack,psSolid,1,pmCopy);
SetTab(0.5,pjCenter,0.375,0,BOXLINEALL,0);
SetTab(NA,pjCenter,0.375,0,BOXLINEALL,0);
SetTab(NA,pjCenter,0.375,0,BOXLINEALL,0);
SetTab(NA,pjCenter,0.375,0,BOXLINEALL,0);
SetColumns(4,0.5); { Create 4 columns with 0.5" between each }
while ColumnLinesLeft > 0 do begin
if LineNum = 1 then begin
TabShade := 15;
Println(#9'LL'#9'CLL'#9'L#'#9'C#'); { 打印标题栏 }
end else begin
TabShade := 0;
Println(#9 + IntToStr(LinesLeft) + #9 + IntToStr(ColumnLinesLeft) +
#9 + IntToStr(LineNum) + #9 + IntToStr(ColumnNum));
end; { else }
end; { while }
SetColumns(1,0);
{ 在指定位置绘出文本 }
NewPage;
OriginX := 0.0; { Set origin to normal }
OriginY := 0.0;
GotoXY(1.0,1.5);
Print('Text @ 1.0,1.5');
GotoXY(6.0,1.5);
Println('Text @ 6.0,1.5');
GotoXY(2.0,2.0);
Println('Text @ 2.0,2.0');
GotoXY(3.0,2.5);
Println('Text @ 3.0,2.5');
{*** 图形 图片***}
NewPage;
ResetSection;
SetFont('Arial',24);
Underline := true;
Home;
PrintCenter('Graphics Page Demo',PageWidth / 2);
SetFont('Times New Roman',8);
SectionBottom := 10.75; { Temporarily move the section bottom down }
PrintFooter('Page ' + IntToStr(CurrentPage),pjLeft);
PrintFooter('Date 01/20/95',pjRight);
SectionBottom := 10.5; { Reset section bottom }
OriginX := 0.0;
OriginY := 0.5;
SetFont('Arial',10);
{ 半圆 弧线}
SetPen(clBlack,psSolid,-2,pmCopy); { Set pen to black 2/100ths" wide }
YPos := 0.95;
PrintCenter('Arc() and Chord()',2.125);
Arc(1.125,1.0,3.125,3.0,3.125,2.0,0.0,0.0);
SetBrush(clBlack,bsClear,nil);
Chord(1.125,1.0,3.125,3.0,0.0,0.8,3.125,2.25);
{ 饼图 }
YPos := 0.95;
PrintCenter('Pie()',4.25);
2.打开Rave设计器打开*.Rav文件。
3.[File]àNew Data ObjectàDirect Data Viewà选择RvDataSetConnection1,[Finish]看到报表设计导航区的Data View Dictionary增加了DataView1,扩展后可以看到数据字段;
4.利用前例步骤3,同样的方法,进行报表的可视化设计。在可视化设计时,注意看生成的简单数据库代码的组成部分,注意TitleBand,DataBand, Band的属性设置。当然我们也可以不用Report Wizards自动生成也可以自己来根据需要直接做报表。步骤是:
1)添加组件页的Region组件,来描述报表的范围。
2)添加Band,Band, DataBand组件,设置相应的BandStyle 和Dataview属性。
3)在DataBand中添加,DataText选择其Dataview属性和DataFile属性。
4)预览即可,如果不能正常显示,注意查看属性的设置,尤其是Dataview属性,同时可以与Report Wizards自动生成的报表进行对比。
5.添加如下代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
RvProject1.Open ;
RvProject1.ExecuteReport('Report1');
RvProject1.Close ;
end;
6.运行后,点击[确定]按钮,既显示报表设置窗体,确定后可以看到你想要得窗体。
关于和数据库连接报表的一些问题:
1)上面的例子是直接从数据库输出的报表,如果要输出的报表是根据用户的条件输出,怎么办?
如果是要根据用户的条件输出相应的报表,使用Query组件,当然要是涉及到存储过程的操作,也是一样的阿。选择相应的数据库访问组件,将RvDataSetConnection的Dataset属性连接到数据库访问组件即可。
2)我在数据库表中的字段是中文的,在Rave中连接数据库,DataView不能显示我的字段,并且提示“DataView1已经存在!” ,怎么办?
出现这样的问题主要是DataView1的name属性不支持中文名,而不能根据数据段名来命名,你将DataView1更改为相应的英文名,更改Fieldname为响应的字段中文,刷新DataView,还会有提示,同样更改name和Fieldname属性,直到你要的字段都更改好为止。
3)默认的报表时竖排的,怎么样才能将页面设置为横向的?
关于页面的设置请注意熟悉RvSystem的属性。
RvSystem1.SystemPrinter.Orientation :=poLandScape; //页面为横向的
RvSystem1.SystemPreview.FormState := wsMaximized; //预览窗体最大化
RvSystem1.SystemPreview.MarginPercent :=3; //报表页面据预览窗体的边距。
当然还有很多的设置TitleSetup,TitleStatus,TitlePreview属性可以将你的报表设置,报表预览的窗体的标题改为你想要的。当然我们最基本的是要改为中文的阿。关于怎么让你的报表预览,报表设置窗体为中文的我在后面会专门介绍。
联系客服