1、Rave Reports 概述 Rave Reports 是一个基于组件的可视化报表设计工具,它简化了在应用程序加入报表的步骤.你可以是用 Rave Reports去创建各种报表,从简单的条状报表到高度自定义的报表.报表功能包括:翻转文字注释全图示显示版面调整页面精确定位打印配置字体控制打印预览可重利用的报表内容对 PDF,HTML,RTF,和 text 报表的显示支持Rave 结构 1.Data connection 组件:Rave 数据来源于你的应用程序。这些标准数据连接组件,TRvCustomConnection,TrvDataSetConnection 和 TRvTableConnec
2、tion在 Rave 可视组件和你的应用程序之间作为数据连接桥。TRvCustomConnection 组件可以用来访问象内存数组和二进制记录文件这样的非数据库数据。TRvDataSetConnection可用来提供访问 TDataSet 派生的组件包括第三方数据组件。TRvTableConnection 常用于特定的 TTable 组件或他们的各个派生组件。2.TRvProject 组件这个组件提供报表和它们所拥有的组件的访问。TRvProject 组件包含许多属性和方法允许你创建、修改、打印和设计你的报表项目。在每个应用程序中,你只需要一个 TRvProject,但是对于多个使用则不作限制
3、。3.Report project file (.RAV file)报表项目文件用来储存 Rave visual designer 中的报表定义。它是二进制文件,类似于Delphi 的.DFM 文件。所有的报表,报表项目的 global pages 和 data views被储存到这单个文件中。你可以导出或导入项目。使用 TRvProject 组件的方法,你也可以储存报表项目文件到数据库的 blob 字段或其他地方。4.ReportsReports 储存在报表项目的报表库中。一个 Rave 报表由报表页面和储存在这些页面的可视报表组件组成。你可以随意创建许多页面定义,然后在各种方法中组合它们。
4、5.Global PagesGlobal Pages 储存在报表项目的 Global Pages 分类中,组件包含在 Global Pages 上,不象其他那些报表页面里面的组件,它们对于所有报表都是可见的。Global Pages对于储存模板用于其他报表页面非常有用。6.Data ViewsData Views 储存在报表项目的 Data Views Dictionary 中。Data Views 给提供数据连接组件提供一个接口。当创建新的 Data Views 时,你必须有活动的数据连接组件在正在运行的应用程序中或者在一个已加载的 Delphi 或 C+ Builder 表单上。Data
5、Views 然后将让数据连接组件去检索元数据(meta-data)信息比如字段名,数据类型,等等。字段组件包含在每个 Data Views 中,可用来设置每个数据列的属性。Rave Reports 初步入门 你可以在 VCL 或 CLX 应用程序中使用 Rave Reports 去实现来自数据库或非数据库数据的报表.下面的过程说明怎样增加一个简单的报表到已存在的数据库应用程序中.1.在 Delphi 中打开一个数据库应用程序.2.从组件面板的 Rave 页,假如 TRvDataSetConnection 组件到应用程序的表单.3.在 Object Inspector 中,设置 DataSet
6、的属性为一个已在你的应用程序中定义的 dataset组件.使用 Rave Visual Designer4.去设计你的报表然后并创建一个 report project 文件(.rav file). 选择 Tools|Rave Designer 运行 Rave Visual Designer.选择 File|New Data Object 显示 Data Connections 对话框. 在 Data Object Type 列表,选择 Direct Data View 然后单击 Next.在 Active Data Connections 列表,选择 RVDataSetConnection1
7、然后单击 Finish.在 Rave Visual Designer 窗口左边的 Project Tree 中 ,展开 Data View Dictionary 结点,燃后展开刚创建的 DataView1 结点.你要使用的数据字段显示在 DataView1 结点下. 选择 Tools|Report Wizards|Simple Table 显示 Simple Table wizard.选择 DataView1 然后单击 Next. 选择你想要在这个报表中显示的两个或三个字段然后单击 Next.按照随后的向导页提示区设置要在这个报表中使用的字段的排序, 页边距,首部文本,以及字体. 在最后向导页
8、上,单击 Generate 完成这个向导然后在页面设计器中显示报表.选择 File|Save as 显示 Save As 对话框. 把 Rave project 存到你的 Delphi 应用程序的目录下并命名为 MyRave.rav. 最小化 Rave Visual Designer 窗口返回 Delphi.5.从组件面板的 Rave 页,添加一个项目组件 TRvProject 到表单. 6.在 Object Inspector,设置 ProjectFile 属性为刚才创建的 report project 文件(MyRave.rav). 7.从组件面板的 Standard 页,添加 TButt
9、on 到表单.8.在 Object Inspector,单击 Events 标签然后双击 OnClick 事件.9.在事件处理程序中使用 ExecuteReport 方法去执行 Rave project 组件. 10.按 F9 运行应用程序.11.单击在第七步添加的按钮.12.Output Options 对话框被显示出来,单击 OK 显示报表.Rave 报表介绍之二: 可视报表设计器 可视报表设计器 Rave 有自己的可视报表设计器,以自己的文件格式保存报表。这有一些优势,你可以把报表独立于应用程序之外,可独立进行升级,甚至可以通过网络进行更新,或者使用 Nevrona 的Rave Repo
10、rt Server。当然,你也可以把报表保存为标准的 DFM 文件格式。 为了启动可视报表设计器,防止一个 TRvProject 部件在 form 上,这个 TRvProject 部件将是你的应用程序和你即将要创建的报表的联系。 如果需要,可加一个 TRvSystem 部件到窗体上,通过设定 RvProject 的 Engine 属性与它挂接。RvSystem 部件是作为一个通用的报告系统配置部件:可通过它设置将要使用的打印机,边界,页数等等。为了开始一个新的报表项目,双击 RvProject 部件 ,或者通过敏感菜单选择“Rave Visual Designer.“ 。 一个 Rave 项目
11、文件将可能由多个报表组成。通过全局页面(Global Pages) 可以保存一些报表间共享的品项。 如果一个属性从缺省值改变为特定值,在属性编辑器中会显示成粗体。 当在可视报表设计器设计好报表后,返回到 delphi 的 IDE 中,改变 RvProject 部件的ProjectFile 属性为你刚才完成并保存的报表文件名。为了运行报表,加一个调用 RvProject对象的 Execute 方法的过程即可。 如果我们设计的报表项目中只有一个报表,我们仅仅调用 RvProject.Execute 即可。如果我们的报表项目中有多个报表,我们不得不在调用 Execute 前,调用 SelectRep
12、ort 来选择特定的报表,或者调用直接调用 ExecuteReport 方法。 与报表项目进行交互 参数(Parameters) 参数可以存在于报表项目,报表,报表页面这三个地方,可通过对应对象的 parameters 属性进行设定。 你仅能通过报表项目的对象树来选择报表项目和特定的报表。对于报表页面可以通过报表项目的对象树或页面设计的标题来选择。 参数可通过 DataText 部件来输出。在页面上加一个 DataText 组件,打开属性编辑器的DataField 属性。你能在此选择项目变量、参数、后初始化变量。 procedure TFormMain.btnExecuteClick(Send
13、er: TObject); begin RvProject.Open; /打开报表项目 RvProject.SelectReport(ParametrizedReport,False); /通过报表名称选择特定的报表 RvProject.SetParam(Name,Leonel); /给特定参数设定值 RvProject.Execute; /执行报表 RvProject.Close; /关闭报表项目 end; 后初始化变量 后初始化变量是只有在报表已经被打印了才知道值的变量。比如页的总数(TotalPages)就是后初始化变量,其使用方式类同于一般变量,也是通过 DataTexts 来打印的。
14、 全局页面 如果有些报表的部分在两个或更多报表中是相同的公用的,你能把这些放置到全局页面中。比如公司名称、日期和时间、当前页号和总页数等。我们需要每个报表都有这些东西,我们应该怎么做? 首先,加一个全局页面到报表项目中。在这个页面中,加一个 section 组件。Sections 组件用于组件的逻辑分组。 在 section 组件中加入我们想要共享的东西。 在特定报表的特定页,增加另一个 section 组件。设定该组件的 Mirror 属性为前面那个全局页面中的 Section 组件。你能看见全局页面中的 Section 组件及其包含的对象均被映射进来了。对于其它特定的页面,同法炮制,现在多
15、个页面就可以共享一些组件了。 条件打印 有时我们会根据特定的条件打印报表的特定部分。Rave 对此提供了强劲的支持。我们可以根据字段值和参数的条件映射一些 sections 。 在新的一个页面中创建一个参数 HeaderKind。 它可能的值为 H0 (无页头), H1(第一种页头), H2 ( 第二种页头 )。在全局页面中增加一个新的 section 组件,它具有第二种页头风格。 返回到 ConditionalReport 报告 Page1 的页面,加一个 DataMirrorSection 部件,设定它的DataField 字段为 Param.HeaderKind。打开它的 DataMir
16、rors 属性编辑器,增加两个 Data Mirrors: 如果值是 H1,将打印第一种页头;值是 H2, 将打印第二种页头;因为值为 H0 并不匹配任何 mirrors,将不打印页头。 procedure TFormMain.btnExecuteClick(Sender: TObject); begin RvProject.Open; /打开报表项目 RvProject.SelectReport(cmbReports.Text,False); /通过报表名称选择特定的报表 case cmbReports.ItemIndex of 1: RvProject.SetParam(Name,edNa
17、me.Text); /给特定参数设定值 2: RvProject.SetParam(HeaderKind,Format(H%d,cmbHeaderKind.ItemIndex); /给特定参数设定值 end; RvProject.Execute; /执行报表 RvProject.Close; /关闭报表项目 end; 镶嵌报表项目文件到应用 EXE 文件中 通常,当你发布应用程序时,你必须同时包括你的报表项目文件。如果你让报表项目文件成为一个独立文件,你就可以采用简单方式对其更新而不需要重新编译你的应用程序。如果你想把报表项目文件包含在你的应用程序的 EXE 中,也是很简单的,你需要:设定Rv
18、Project 组件的 StoreRAV 属性。你通过 Load 一个报表项目文件把它包含在 DFM 中,通过 Save 可以提取出先前的一个报表项目文件,通过 Clear 可以删除镶嵌的报表项目文件。当报表项目文件被装载进应用程序的 EXE 中后,你就不再需要同时把报表项目文件打包进发布的应用程序了! 结论 我们学习了如何使用可视报表设计器,以及相应的一些提示。 RAVE 中 TRvCustomConnection 组件介绍 TRvCustomConnection 组件描述:通过数据连接组件的事件,你可以定制数据以何种方式送到你的 Rave 报表.对于使用TRvCustomConnectio
19、n 的非数据库数据,你会想要通过这些事件得到可以使用的所有数据。对于数据库数据连接组件象 TRvDataSetConnection,你仅仅想要覆盖 OnValidateRow 事件.注意: TRvCustomConnection 组件有一个整型的 DataIndex 和 DataRows 属性.他们用于自定义连接器事件,可以和 OnFirst, OnNext 和 OnEOF 事件一起使用. DataIndex 用作数据指针位置,它以 0 为首行. DataRows 指明数据的行数.例如,如果你为内存数组定义一个自定义数据连接,你仅需要初始化 Connection.DataRows 属性为内存数
20、组中的元素数量然后让 Rave 处理 OnFirst, OnNext 和 OnEOF 事件.在 OnGetRow 事件中,你将存取Connection.DataIndex 属性区确定哪个数据被传回来(记住对于首行 DataIndex 为 0).事件:OnGetCols这个事件当 Rave 要检索数据的元数据信息时被调用,在该事件中你可为你的数据中的每个字段(列) 调用 Connection.WriteField 方法。WriteField 定义如下:procedure WriteField(Name: string;DataType: TRpDataType;Width: integer;Fu
21、llName: string;Description: string);Name 是该字段的短名称,它只能包含文字和数字字符。 DataType 是下列所示的数据类型之一:dtString,dtInteger, dtBoolean, dtFloat, dtCurrency, dtBCD, dtDate, dtTime, dtDateTime, dtBlob, dtMemo 或 dtGraphic。Width 是和该字段宽度相关的字符。Full name 是字段名称的更详细的描述,它可以包括空格和其他非字母数字字符。如果 Full name 为空白,那么 Name 将用作字段的 full nam
22、e。Description 是一个完整的字段描述,由于它用 memo 组件来编辑所以可以包含多行内容。使用description 属性来说明字段如何被使用以及关于字段数据的其他信息。举例:procedure TDataForm.CustomCXNGetCols(Connection: TRvCustomConnection);beginWith Connection do beginWriteField(Index,dtInteger,8,Index Field,Description 1);WriteField(Name,dtString,30,Name Field,Description
23、2);WriteField(Amount,dtFloat,20,Amount Field,Description 3);end; with end;OnOpen进行数据会话的初始化工作调用该事件。在这个事件中你可以打开数据文件,初始化变量以及为在数据会话结束时引发的 OnRestore 事件保存当前的数据状态举例:procedure TDataForm.CustomCXNOpen(Connection: TRvCustomConnection);beginAssignFile(DataFile,DATAFILE.DAT);Reset(DataFile,1);end;OnFirst定位数据指针到
24、首行的时候调用该事件举例:procedure TDataForm.CustomCXNFirst(Connection: TRvCustomConnection);beginSeek(DataFile,0);BlockRead(DataFile,DataRecord,SizeOf(DataRecord),DataRead);end;OnNext移动数据指针到下一行的时候被调用举例:procedure TDataForm.CustomCXNNext(Connection: TRvCustomConnection);beginBlockRead(DataFile,DataRecord,SizeOf(
25、DataRecord),DataRead);end; OnEOF判断数据指针是否超过文件的结尾处,如果没有行或者在 OnNext 事件中已经移到最后一行时触发该事件。举例:procedure TMainForm.CustomCXNEOF(Connection: TRvCustomConnection;var EOF: Boolean);beginEOF := DataRead OnGetRow检索当前行数据时触发该事件。Rave 有好几种方法用来写数据到指定的缓冲区。字段的顺序和类型必须完全匹配在 OnGetCols 事件中提供的字段的定义。下面是 Connection 对象提供的用来写数据到
26、数据缓冲区的函数列表procedure WriteStrData(FormatData: string;NativeData: string); dtString procedure WriteIntData(FormatData: string;NativeData: integer); dtInteger procedure WriteBoolData(FormatData: string;NativeData: boolean); dtBoolean procedure WriteFloatData(FormatData: string;NativeData: extended); dt
27、Float procedure WriteCurrData(FormatData: string;NativeData: currency); dtCurrency procedure WriteBCDData(FormatData: string;NativeData: currency); dtBCD procedure WriteDateTimeData(FormatData: string;NativeData: TDateTime); dtDate, dtTime and dtDateTime procedure WriteBlobData(var Buffer;Len: longi
28、nt); dtBlob, dtMemo anddtGraphic 有个特别的方法 WriteNullData (no parameters),可以用于包含未初始化或 null 数据的任何字段的调用。FormatData 参数常用于为该字段传递预先格式化的字符数据。NativeData 参数用于传递字段的未格式化的或 Raw 数据,如果特定的格式在 Rave报表中定义,那么格式将应用到 NativeData。如果没有特定的格式在 Rave 报表中定义,那么FormatData 将被用来打印。举例:procedure TDataForm.CustomCXNGetRow(Connection: TR
29、vCustomConnection);beginWith Connection do beginWriteIntData(,DataRecord.IntField);WriteStrData(,DataRecord.StrField);WriteFloatData(,DataRecord.FloatField);end; with end; OnValidateRow这个事件用来控制是否你允许当前的行包括在报表中。举例:procedure TDataForm.CustomCXNValidateRow(Connection: TRvCustomConnection;var ValidRow: B
30、oolean);beginValidRow := DataRecord.FloatField = 0.0;end;OnRestore中止并恢复数据会话到先前状态时触发该事件。在这个事件中你可以关闭数据文件,释放资源以及恢复数据到 OnOpen 事件触发时的状态举例:procedure TDataForm.CustomCXNRestore(Connection: TRvCustomConnection);beginCloseFile(DataFile);end;RAVE 中 Rendering 组件介绍 TRvRenderPreview 描述TRvRenderPreview 组件接收 TRvND
31、RWriter 组件生成的文件并发送到屏幕打印。TRvRenderPreview 拥有许多方法和事件允许程序员创建完全自定义的用户界面。TRvRenderPreviewScrollBox 定义报表在预览时候的 TScrollBox 组件。FileName 和 StreamMode 的用法和它们在 TRvNDRWriter、TRvRenderPreview 中的用法一样。GridHoriz和 GridVert 定义水平和垂直间距, RulerType 和网格的设置一起配合使用可以使报表不用进行打印输出就可以精确的确定报表中各个项目的位置。MarginMethod 和MarginPercent 确
32、定围绕页面的空白页边距的方法和尺寸。ShadowDepth 定义每页阴影的像素数目。Monochrome 定义是采用单色还是彩色图像输出。NextPage 和 PrevPage 用来进行页面跳转。ZoomInc 定义 ZoomIn 和 ZoomOut 的数量用于修改当前缩放的百分数因子(ZoomFactor)TRvRenderPreview 事件当前页被改变并允许程序员用新的页做当前页来更新用户界面时触发 OnPageChange。当前的缩放因子被改变时触发 OnZoomChange。TRvRenderPrinter 描述TRvRenderPrinter 组件接收由 TRvNDRWriter
33、组件产生的文件并发送到当前打印机。TRvRenderPrinter 经常用于从预览屏幕打印。 TRvRenderPrinter是一个简单的组件,但拥有可以定制打印的方法和属性。TRvRenderPrinter 属性和事件如果 StreamMode 是 smMemory 或 smFile,FileName 则是 TRvNDRWriter 生成的报表文件的名称。当程序员想要提供自己的流对象(TStream 的任何子类 )并分把它配给 TRvNDRWriter 的 Stream 属性时,streammode 应该为 smUser。TRvRenderPDF 描述TRvRenderPDF 允许从报表中生
34、成 PDF 文档。设置 EmbedFonts 为 True 可以让字体嵌入到 PDF文档中。PDF 中图像的质量可以用一个使用百分比的 ImageQuality 属性来设置。设置 UseCompression 为 True 可以生成压缩的 PDF 文档。首先要 uses ZLib,在OnCompress 事件中的代码如下With TCompressionStream.Create(clMax, OutStream) do tryCopyFrom(InStream, InStream.Size);finallyFree;end;让应用程序拥有 rendering 能力最简单的方法是在一个表单上放
35、一个 render 组件,它会自动注册格式并带有 TRvSystem 的标准设置和预览对话框。如果希望得到更多自动 rendering的方法,可以调用 Render 方法并传给它一个 NDR TStream 对象或一个 NDR 文件的文件名作为参数。TRvRenderHTML 描述TRvRenderHTML 转换一个 NDR 流或文件为 HTML 网页。支持文本,图像,线条和方框对象。输出结果为 HTML4.0 格式且匹配打印输出。TRvRenderRTF 描述TRvRenderRTF 转换一个 NDR 流或文件为 RTF 格式。 RTF 文档的输出结果匹配报表的打印格式。文档中的元素被独立的
36、包含在“frames“中支持精确的页面定位。TRvRenderText 描述TRvRenderText 转换一个 NDR 流或文件为文本格式,在这个报表中只支持文本项,其他的对象如图形或线条将被忽略。为了匹配最终的输出设备,CPI 属性允许每英寸字符被定义而LPI 属性允许每英寸的线条被定义。注意最终文本文件到打印机的输出可能不匹配 CPI 和 CPL 的设置,因为没有特定的命令格式被插到文本文件中。 RAVE 中 TRvNDRWriter 组件介绍 日期:2004 年 12 月 9 日 作者: 人气:819 查看:大字体 中字体 小字体 TRvNDRWriter 组件描述:TRvNDRWri
37、ter 组件和 TRvRenderPrinter 及 TRvRenderPreview 一起用特定的二进制格式存储报表直到它被打印或预览。属性和事件TRvNDRWriter 拥有属性和事件来控制文件输出。AccuracyMethod 使字符串在打印预览的中显示的更精确。当 StreamMode 属性不是 smUser 时候FileName 属性中的文件将被创建。一个大报表(页数多于 10 页或有许多图片) 应该使用smFile。而对于小报表(页数少于 10 页)则应使用 smMemory。调用 Execute 方法发送报表到文件。RAVE 中 Band 的 BandStyle 属性设定方法 日
38、期:2004 年 12 月 9 日 作者:SCYANGYU 人气:1154 查看:大字体 中字体 小字体 RAVE 中 Band 的 BandStyle 属性设定方法关于这个属性的设置,我一直没有搞清楚!今天好好研究了一下,有关体会是:Print Location(打印位置): Body Header(页眉)Group Header(组眉)Row Header(行眉)Detail(表体)Row Footer(行脚)Group Footer(组脚)Body Footer(页脚)Print Occurrence(打印事件):First(首页):Band 所包含的内容只可以在第一页打印,以后各页将不
39、包括相关的内容;New Page(新的一页):Band 所包含的内容必须在新的一页中,不能继续在原有页面中空白的部分继续打印;New Column(新的分栏):在 Region 组件设置分栏时相应的内容只打印在新的分栏中,而不是现在正在使用的分栏中。简单的报表对于表的行头一般采用的是常规 Band,对于表体则一般采用的是 DataBand。这种情况时,常规 Band 的 BandStyle 属性一般设定为:Print Location 为 Body Header;Print Occurrence 为 First、New Page。DataBand 的 BandStyle 属性一般设定为:Pri
40、nt Location 为空;Print Occurrence 为 First。通常需要设定常规 Band 的 ControllerBand 为对应的 DataBand。主细报表 对于主表的行头一般采用的是常规 Band,对于主表表体则一般采用的是DataBand。主表的常规 Band 的 BandStyle 属性一般设定为:Print Location 为 Row Header;Print Occurrence 为 First、New Page。主表的 DataBand 的 BandStyle 属性一般设定为:Print Location 为空;Print Occurrence 为 Firs
41、t、New Page。通常需要设定主表的常规 Band 的 ControllerBand 为主表对应的 DataBand。对于细节表的行头一般采用的是常规 Band,对于细节表表体则一般采用的是DataBand。细节表的常规 Band 的 BandStyle 属性一般设定为:Print Location 为 Body Header;Print Occurrence 为 First、New Page。细节表的 DataBand 的 BandStyle 属性一般设定为:Print Location 为 Detail;Print Occurrence 为 First。通常需要设定细节表的常规 Ban
42、d 的 ControllerBand 为细节表对应的 DataBand。需要设定细节表的 DataBand 的 ControllerBand 为主表对应的 DataBand。细节表与主表的挂接主要是靠设定细节表对应的 DataBand 以下三个属性:DetailKey:细节表中与主表映射的字段名称;MasterDateView:主表对应的数据视图的名称;MasterKey:主表中与细节表映射的字段名称。分组报表对于主表的行头一般采用的是常规 Band,对于主表表体则一般采用的是DataBand。主表的常规 Band 的 BandStyle 属性一般设定为:Print Location 为 Ro
43、w Header;Print Occurrence 为 First、New Page。主表的 DataBand 的 BandStyle 属性一般设定为:Print Location 为空;Print Occurrence 为 First、New Page。通常需要设定主表的常规 Band 的 ControllerBand 为主表对应的 DataBand。对于细节表的行头和分组统计一般采用的是常规 Band,对于细节表表体则一般采用的是 DataBand。细节表的行头常规 Band 的 BandStyle 属性一般设定为:Print Location 为 Body Header;Print Oc
44、currence 为 First、New Page。细节表的 DataBand 的 BandStyle 属性一般设定为:Print Location 为 Detail;Print Occurrence 为 First。细节表的分组统计常规 Band 的 BandStyle 属性一般设定为:Print Location 为 Body Footer;Print Occurrence 为 First。通常需要设定细节表的行头常规 Band 的 ControllerBand 为细节表对应的DataBand。需要设定细节表的 DataBand 的 ControllerBand 为主表对应的 DataBand。需要设定细节表的分组统计常规 Band 的 ControllerBand 为细节表对应的DataBand。细节表与主表的挂接主要是靠设定细节表对应的 DataBand 以下三个属性:DetailKey:细节表中与主表映射的字段名称;MasterDateView:主表对应的数据视图的名称;MasterKey:主表中与细节表映射的字段名称。