FastReport 程序员手册.docx

上传人:b****0 文档编号:17627944 上传时间:2023-07-27 格式:DOCX 页数:18 大小:22.46KB
下载 相关 举报
FastReport 程序员手册.docx_第1页
第1页 / 共18页
FastReport 程序员手册.docx_第2页
第2页 / 共18页
FastReport 程序员手册.docx_第3页
第3页 / 共18页
FastReport 程序员手册.docx_第4页
第4页 / 共18页
FastReport 程序员手册.docx_第5页
第5页 / 共18页
FastReport 程序员手册.docx_第6页
第6页 / 共18页
FastReport 程序员手册.docx_第7页
第7页 / 共18页
FastReport 程序员手册.docx_第8页
第8页 / 共18页
FastReport 程序员手册.docx_第9页
第9页 / 共18页
FastReport 程序员手册.docx_第10页
第10页 / 共18页
FastReport 程序员手册.docx_第11页
第11页 / 共18页
FastReport 程序员手册.docx_第12页
第12页 / 共18页
FastReport 程序员手册.docx_第13页
第13页 / 共18页
FastReport 程序员手册.docx_第14页
第14页 / 共18页
FastReport 程序员手册.docx_第15页
第15页 / 共18页
FastReport 程序员手册.docx_第16页
第16页 / 共18页
FastReport 程序员手册.docx_第17页
第17页 / 共18页
FastReport 程序员手册.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

FastReport 程序员手册.docx

《FastReport 程序员手册.docx》由会员分享,可在线阅读,更多相关《FastReport 程序员手册.docx(18页珍藏版)》请在冰点文库上搜索。

FastReport 程序员手册.docx

FastReport程序员手册

一、使用TfrxReport组件工作

1、加载并存储报表

默认情况下,报表窗体同项目窗体构存储在同一个DFM文件中。

多数情况下,无须再操作,因而你就不必采用特殊方法加载报表。

如果你决定在文件中存储报表窗体或者是数据库的

Blob字段(他提供了非常大的弹性,你能够在非编译程序中修改),你必须使用“TfrxReport”提供的加载和存储方法。

functionLoadFromFile(constFileName:

String;ExceptionIfNotFound:

Boolean=False):

Boolean;

从一个给定名字文件中加载报表。

如果第二个参数等于“True”并且文件没找到,那么他会触发一个异常。

如果文件加载成功,他返回“True”。

procedureLoadFromStream(Stream:

TStream);

从流中加载报表。

procedureSaveToFile(constFileName:

String);

用特殊名称文件存储报表。

procedureSaveToStream(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”方法接受两个默认参数:

procedureDesignReport(Modal:

Boolean=True;MDIChild:

Boolean=False);

Modal参数决定设计器是否被模态,MDIChild参数允许把设计器窗体作为一个MDI子窗体。

例如:

frxReport1.DesignReport;

3.运行报表

应用下面两个“TfrxReport”方法中的一个启动报表:

procedureShowReport(ClearLastReport:

Boolean=True);

启动报表并在预览窗体中显示。

如果“ClearLastReport”参数等于“False”,报表将会增加先前的一个报表结果,否则清除前一个报表结构。

functionPrepareReport(ClearLastReport:

Boolean=True):

Boolean;

启动报表,没有打开预览窗体,参数赋值与“ShowReport”方法同名。

如果报表构造成功,他返回“True”。

多数情况下,使用第一种方法更为方便一些。

在报表被构造的同时,他会立刻显示一个预览窗体。

当需要增加另一个报表到前一个报表中的时候,“ClearLastReport”参数显得方便些。

(此类技术用于批量报表打印)。

例如:

frxReport1.ShowReport;

4.预览报表

使用两种途径显示一个报表是可能的:

两者都是调用“TfrxReport.ShowReport”方法(先前描述过了),或者使用“TfrxReport.ShowPreparedReport”方法来帮助实现。

在第二

种情况下,报表构造没有被执行,但显示了一个完成的报表。

也就是说,你要么在“PreparedReport”方法帮助下构造他,要么在构造前从文件中加载报表(查看“加载/存储完

成的报表”)

例如:

Pascal:

iffrxReport1.PrepareReportthen

frxReport1.ShowPreparedReport;

C++:

if(frxReport1->PrepareReport(true))

frxReport1->ShowPreparedReport();

在这种情况下,报表构造器先被完成了,并显示在预览窗体中。

构造一个庞大的报表可能要花费很多时间,那就是为什么使用“ShowReport”非等时同步方法会好于

“PrepareReport/ShowPreparedReport”方法。

你可以通过“TfrxReport.PreviewOptions”属的缺省值设定预览参数值。

(这句翻译的不够好,请参考原文)

原文参考:

Inthiscase,reportconstructionisfinishedfirst,andafterthatitisdisplayedinthepreviewwindow.Constructionofalargereportcantake

alotoftime,andthatiswhyitisbettertousethe“ShowReportanisochronous”method,thanthe“PrepareReport/ShowPreparedReport”one.Onecanassign

previewsettingsbydefaultviathe“TfrxReport.PreviewOptions”property.[SPAN]5、打印报表

大多数情况下,你可以从预览窗体打印报表。

要人工打印报表,你应该使用“TfrxReport.Print”方法,例如:

frxReport1.LoadFromFile(...);

frxReport1.PrepareReport;

frxReport1.Print;

同时,你可以在显示的打印对话框中设置打印参数,你也可以使用默认设定值。

取消打印对话框,请参考“TfrxReport.PrintOptions”属性帮助

6.载入并存储报表

这个功能可以在预览窗口中执行。

也可以使用手工方法执行,帮助参考“TfrxReport.PreviewPages”方法:

functionLoadFromFile(constFileName:

String;ExceptionIfNotFound:

Boolean=False):

Boolean;

procedureSaveToFile(constFileName:

String);

procedureLoadFromStream(Stream:

TStream);

procedureSaveToStream(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);

导出过滤组件必须是有效的(你必须把他们放到你项目中的窗体上)并调整正确。

Theexportfiltercomponentmustbeavailable(youmustputitontheformofyourproject)andbeadjustedcorrectly.

8.创建自定义预览窗体

FastReport在标准的预览窗口中显示报表。

如果因为某些原因而不适合你,你可以创建一个自定义预览窗体。

为了这个目的,需要设计FastReport组件面板中的“TfrxReport”组

件。

要显示报表,TfrxReport.Preview方法应该连接到这个组件。

在使用TfrxPreview组件的时候,有两个典型的问题。

他不会处理按键(箭头,PgUp,PgDown等等)和鼠标滚轮(如果有的话)。

要让TfrxPreview同按键工作,设置焦点给他(他

是可以做到的,例如,在窗体的OnShow事件句柄中)

frxPreview.SetFocus;

要让TfrxPreview同鼠标滚轮工作,你必须创建OnMouseWheel事件句柄,并且调用TfrxPreview.MouseWheelScroll方法。

procedureTForm1.FormMouseWheel(Sender:

TObject;Shift:

TShiftState;

WheelDelta:

Integer;MousePos:

TPoint;varHandled:

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:

procedureTForm1.frxReport1ClickObject(Page:

TfrxPage;View:

TfrxView;

Button:

TMouseButton;Shift:

TShiftState;varModified:

Boolean);

begin

ifView.Name='Memo1'then

ShowMessage('Memo1contents:

'+#13#10+TfrxMemoView(View).Text);

ifView.Name='Memo2'then

begin

TfrxMemoView(View).Text:

=InputBox('Edit','EditMemo2text:

',TfrxMemoView(View).Text);

Modified:

=True;

end;

end;

C++:

void__fastcallTForm1:

:

frxReport1ClickObject(TfrxView*Sender,

TMouseButtonButton,TShiftStateShift,bool&Modified)

{

TfrxMemoView*Memo;

if(Memo=dynamic_cast(Sender))

{

if(Memo->Name=="Memo1")

ShowMessage("Memo1contents:

\n\r"+Memo->Text);

if(Memo->Name=="Memo2")

{

Memo->Text=InputBox("Edit","EditMemo2text:

",Memo->Text);

Modified=true;

}

}

}

在对象的单击事件句柄上,你可以做如下事情:

-修改一个对象或页的内容,传递句柄(结果,被修改的将被特殊标记,因此修改的内容应该引起重视);

-由于使用重构或重新建立报表,调用TfrxReport.PrepareReport方法

在此例中,点击名字为memo1对象的结果显示这个对象内容的消息。

当点击memo2是显示一个对话框,这个对象的内容可能被修改。

设置Modified标志为True,允许保持和显示变更

同样的方法,单击事件可以被定义成不同的响应。

例如,运行一个新报表。

如下注释是必要的。

在FastReport3版本中,一个报表组件可以在一个预览窗口中显示唯一的报表(不像

FastReport2.x版本)。

那就是为什么一个报表预览窗也会在分开的对象中运行一个报表,或者是同一个对象,但当前报表必须被抹除。

关于给终端用户一个可单击对象提示定位,在预览窗口中,鼠标经过一个可单击对象的时候,我们可以修改鼠标的光标。

要做到这些,在报表设计器上选择一个要设计的对象并设置

他的cursor属性为不同于crDefault的某个值。

更多的细节涉及到定义的单击对象。

在简单报表中,可以依照对象的名字或他的内容来定义。

然而,这就不能更多的执行可修改的事例。

例如,一个明细报表应当在一个数据选择

行被创建。

一个用户单击了内容为12的memo1对象。

数据行让这个对象参考什么?

那就是为什么你应当知道主键了,主键用于明确的标识这一行。

FastReport能够赋值一个字串,包

含任意数据(在我们的事例主键数据中),对于每个报表对象,这个字串存储在TagStr属性中。

让我们来通过一个报表的例子来举例说明,这个报表包含在FastReportDemo.exe-'Simplelist'示例中。

这是一个公司的客户列表,包含诸如客户名称,地址,联系人等数据。

据源是来自DBDEMOS演示数据库的Customer.db表。

这个表有一个主键,CustNO字段,他没有出现在报表中。

我们的任务是终止他通过参考单击完成报表上的任意对象记录他,这就

意味着要获取主键的值,要执行此项操作,就要为所有对象的TagStr属性加入值,依赖于主数据栏:

[Customers."CustNo"]

在报表建立期间,使用相同的方法计算TagStr属性内容,同时计算文本对象的内容;这就意味着变量值会替代所有变量的位置。

变量细节使用方括号括起来。

那就是为什么行值

是'1005','2112'等类似值了。

在报表建立后,包含TagStr属性对象的类型取决与主数据栏。

一个简单的从字串到整形的转换就会提供给我们一个主键的值,这也是所需记录能够

找到的主键。

如果主键是复合的(包含多个字段),TagStr属性的内容可能是如下值:

[Table1."Field1"];[Table1."Field2"]

在构造一个报表完成后,TagStr属性包含“1000;1”类型值,此值不同比相同要好。

11.从代码中存取报表对象

报表对象(例如:

reportpage,band,memo-object)是不能在你的代码中直接存取的。

这就意味着你不能通过名字寻址对象。

例如,当你在你的窗体上寻址一个按钮。

要寻址一

个对象,在TfrxReport.FindObject方法中找到帮助:

Pascal:

var

Memo1:

TfrxMemoView;

Memo1:

=frxReport1.FindObject('Memo1')asTfrxMemoView;

C++:

TfrxMemoView*Memo=

dynamic_cast(frxReport1->FindObject("Memo1"));

然后,你就能够寻址对象的属性和方法。

你也使用“TfrxReport.Pages”属性寻址报表页。

Pascal:

var

Page1:

TfrxReportPage;

Page1:

=frxReport1.Pages[1]asTfrxReportPage;

C++:

TfrxReportPage*Page1=dynamic_cast(frxReport1->Pages[1]);

12.从代码中创建报表

作为一项规则,你将在设计器中创建多数报表。

然而,在某些情况下(例如,当报表窗体未知的时候),使用代码手工创建一个报表是是十分必要的。

想要手工创建一个报表,你需要执行下面的顺序步骤:

-清除报表组件

-添加数据源

-添加数据页

-添加报表页

-添加栏页

-设置栏属性,接着把他们同数据相连

-在每个栏上加入对象

-设置对象属性,接着把他们同数据相连

让我们来检查一下创建一个简单报表的类型列表。

假设我们拥有如下组件:

frxReport1:

TfrxReportandfrxDBDataSet1:

TfrxDBDataSet(最后一个连接到DBDEMOS数据,

Customer.db表)。

我们的报表将包含一个带有报表标题和主数据栏的页。

在报表标题栏上有一个带有“HellowFastReport”文本的对象,主数据栏包含一个带有连接到“CustNo”

字段的对象。

Pascal:

var

DataPage:

TfrxDataPage;

Page:

TfrxReportPage;

Band:

TfrxBand;

DataBand:

TfrxMasterData;

Memo:

TfrxMemoView;

{清除报表}

frxReport1.Clear;

{为报表添加数据集到可存取的列表中}

frxReport1.DataSets.Add(frxDBDataSet1);

{添加"Data"页}

DataPage:

=TfrxDataPage.Create(frxReport1);

{添加页}

Page:

=TfrxReportPage.Create(frxReport1);

{创建唯一名称}

Page.CreateUniqueName;

{设置默认字段大小,纸张和打印方向}

Page.SetDefaults;

{修改纸张方向}

Page.Orientation:

=poLandscape;

{添加一个报表标题栏}

Band:

=TfrxReportTitle.Create(Page);

Band.CreateUniqueName;

{itissufficienttosetthe?

Top?

coordinateandheightforaband}

{bothcoordinatesareinpixels}

Band.Top:

=0;

Band.Height:

=20;

{为标题栏添加一个对象}

Memo:

=TfrxMemoView.Create(Band);

Memo.CreateUniqueName;

Memo.Text:

='HelloFastReport!

';

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.CreateUniqueName;

{连接数据}

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->Clear();

//在报表上添加一个数据集到数据集存取列表

frxReport1->DataSets->Add(frxDBDataset1);

//添加“数据”页

DataPage=newTfrxDataPage(frxReport1);

//添加一页

Page=newTfrxReportPage(frxReport1);

//创建一个不重复的名称

Page->CreateUniqueName(

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

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2