在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、使用TfrxReport 组件工作 1、加载并存储报表 默认情况下,报表窗体同项目窗体构存储在同一个DFM文件中。多数情况下,无须再操作,因而你就不必采用特殊方法加载报表。如果你决定在文件中存储报表窗体或者是数据库的 Blob字段(他提供了非常大的弹性,你能够在非编译程序中修改),你必须使用“TfrxReport”提供的加载和存储方法。 function LoadFromFile(const FileName: String; ExceptionIfNotFound: Boolean = False): Boolean; 从一个给定名字文件中加载报表。如果第二个参数等于“True”并且文件没找到,那么他会触发一个异常。如果文件加载成功,他返回“True”。 procedure LoadFromStream(Stream: TStream); 从流中加载报表。 procedure SaveToFile(const FileName: String); 用特殊名称文件存储报表。 procedure SaveToStream(Stream: TStream); 把报表存在流中。 例如: Pascal: frxReport1.LoadFromFile('c:\1.fr3'); frxReport1.SaveToFile('c:\2.fr3'); C++: frxReport1->LoadFromFile("c:\\1.fr3"); frxReport1->SaveToFile("c:\\2.fr3"); 2.设计报表 通过“TfrxReport.DesignReport”方法调用报表设计器。你必须在你的项目中包含报表设计器(必要条件是:要么使用“TfrxDesigner”组件,要么增加“frxDesgn”单元到uses 列表) “DesigReport”方法接受两个默认参数: procedure DesignReport(Modal: Boolean = True; MDIChild: Boolean = False); Modal参数决定设计器是否被模态,MDIChild参数允许把设计器窗体作为一个MDI子窗体。 例如: frxReport1.DesignReport; 3.运行报表 应用下面两个“TfrxReport”方法中的一个启动报表: procedure ShowReport(ClearLastReport: Boolean = True); 启动报表并在预览窗体中显示。如果“ClearLastReport”参数等于“False”,报表将会增加先前的一个报表结果,否则清除前一个报表结构。 function PrepareReport(ClearLastReport: Boolean = True): Boolean; 启动报表,没有打开预览窗体,参数赋值与“ShowReport”方法同名。如果报表构造成功,他返回“True”。 多数情况下,使用第一种方法更为方便一些。在报表被构造的同时,他会立刻显示一个预览窗体。 当需要增加另一个报表到前一个报表中的时候,“ClearLastReport”参数显得方便些。(此类技术用于批量报表打印)。 例如: frxReport1.ShowReport;
4.预览报表 使用两种途径显示一个报表是可能的:两者都是调用“TfrxReport.ShowReport”方法(先前描述过了),或者使用“TfrxReport.ShowPreparedReport”方法来帮助实现。在第二 种情况下,报表构造没有被执行,但显示了一个完成的报表。也就是说,你要么在“PreparedReport”方法帮助下构造他,要么在构造前从文件中加载报表(查看“加载/存储完 成的报表”) 例如: Pascal: if frxReport1.PrepareReport then frxReport1.ShowPreparedReport; C++: if(frxReport1->PrepareReport(true)) frxReport1->ShowPreparedReport(); 在这种情况下,报表构造器先被完成了,并显示在预览窗体中。构造一个庞大的报表可能要花费很多时间,那就是为什么使用“ShowReport”非等时同步方法会好于 “PrepareReport/ShowPreparedReport”方法。你可以通过“TfrxReport.PreviewOptions”属的缺省值设定预览参数值。(这句翻译的不够好,请参考原文) 原文参考:In this case, report construction is finished first, and after that it is displayed in the preview window. Construction of a large report can take a lot of time, and that is why it is better to use the “ShowReport anisochronous” method, than the “PrepareReport/ShowPreparedReport” one. One can assign preview settings by default via the “TfrxReport.PreviewOptions” property.[SPAN]5、打印报表 大多数情况下,你可以从预览窗体打印报表。要人工打印报表,你应该使用“TfrxReport.Print”方法,例如: frxReport1.LoadFromFile(...); frxReport1.PrepareReport; frxReport1.Print; 同时,你可以在显示的打印对话框中设置打印参数,你也可以使用默认设定值。取消打印对话框,请参考“TfrxReport.PrintOptions”属性帮助 6.载入并存储报表 这个功能可以在预览窗口中执行。也可以使用手工方法执行,帮助参考“TfrxReport.PreviewPages”方法: function LoadFromFile(const FileName: String; ExceptionIfNotFound: Boolean = False): Boolean; procedure SaveToFile(const FileName: String); procedure LoadFromStream(Stream: TStream); procedure SaveToStream(Stream: TStream); 赋值和参数化类似与TfrxReport相应的方法。文件包含了完成的报表,默认情况下以“FP3”为扩展名。 例如: Pascal: frxReport1.PreviewPages.LoadFromFile('c:\1.fp3'); frxReport1.ShowPreparedReport; C++: frxReport1->PreviewPages->LoadFromFile("c:\\1.fp3"); frxReport1->ShowPreparedReport(); 注意,完成的报表加载完毕后,预览方法是通过“ShowPreparedReport” 方法执行的。 7.导出报表 他可以从预览窗口中执行。也可以手动操作,通过“FfrxReport.Export”方法,及这个方法中的参数,你可以导出你想要导出的文件类型: frxReport1.Export(frxHTMLExport1); 导出过滤组件必须是有效的(你必须把他们放到你项目中的窗体上)并调整正确。 The export filter component must be available (you must put it on the form of your project) and be adjusted correctly. 8.创建自定义预览窗体 FastReport在标准的预览窗口中显示报表。如果因为某些原因而不适合你,你可以创建一个自定义预览窗体。为了这个目的,需要设计FastReport组件面板中的“TfrxReport”组 件。要显示报表,TfrxReport.Preview方法应该连接到这个组件。 在使用TfrxPreview组件的时候,有两个典型的问题。他不会处理按键(箭头,PgUp,PgDown等等)和鼠标滚轮(如果有的话)。要让TfrxPreview同按键工作,设置焦点给他(他 是可以做到的,例如,在窗体的OnShow事件句柄中) frxPreview.SetFocus; 要让TfrxPreview同鼠标滚轮工作,你必须创建OnMouseWheel事件句柄,并且调用TfrxPreview.MouseWheelScroll方法。 procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); begin frxPreview1.MouseWheelScroll(WheelDelta); end; 9.建立复合报表(批量打印) 在某些情况下,需要立刻组织几个报表打印,或者在一个打印预览窗体中封装并呈现几个报表。要执行这些,在FastReport中有些工具能够允许建立一个新的报表附加在一个 已经存在的报表上。“TfrxReport.PrepareReport”方法中有一个选项“ClearLasReport”布尔类型参数,默认情况下他等于True,这个参数定义了是否有必要在建立报表时清除 前一个报表。下面的方法展示了如何从两个报表中建立一个批量报表: Pascal: frxReport1.LoadFromFile('1.fr3'); frxReport1.PrepareReport; frxReport1.LoadFromFile('2.fr3'); frxReport1.PrepareReport(False); frxReport1.ShowPreparedReport; C++: frxReport1->LoadFromFile("1.fr3"); frxReport1->PrepareReport(true); frxReport1->LoadFromFile("2.fr3"); frxReport1->PrepareReport(false); frxReport1->ShowPreparedReport(); 我们加载并建立第一个报表,但并没有显示他。然后我们加载第二个报表到同一个TfrxReport对象,并使用“ClearLastReport”参数,让他等于False。这就允许第二个报表 附加在先前建立的报表之后。接下来,我们在预览窗口中显示一个完成的报表。 9.1 复合报表中的页数 你可以使用“Page”,“Page#”,“TotalPages”和“TotalPages#”系统变量显示页数或总页数,在复合报表中,这些变量以下面的方式工作: Page - 当前报表页数 Page# - 批量报表页数 TotalPages - 当前报表总页数(报表必须两遍) Totalpages# - 批量报表总页数 9.2 合并符合报表页数 正如上面所说的,报表设计页中的“PrintOnPrevousPage”方法让你在打印报表的时候使用前一页的剩余空间接合报表。在复合报表中,允许你在前一个报表的最后一页的剩 余空间创建一个新的报表。要执行这个,要使能每一个连续报表的第一个设计页“PrintOnPreviousePage”属性[SPAN]10.交互报表 在交互报表中,你可以在预览窗口定义任意报表对象的鼠标单击反应。例如,一个用户能够单击数据线,结果运行一个带有选择线的明细数据。 任何报表都能交互。要执行他,你仅仅需要创建TfrxReport.OnClickObject事件句柄。下面代码是这个事件句柄的示例: Pascal: procedure TForm1.frxReport1ClickObject(Page: TfrxPage; View: TfrxView; Button: TMouseButton; Shift: TShiftState; var Modified: Boolean); begin if View.Name = 'Memo1' then ShowMessage('Memo1 contents:' + #13#10 + TfrxMemoView(View).Text); if View.Name = 'Memo2' then begin TfrxMemoView(View).Text := InputBox('Edit', 'Edit Memo2 text:', TfrxMemoView(View).Text); Modified := True; end; end; C++: void __fastcall TForm1::frxReport1ClickObject(TfrxView *Sender, TMouseButton Button, TShiftState Shift, bool &Modified) { TfrxMemoView * Memo; if(Memo = dynamic_cast <TfrxMemoView *> (Sender)) { if(Memo->Name == "Memo1") ShowMessage("Memo1 contents:\n\r" + Memo->Text); if(Memo->Name == "Memo2") { Memo->Text = InputBox("Edit", "Edit Memo2 text:", Memo->Text); Modified = true; } } } 在对象的单击事件句柄上,你可以做如下事情: - 修改一个对象或页的内容,传递句柄(结果,被修改的将被特殊标记,因此修改的内容应该引起重视); - 由于使用重构或重新建立报表,调用TfrxReport.PrepareReport方法 在此例中,点击名字为memo1对象的结果显示这个对象内容的消息。当点击memo2是显示一个对话框,这个对象的内容可能被修改。设置Modified标志为True,允许保持和显示变更 。 FastReport2.x版本)。那就是为什么一个报表预览窗也会在分开的对象中运行一个报表,或者是同一个对象,但当前报表必须被抹除。 关于给终端用户一个可单击对象提示定位,在预览窗口中,鼠标经过一个可单击对象的时候,我们可以修改鼠标的光标。要做到这些,在报表设计器上选择一个要设计的对象并设置 他的cursor属性为不同于crDefault的某个值。 更多的细节涉及到定义的单击对象。在简单报表中,可以依照对象的名字或他的内容来定义。然而,这就不能更多的执行可修改的事例。例如,一个明细报表应当在一个数据选择 行被创建。一个用户单击了内容为12的memo1对象。数据行让这个对象参考什么?那就是为什么你应当知道主键了,主键用于明确的标识这一行。FastReport能够赋值一个字串,包 含任意数据(在我们的事例主键数据中),对于每个报表对象,这个字串存储在TagStr属性中。 让我们来通过一个报表的例子来举例说明,这个报表包含在FastReportDemo.exe-'Simple list'示例中。这是一个公司的客户列表,包含诸如客户名称,地址,联系人等数据。数 据源是来自DBDEMOS演示数据库的Customer.db表。这个表有一个主键,CustNO字段,他没有出现在报表中。我们的任务是终止他通过参考单击完成报表上的任意对象记录他,这就 意味着要获取主键的值,要执行此项操作,就要为所有对象的TagStr属性加入值,依赖于主数据栏: [Customers."CustNo"]
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论