程序员手册.doc

上传人:本田雅阁 文档编号:2065164 上传时间:2019-02-09 格式:DOC 页数:32 大小:125.02KB
返回 下载 相关 举报
程序员手册.doc_第1页
第1页 / 共32页
程序员手册.doc_第2页
第2页 / 共32页
程序员手册.doc_第3页
第3页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《程序员手册.doc》由会员分享,可在线阅读,更多相关《程序员手册.doc(32页珍藏版)》请在三一文库上搜索。

1、一、使用TfrxReport 组件工作1、加载并存储报表默认情况下,报表窗体同项目窗体构存储在同一个DFM文件中。多数情况下,无须再操作,因而你就不必采用特殊方法加载报表。如果你决定在文件中存储报表窗体或者是数据库的Blob字段(他提供了非常大的弹性,你能够在非编译程序中修改),你必须使用“TfrxReport”提供的加载和存储方法。function LoadFromFile(const FileName: String; ExceptionIfNotFound: Boolean = False): Boolean;从一个给定名字文件中加载报表。如果第二个参数等于“True”并且文件没找到,那

2、么他会触发一个异常。如果文件加载成功,他返回“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);frxRep

3、ort1-SaveToFile(c:2.fr3);2.设计报表通过“TfrxReport.DesignReport”方法调用报表设计器。你必须在你的项目中包含报表设计器(必要条件是:要么使用“TfrxDesigner”组件,要么增加“frxDesgn”单元到uses列表)“DesigReport”方法接受两个默认参数:procedure DesignReport(Modal: Boolean = True; MDIChild: Boolean = False);Modal参数决定设计器是否被模态,MDIChild参数允许把设计器窗体作为一个MDI子窗体。例如:frxReport1.Design

4、Report;3.运行报表应用下面两个“TfrxReport”方法中的一个启动报表:procedure ShowReport(ClearLastReport: Boolean = True);启动报表并在预览窗体中显示。如果“ClearLastReport”参数等于“False”,报表将会增加先前的一个报表结果,否则清除前一个报表结构。function PrepareReport(ClearLastReport: Boolean = True): Boolean;启动报表,没有打开预览窗体,参数赋值与“ShowReport”方法同名。如果报表构造成功,他返回“True”。多数情况下,使用第一种

5、方法更为方便一些。在报表被构造的同时,他会立刻显示一个预览窗体。当需要增加另一个报表到前一个报表中的时候,“ClearLastReport”参数显得方便些。(此类技术用于批量报表打印)。例如:frxReport1.ShowReport; 4.预览报表使用两种途径显示一个报表是可能的:两者都是调用“TfrxReport.ShowReport”方法(先前描述过了),或者使用“TfrxReport.ShowPreparedReport”方法来帮助实现。在第二种情况下,报表构造没有被执行,但显示了一个完成的报表。也就是说,你要么在“PreparedReport”方法帮助下构造他,要么在构造前从文件中加

6、载报表(查看“加载存储完成的报表”)例如:Pascal:if frxReport1.PrepareReport then frxReport1.ShowPreparedReport;C+:if(frxReport1-PrepareReport(true) frxReport1-ShowPreparedReport(); 在这种情况下,报表构造器先被完成了,并显示在预览窗体中。构造一个庞大的报表可能要花费很多时间,那就是为什么使用“ShowReport”非等时同步方法会好于“PrepareReport/ShowPreparedReport”方法。你可以通过“TfrxReport.PreviewO

7、ptions”属的缺省值设定预览参数值。(这句翻译的不够好,请参考原文)原文参考: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 “PrepareRepor

8、t/ShowPreparedReport” one. One can assign preview settings by default via the “TfrxReport.PreviewOptions” property.5、打印报表大多数情况下,你可以从预览窗体打印报表。要人工打印报表,你应该使用“TfrxReport.Print”方法,例如:frxReport1.LoadFromFile(.);frxReport1.PrepareReport;frxReport1.Print;同时,你可以在显示的打印对话框中设置打印参数,你也可以使用默认设定值。取消打印对话框,请参考“TfrxRe

9、port.PrintOptions”属性帮助6.载入并存储报表这个功能可以在预览窗口中执行。也可以使用手工方法执行,帮助参考“TfrxReport.PreviewPages”方法: function LoadFromFile(const FileName: String; ExceptionIfNotFound: Boolean = False): Boolean; procedure SaveToFile(const FileName: String); procedure LoadFromStream(Stream: TStream); procedure SaveToStream(Str

10、eam: TStream);赋值和参数化类似与TfrxReport相应的方法。文件包含了完成的报表,默认情况下以“FP3”为扩展名。例如:Pascal:frxReport1.PreviewPages.LoadFromFile(c:1.fp3);frxReport1.ShowPreparedReport;C+:frxReport1-PreviewPages-LoadFromFile(c:1.fp3);frxReport1-ShowPreparedReport();注意,完成的报表加载完毕后,预览方法是通过“ShowPreparedReport” 方法执行的。7.导出报表他可以从预览窗口中执行。也

11、可以手动操作,通过“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在标准的预览窗口中显示报表。如果因为某些原因而不适合你,你可以创建一

12、个自定义预览窗体。为了这个目的,需要设计FastReport组件面板中的“TfrxReport”组件。要显示报表,TfrxReport.Preview方法应该连接到这个组件。在使用TfrxPreview组件的时候,有两个典型的问题。他不会处理按键(箭头,PgUp,PgDown等等)和鼠标滚轮(如果有的话)。要让TfrxPreview同按键工作,设置焦点给他(他是可以做到的,例如,在窗体的OnShow事件句柄中)frxPreview.SetFocus;要让TfrxPreview同鼠标滚轮工作,你必须创建OnMouseWheel事件句柄,并且调用TfrxPreview.MouseWheelScro

13、ll方法。procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);begin frxPreview1.MouseWheelScroll(WheelDelta);end;9.建立复合报表(批量打印) 在某些情况下,需要立刻组织几个报表打印,或者在一个打印预览窗体中封装并呈现几个报表。要执行这些,在FastReport中有些工具能够允许建立一个新的报表附加在一个已经存在的报表上。“TfrxRepo

14、rt.PrepareReport”方法中有一个选项“ClearLasReport”布尔类型参数,默认情况下他等于True,这个参数定义了是否有必要在建立报表时清除前一个报表。下面的方法展示了如何从两个报表中建立一个批量报表:Pascal:frxReport1.LoadFromFile(1.fr3);frxReport1.PrepareReport;frxReport1.LoadFromFile(2.fr3);frxReport1.PrepareReport(False);frxReport1.ShowPreparedReport;C+:frxReport1-LoadFromFile(1.fr3

15、);frxReport1-PrepareReport(true);frxReport1-LoadFromFile(2.fr3);frxReport1-PrepareReport(false);frxReport1-ShowPreparedReport(); 我们加载并建立第一个报表,但并没有显示他。然后我们加载第二个报表到同一个TfrxReport对象,并使用“ClearLastReport”参数,让他等于False。这就允许第二个报表附加在先前建立的报表之后。接下来,我们在预览窗口中显示一个完成的报表。9.1 复合报表中的页数 你可以使用“Page”,“Page#”,“TotalPages”

16、和“TotalPages#”系统变量显示页数或总页数,在复合报表中,这些变量以下面的方式工作:Page - 当前报表页数Page# - 批量报表页数TotalPages - 当前报表总页数(报表必须两遍)Totalpages# - 批量报表总页数9.2 合并符合报表页数 正如上面所说的,报表设计页中的“PrintOnPrevousPage”方法让你在打印报表的时候使用前一页的剩余空间接合报表。在复合报表中,允许你在前一个报表的最后一页的剩余空间创建一个新的报表。要执行这个,要使能每一个连续报表的第一个设计页“PrintOnPreviousePage”属性 10.交互报表 在交互报表中,你可以在

17、预览窗口定义任意报表对象的鼠标单击反应。例如,一个用户能够单击数据线,结果运行一个带有选择线的明细数据。 任何报表都能交互。要执行他,你仅仅需要创建TfrxReport.OnClickObject事件句柄。下面代码是这个事件句柄的示例:Pascal:procedure TForm1.frxReport1ClickObject(Page: TfrxPage; View: TfrxView; Button: TMouseButton; Shift: TShiftState; var Modified: Boolean);begin if View.Name = Memo1 then ShowMes

18、sage(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

19、Shift, bool &Modified) TfrxMemoView * Memo; if(Memo = dynamic_cast (Sender) if(Memo-Name = Memo1) ShowMessage(Memo1 contents:nr + Memo-Text); if(Memo-Name = Memo2) Memo-Text = InputBox(Edit, Edit Memo2 text:, Memo-Text); Modified = true; 在对象的单击事件句柄上,你可以做如下事情:- 修改一个对象或页的内容,传递句柄(结果,被修改的将被特殊标记,因此修改的内容应

20、该引起重视);- 由于使用重构或重新建立报表,调用TfrxReport.PrepareReport方法在此例中,点击名字为memo1对象的结果显示这个对象内容的消息。当点击memo2是显示一个对话框,这个对象的内容可能被修改。设置Modified标志为True,允许保持和显示变更。 同样的方法,单击事件可以被定义成不同的响应。例如,运行一个新报表。如下注释是必要的。在FastReport3版本中,一个报表组件可以在一个预览窗口中显示唯一的报表(不像FastReport2.x版本)。那就是为什么一个报表预览窗也会在分开的对象中运行一个报表,或者是同一个对象,但当前报表必须被抹除。 关于给终端用户

21、一个可单击对象提示定位,在预览窗口中,鼠标经过一个可单击对象的时候,我们可以修改鼠标的光标。要做到这些,在报表设计器上选择一个要设计的对象并设置他的cursor属性为不同于crDefault的某个值。更多的细节涉及到定义的单击对象。在简单报表中,可以依照对象的名字或他的内容来定义。然而,这就不能更多的执行可修改的事例。例如,一个明细报表应当在一个数据选择行被创建。一个用户单击了内容为12的memo1对象。数据行让这个对象参考什么?那就是为什么你应当知道主键了,主键用于明确的标识这一行。FastReport能够赋值一个字串,包含任意数据(在我们的事例主键数据中),对于每个报表对象,这个字串存储在

22、TagStr属性中。 让我们来通过一个报表的例子来举例说明,这个报表包含在FastReportDemo.exe-Simple list示例中。这是一个公司的客户列表,包含诸如客户名称,地址,联系人等数据。数据源是来自DBDEMOS演示数据库的Customer.db表。这个表有一个主键,CustNO字段,他没有出现在报表中。我们的任务是终止他通过参考单击完成报表上的任意对象记录他,这就意味着要获取主键的值,要执行此项操作,就要为所有对象的TagStr属性加入值,依赖于主数据栏:Customers.CustNo 在报表建立期间,使用相同的方法计算TagStr属性内容,同时计算文本对象的内容;这就意

23、味着变量值会替代所有变量的位置。变量细节使用方括号括起来。那就是为什么行值是1005, 2112等类似值了。在报表建立后,包含TagStr属性对象的类型取决与主数据栏。一个简单的从字串到整形的转换就会提供给我们一个主键的值,这也是所需记录能够找到的主键。 如果主键是复合的(包含多个字段),TagStr属性的内容可能是如下值:Table1.Field1;Table1.Field2在构造一个报表完成后,TagStr属性包含“1000;1”类型值, 此值不同比相同要好。11.从代码中存取报表对象报表对象(例如:report page, band, memo-object)是不能在你的代码中直接存取的

24、。这就意味着你不能通过名字寻址对象。例如,当你在你的窗体上寻址一个按钮。要寻址一个对象,在TfrxReport.FindObject方法中找到帮助:Pascal:var Memo1: TfrxMemoView;Memo1 := frxReport1.FindObject(Memo1) as TfrxMemoView;C+:TfrxMemoView * Memo = dynamic_cast (frxReport1-FindObject(Memo1);然后,你就能够寻址对象的属性和方法。你也使用“TfrxReport.Pages”属性寻址报表页。Pascal:var Page1: TfrxRep

25、ortPage;Page1 := frxReport1.Pages1 as TfrxReportPage;C+:TfrxReportPage * Page1 = dynamic_cast (frxReport1-Pages1);12.从代码中创建报表作为一项规则,你将在设计器中创建多数报表。然而,在某些情况下(例如,当报表窗体未知的时候),使用代码手工创建一个报表是是十分必要的。想要手工创建一个报表,你需要执行下面的顺序步骤:- 清除报表组件- 添加数据源- 添加数据页- 添加报表页- 添加栏页- 设置栏属性,接着把他们同数据相连- 在每个栏上加入对象- 设置对象属性,接着把他们同数据相连让我

26、们来检查一下创建一个简单报表的类型列表。假设我们拥有如下组件:frxReport1: TfrxReport and frxDBDataSet1: TfrxDBDataSet(最后一个连接到DBDEMOS数据,Customer.db表)。我们的报表将包含一个带有报表标题和主数据栏的页。在报表标题栏上有一个带有“Hellow FastReport”文本的对象,主数据栏包含一个带有连接到“CustNo”字段的对象。Pascal:var DataPage: TfrxDataPage; Page: TfrxReportPage; Band: TfrxBand; DataBand: TfrxMasterD

27、ata; Memo: TfrxMemoView; 清除报表 frxReport1.Clear; 为报表添加数据集到可存取的列表中 frxReport1.DataSets.Add(frxDBDataSet1); 添加Data页 DataPage := TfrxDataPage.Create(frxReport1); 添加页 Page := TfrxReportPage.Create(frxReport1); 创建唯一名称 Page.CreateUniqueName; 设置默认字段大小, 纸张和打印方向 Page.SetDefaults; 修改纸张方向 Page.Orientation := po

28、Landscape; 添加一个报表标题栏 Band := TfrxReportTitle.Create(Page);Band.CreateUniqueName; it is sufficient to set the ?Top? coordinate and height for a band both coordinates are in pixels Band.Top := 0;Band.Height := 20; 为标题栏添加一个对象 Memo := TfrxMemoView.Create(Band);Memo.CreateUniqueName;Memo.Text := Hello Fa

29、stReport!;Memo.Height := 20; 这个对象将伸展坐标到栏的宽度 Memo.Align := baWidth; 添加主数据栏 DataBand := TfrxMasterData.Create(Page);DataBand.CreateUniqueName;DataBand.DataSet := frxDBDataSet1; 顶端的调整应当比先前加入栏的顶部+高度大一些 DataBand.Top := 100;DataBand.Height := 20; 在主数据栏上添加一个对象 Memo := TfrxMemoView.Create(DataBand);Memo.Cre

30、ateUniqueName; 连接数据 Memo.DataSet := frxDBDataSet1;Memo.DataField := CustNo;Memo.SetBounds(0, 0, 100, 20); 调整文本到右侧的对象边缘 Memo.HAlign := haRight; 显示报表 frxReport1.ShowReport;C+:TfrxDataPage * DataPage;TfrxReportPage * Page;TfrxBand * Band;TfrxMasterData * DataBand;TfrxMemoView * Memo;/ 清除报表 frxReport1-C

31、lear();/ 在报表上添加一个数据集到数据集存取列表frxReport1-DataSets-Add(frxDBDataset1);/ 添加“数据”页DataPage = new TfrxDataPage(frxReport1);/ 添加一页Page = new TfrxReportPage(frxReport1);/ 创建一个不重复的名称Page-CreateUniqueName();/ 设置域大小, 纸张和默认的打印方向Page-SetDefaults();/ 修改纸张的打印方向Page-Orientation = poLandscape;/ 增加一个报表标题栏Band = new Tf

32、rxReportTitle(Page);Band-CreateUniqueName();/ 为栏充分设置顶部坐标和高度/ 在像素上包含坐标Band-Top = 0;Band-Height = 20;/ 在报表标题栏加入一个对象Memo = new TfrxMemoView(Band);Memo-CreateUniqueName();Memo-Text = Hello FastReport!;Memo-Height = 20;/ 此对象将会被按照栏的宽度延展Memo-Align = baWidth;/ 添加主数据栏DataBand = new TfrxMasterData(Page);DataB

33、and-CreateUniqueName();DataBand-DataSet = frxDBDataset1;/ 顶部坐标应该大于前边添加栏的顶部坐标+高度DataBand-Top = 100;DataBand-Height = 20;/ 主数据上加入一个对象Memo = new TfrxMemoView(DataBand);Memo-CreateUniqueName();/ 连接到数据Memo-DataSet = frxDBDataset1;Memo-DataField = CustNo;Memo-SetBounds(0, 0, 100, 20);/ 调整文本到右侧对象的空白Memo-HA

34、lign = haRight;/ 显示报表frxReport1-ShowReport(true);让我们来解释一些细节: 所有在报表中使用的数据集都必须添加到数据源列表中,在我们示例中,是用frxReport1.DataSets.Add(frxDBDataSet1)这一行执行的。否则,报表就不会工作。 数据页对于插入内部数据集是必要的,例如TfrxADOTable。这些数据集只能放在数据页。 调用Page.SetDefaults不是必须的,因为在这个案例中页A4纸张设置和页边距都是0毫米。默认值设置10毫米页边距,并捕获打印机页大小和对齐方式。 在增加栏到页面的同时,你要确认他们没有互相重叠在

35、一起。要执行他,顶部和高度的坐标是相似的。总是要在设计器中定位相同的位置的。 对象的坐标和大小是以像素为单位的,因为所有对象的left, Top, Width和Height属性都拥有扩展类型,你能够指出非整形值。下面常量用于转化像素到厘米和英寸:fr01cm = 3.77953;fr1cm = 37.7953;fr01in = 9.6;fr1in = 96;例如,一个栏的高度等于5毫米如下设定:Band.Height := fr01cm * 5; Band.Height := fr1cm * 0.5; 12.代码中创建对话框 我们知道,报表可以包含对话框窗体。下面的例子展示了如何创建一个带有O

36、K按钮的对话框窗体:Pascal: for working with dialogue objects the following unit should be used uses frxDCtrl;var Page: TfrxDialogPage; Button: TfrxButtonControl; 添加页 Page := TfrxDialogPage.Create(frxReport1); 创建唯一名称 Page.CreateUniqueName; 设置大小 Page.Width := 200;Page.Height := 200; 设定位置 Page.Position := poScr

37、eenCenter; 添加一个按钮 Button := TfrxButtonControl.Create(Page);Button.CreateUniqueName;Button.Caption := OK;Button.ModalResult := mrOk;Button.SetBounds(60, 140, 75, 25); 显示报表 frxReport1.ShowReport; C+:/使用对话框对象工作,会用到下面的单元#include frxDCtrl.hppTfrxDialogPage * Page;TfrxButtonControl * Button;/添加一页Page = ne

38、w TfrxDialogPage(frxReport1);/创建唯一名称Page-CreateUniqueName();/设置大小Page-Width = 200;Page-Height = 200;/设定位置Page-Position = poScreenCenter;/ 添加一个按钮Button = new TfrxButtonControl(Page);Button-CreateUniqueName();Button-Caption = OK;Button-ModalResult = mrOk;Button-SetBounds(60, 140, 75, 25);/显示报表 frxRepo

39、rt1-ShowReport(true);fast report 的使用说明1. TfrxDBDataset TfrxUserDataset 数据存取元件。 FastReport 使用这些元件读取及参考数据库的字段,这两个元件都源于 “TfrxDataSet” 并继承其大部分的功能。 TfrxUserDataSet 元件允许构建未连接到数据库的报表,而由其它来源接收数(据如:数列、文件等)。在此同时,程序员仅需提供浏览此数据集的功能,资料接收并非由此元件执行,而是用其它的方法(例如,经由“TfrxReport.OnGetValue”事件)。 TfrxUserDataSet 元件有下列的属性:

40、(1) property RecNo: Integer readonly;目前记录编号,首笔的记录编号是“0” (2) property Enabled: Boolean default True;定义此 元 件是否可在designer 里面使用。 (3) property RangeBegin: TfrxRangeBegin default rbFirst;数据导航(navigation)的起点。 下列的值可以使用: rbFirst 从数据的第一笔记录开始。rbCurrent 从当前的记录开始 (4) property RangeEnd: TfrxRangeEnd default reLas

41、t;数据导航(navigation)的起点。 下列的值可以使用: reLast 直到数据结束。ReCurrent 直到目前的记录。reCount 依“RangeEndCount” 属性而 定。 (5) property RangeEndCount: Integer;数据集中的数据个数,此功能只在“RangeEnd”属性等于reCount 有效。 (6) property UserName: String;符号名称。在报表设计环境(Designer)下,将被显示于DataSet 的下方。 (7) property OnCheckEOF: TfrxCheckEOFEvent; TfrxCheckE

42、OFEvent = procedure(Sender: TObject; var Eof: Boolean)of object; 此事件在数据集的尾端时,Eof 参数将返回True。 (8) property OnFirst: TNotifyEvent;数据集移至第一笔的位置时,会触发此事件。 (9) property OnNext: TNotifyEvent;数据集移至下一笔的位置时,会触发此事件。 (10)property OnPrior: TNotifyEvent;数据集移至上一笔的位置时,会触发此事件。2. TfrxDBDataSet 元件用来连接以TDataSet, TTable 及

43、TQuery 为基类的数据库元件,有关数据的导航及字段的参考都是自动的,程序员不需特殊的设定。 除上述属性外,该元件有下列的属性: (1) property CloseDataSource: Boolean default False;报表创建完成后,关闭数据库。 (2) property OpenDataSource: Boolean default True;在报表创建之前打开数据库。 (3) property FieldAliases: TStrings;数据集字段的符号名称(别名)。 (4) property DataSet: TDataSet; (5) property DataSource: TDataSource;连结至TDataSet 或TDataSource 类型的元件。 (6) property OnClose: TNotifyEvent;当关闭数据集时触发此事件。 (7) property OnOpen: TNotifyEvent;当打开数据集时触发此事件 3. TfrxDesigner TfrxDesigner 元件是报表设计器,当使用此元件,你的工程文件就可以使用报表设计器

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1