hize

导航

fast report(4)

 

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];

Variable.Value := 10;

end;

posted on 2005-10-31 17:56  hize  阅读(2588)  评论(1编辑  收藏  举报