本文摘取 http://hi.baidu.com/buckayro/blog/item/c38ab153b71a5c020cf3e3a7.html
Modifying report page’s properties 修改报表页面属性 有时我们必须从程序代码修改报表页面的设定(例如,修改页面对齐方式或大小)。TfrxReportPage 类别包括下列定义报表页面大小的属性: property Orientation: TPrinterOrientation default poPortrait; property PaperWidth: Extended; property PaperHeight: Extended; property PaperSize: Integer; 属性 «PaperSize» 设定纸张格式。纸张格式必须定义在Windows.pas 中的标准值之一(例如,DMPAPER_A4),FastReport 会自动填入«PaperWidth» 及«PaperHeight» ?属性值(纸张大小以mm 计算)。设定报表格式为 DMPAPER_USER (或 256) 值,将代表自定义纸张大小。在这个案例中,属性 «PaperWidth» 及 «PaperHeight» 的值必须自行指定。下列的范例示范如何修改报表第一页的参数 (假设我们已经产生报表): var Page: TfrxReportPage; { 报表的第一页 } Page := TfrxReportPage(frxReport1.Pages[0]); { 修改页面大小 } Page.PaperSize := DMPAPER_A2; { 修改纸张方向 } Page.Orientation := poLandscape; Report construction with the help of a code FastReport 引擎通常负责报表的创建,某些时候它必须建立一份FastReport 引擎无法处理的非标准格式报表,在这种状况下,我们可以使用«TfrxReport.OnManualBuild»事件撰写程序代码来建立报表,FastReport引擎交由此事件来处理报表,在此的同时,报表建立自动变成下列的方式:FastReport 引擎:-报表的准备工作(script, data sources initialization, bands’ tree forming) -所有的报表运算(aggregate functions, event handlers) -跳页/栏的格式(automatic showing a page/column header/footer,report title/summary) -其他例行性的工作处理程序(Handler): -以特定的次序打印band 的內容«OnManualBuild» 事件处理程序的实体是发出打印特定区域的命令给FastReport 引擎,此引擎本身将执行下列工作:建立新的页面,执行报表的脚本(Scripts)等等。此引擎为 «TfrxCustomEngine» 类别,连接此类别的是«TfrxReport.Engine» 属性。 procedure NewColumn;建立新栏,假如目前是最后一栏,它将自动建立新页。procedure NewPage;建立新页。 procedure ShowBand(Band: TfrxBand); overload;显示数据带(Band)。 procedure ShowBand(Band: TfrxBandClass); overload;显示指定类型的数据带(Band)。 function FreeSpace: Extended;返回页面的可打印空间(以象素表示),在下一个区域出现之后,此值会递减。 property CurColumn: Integer;返回/设定目前的字段编号property CurX: Extended;返回/设定目前X 坐标的位置。 property CurY: Extended;返回/设定目前X 坐标的位置。当下一个Band 输出之后,此值将会變小。 property DoublePass: Boolean;定义报表是否进行两次处理property FinalPass: Boolean;判断目前是否为最后一次处理。 property FooterHeight: Extended;返回页尾的高度。property HeaderHeight: Extended;返回页首的高度。 property PageHeight: Extended;返回可打印页面的高度。property PageWidth: Extended;返回可打印页面的宽度。 property TotalPages: Integer;返回製作完成报表的总页数(仅在二次处理报表的第二次处理时使用)。让我们来看一个简单的处理程序,一个报表有两个位连接数据的«MasterData» 区域,此处理程序以交錯的次序显示区域,每个区域显示六次,在六个区域 之后,出现一小段的分隔(Gap)。 var i: Integer; Band1, Band2: TfrxMasterData; { find required bands } Band1 := frxReport1.FindObject('MasterData1') as TfrxMasterData; Band2 := frxReport1.FindObject('MasterData2') as TfrxMasterData; for i := 1 to 6 do begin { lead/deduce bands one after another } frxReport1.Engine.ShowBand(Band1); frxReport1.Engine.ShowBand(Band2); { make a small gap } if i = 3 then frxReport1.Engine.CurY := frxReport1.Engine.CurY + 10; end; 下个范例显示两个紧邻的組区域。 i var , j: Integer; Band1, Band2: TfrxMasterData; SaveY: Extended; Band1 := frxReport1.FindObject('MasterData1') as TfrxMasterData; Band2 := frxReport1.FindObject('MasterData2') as TfrxMasterData; SaveY := frxReport1.Engine.CurY; for j := 1 to 2 do begin for i := 1 to 6 do begin frxReport1.Engine.ShowBand(Band1); frxReport1.Engine.ShowBand(Band2); if i = 3 then frxReport1.Engine.CurY := frxReport1.Engine.CurY + 10; end; frxReport1.Engine.CurY := SaveY; frxReport1.Engine.CurX := frxReport1.Engine.CurX + 200; end; Printing an array 打印数列 主要的范例程序代码位于 «FastReport Demos /PrintArray» 目录,让我们为您解释数个细节。要打印数列,我们使用含有一个 «Master Data» 区域的报表,这些区域将被显示多次,次数与数列的元素一样。要达到此功能,放置«TfrxUserDataSet»元件在Form 上面,并设定它的属性:RangeEnd := reCount RangeEndCount := 数列的元素个数做完上述设定之后,我们连接数据区域至 «TfrxUserDataSet» 元件。要展现数列的元素,请放置一个內容为[element]的文字物件至«Master Data» 区«element» 变量的值必须由«TfrxReport.OnGetValue» 事件提供。 Printing a TstringList 打印TStringList 主要范例的程序代码位于«FastReport Demos /PrintStringList» 目录,此方法与PrintArray 的方法相同。 Printing a file 打印文件 主要范例的程序代码位于«FastReport Demos/PrintFile» 目录,让我们解释它的细节。 为了打印,你应该使用一个拥有 «Master Data» 区域的报表,此区域仅会被打印一次(要执行此功能,它将会连接至含有一笔数据的Data Source,从DataSource 清单中选取”Single Row” ,允许区域的缩放«Stretch» 及分割«AllowSplit»。这意味著,区域会视区域上所有物件所需的空间大小而自动缩放,假如区域未发现足够空间的話,有一部份的內容将会印在下一页。文件內容可透过物件(內含[file]变量)的 «Text» 属性展现,此变量就如同前一个范例,由«TfrxReport.OnGetValue» 事件提供变量的值,缩放可由物件的«Stretch» 项目或«StretchMode» 属性 = smActualHeight 来设定。 Printing a TStringGrid 打印栅格 最初的范例程序代码位于 «FastReport Demos /PrintStringGrid» 目录,让我们解释某些细节。 «TStringGrid» 元件以多列与行的界面显示数据表的內容,这意味者报表的缩放不只是在高度,连宽度也是一样。要打印这个元件內容,使用 «Cross-tab»物件(? «TfrxCrossObject» 元件加入工程文件才可以使用)。此物件的责任是在未知数据列数及栏数的情況下打印数据表,此物件有两个版本:«TfrxCrossView» ???打印使用者提供的数据,而 «TfrxDBCrossView» 打印来自数据库的数据。让我们使用 TfrxCrossView ,此物件必须事先设定好,要执行此功能,让我们进入报表设计环境并环境物件调用物件编辑器,重复的设定列与栏的标题及数据表字段数目。在我们的案例中,所有的值都必须是«1» 。在我们的范例,列与栏的标题及列与栏的和总值都必须不能修改。必须在StringGrid 的«TfrxReport.OnBeforePrint» 事件填入物件的值,而值须以«TfrxCrossView.AddValue» 方法填入,它的参数填入后:组成一列、一栏及 项目值的索引(因为一个物件包含许多值在一个cell 字段)。 Printing TTable and TQuery 最初的范例出现在 «FastReport’s Demos/PrintTable» 目录,工作的 原理是与TStringGrid 相同的。在这个案例中,列的索引是有次序的编号,栏的 索引则是数据表字段名称的索引编号,cell 的值则是数据表的字段內容,Cell 项 目在«Cross-tab»不能编辑的,这一点是非常的重要,且数据表的标题也是一样。 Working with a list of variables 使用者可以在报表中指定一个或数个变量,变量的值或运算式参考到变量时将会被自动计算,可以被指定到每个变量。变量经由数据树(Data Tree)窗口插入至报表,而经常使用的复杂运算式以变量的别名取代会是非常的方便。当使用报表变量时,我们必须引用 “frxVariables” 单元,变量经由“TfrxVariable” 类别来展现。 TfrxVariable = class(TCollectionItem) published property Name: String;变量名称 property Value: Variant;变量值 end; 变量清单可由“TfrxVariables”类别来表示,它包含所有存取此变量清单的方法。 TfrxVariables = class(TCollection) public function Add: TfrxVariable;加入变量至变量清单的末端 function Insert(Index: Integer): TfrxVariable;加入变量至指定的清单位置 function IndexOf(const Name: String): Integer;返回变量名称的索引 procedure AddVariable(const ACategory, AName: String; const AValue: Variant);加入变量至指定的类别 procedure DeleteCategory(const Name: String);刪除类别及此类别下的所有变量。 procedure DeleteVariable(const Name: String);刪除一个变量 procedure GetCategoriesList(List: TStrings; ClearList: Boolean= True);返回类别清单 procedure GetVariablesList(const Category: String; List:TStrings);返回指定类别中的所有变量清单property Items[Index: Integer]: TfrxVariable readonly;变量清单 property Variables[Index: String]: Variant; default;变量值 end;假如变量清单很长,经由变量类别的区分是非常方便的。例如,当有下列的变量清单: Customer name Account number in total total vat 也可以用下列方式表示: Properties Customer name Account number Totals In total total vat 有下列的限制: -至少必须建立一个变量类别-类别是第一层,变量是第二层-不可有巢狀的类别-变量的名称必须是唯一 Creating a list of variables 建立变量清单 报表变量储存在“TfrxReport.Variables”属性中,要手动建立变量清单, 必须执行下列的步骤:-清除变量清单-建立类别-建立变量-重复步骤2, 3 建立其他的类别 Clearing a list of variables 清除所有变量 透过 “TfrxVariables.Clear” 方法的协助,我们可以清除所有的变量:frxReport1.Variables.Clear; Adding a category 新增变量分类 至少必须建立一个变量分类。类别和变量存放在同一个清单(List),类别与变量最大的不同在于类别名称的第一个字元是空白。所有的变量紧接在类别之后,并被视为属于此一类别。新增类别的方式有两种方法: frxReport1.Variables[' ' + 'My Category 1'] := Null; 或 C var ategory: TfrxVariable; Category := frxReport1.Variables.Add;Category.Name := ' ' + 'My category 1'; Adding a variable 新增变量 只有在变量类别已经新增之后,才可以新增变量。所有的变量清单的位置紧接在类别之后,并被视为属于此一类别,然变量的名称不只在类别是唯一的,且所有的变量名称都不能相同。有多种方法可加入变量至变量清单: frxReport1.Variables['My Variable 1'] := 10;此方法可新增变量或修改已存在变量的值。 var Variable: TfrxVariable; Variable := frxReport1.Variables.Add; Variable.Name := 'My Variable 1'; Variable.Value := 10; 两种新增变量的方法可加入变量至清单的末端,假如变量要加入至指定的位置,请使用 “Insert” 方法: var Variable: TfrxVariable; Variable := frxReport1.Variables.Insert(1); Variable.Name := 'My Variable 1'; Variable.Value := 10; 假如变量要加至指定的分类,请使用“AddVariable”方法: frxReport1.Variables.AddVariable('My Category 1', 'My Variable2', 10); Deleting a variable 刪除变量 frxReport1.Variables.DeleteVariable('My Variable 2'); Deleting a category 刪除变量类别 刪除变量类别及其下所有的变量,使用下列程序代码: frxReport1.Variables.DeleteCategory('My Category 1'); Modifying the variable’s '76alue 修改变量的值 有两种方法可修改变量的值:frxReport1.Variables['My Variable 2'] := 10; 或Var Index: Integer; Variable: TfrxVariable; { search for the variable } Index := frxReport1.Variables.IndexOf('My Variable 2'); { if it is found, change a value } if Index <> -1 then begin Variable := frxReport1.Variables.Items[Index]; |