FastReport的使用方法

本文详细介绍了FastReport的基本概念、关键属性、事件处理及如何在报表中使用变量、函数和脚本。通过实例展示了如何将程序中的变量传递到报表中,并在报表中使用自定义函数。此外,还涵盖了如何在报表中添加数据、调整布局、优化打印预览等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是我在网上收集的

 

 

这是FastReport的主控件。它包含了调入、保存、预览和打印报表的方法。每个TfrReport控件只能包含一个单独报表。

TfrReport属性
描   述

DataSet
-
联接到一个TfrxxxDataSet。这个数据源的记录数定义需多少时间这个报表才能被构建和打印。(参考:ReportType属性)

GrayedButtons
False
如果为True,设计器和预览窗口的工具栏将显示为灰色。

InitialZoom
pzDefault
定义预览的初始缩放值。

MDIPreview
False
显示预览窗口为一个MDI子窗口。

ModalPreview
True
如果为True,预览窗口为模式方式。

ModifyPrepared
True
如果为True,在预览窗口中双击页面则可以修改准备好的报表。

Preview
-
连接到一个TfrPreview。如果这个属性被设置,准备好的报表将被显示在这个控件中。

PreviewButtons
All
定义在预览窗口中可用的按钮集。

ReportType
RtSimple
Defines how to interpret the data source connected to the DataSet property. If ReportType = rtMultiple, the report will be built as many times as the number of records in the connected data source. This is useful for printing a report multiple times based on a list (i.e. the data source).

定义怎样解释数据源连接到DataSet属性。如果ReportType = rtMultiple,报表将在不同时间构建连接数据源的记录数。

ShowProgress
True
如果为True,当准备、打印或输出报表时显示过度窗口。

StoreInDFM
False
如果为True,存贮报表在DFM文件中。注意:报表存入DFM文件后存贮在可执行文件(EXE)中而不能被修改。

Title
-
报表标题。这个名称显示在预览窗口和打印任务列表中。

注意:TfrReport.StoreInDFM属性缺省为False。意思是你的报表必须存入一个可执行文件或转换到数据库的BLOB或二进制字段中。如果你想保存你的报表到DFM资源(像在其它的报表工具中,例如QuickReport和ReportBuilder),设置这个属性为True。但必需记住——这将要求你在任何一个报表被修改时都必须重新编译你的应用程序。

TfrReport事件

事件
描 述

OnBeforePrint
这个事件在打印报表之前被激活。注意:FastReport对象不是控件,因此它们不能显示在在对象观察中。你不能指定各个对象的个别事件处理。不过,你可以使用公共事件处理,像OnBeforePrin,OnBeginBand和OnEndBand。

OnBeginBand
在打印一个区域前这个事件被激活。

OnBeginColumn
在打印透视表栏前这个事件被激活。

OnBeginDoc
在打印一个报表前这个事件被激活。

OnBeginPage
在开始打印一个页面时这个事件被激活。

OnEndBand
在打印一个区域结束后这个事件被激活。

OnEndDoc
在结束一个报表的打印时这个事件被激活。

OnEndPage
在结束一个页面的打印时这个事件被激活。

OnGetValue
当FastReport在表达式中查找不明变量时这个事件被激活。指定事件处理返回这个变量值。

OnManualBuild
指定这个事件的处理将允许你手工构建报表。(例如用代码显示一个需要的区域)。参考演示:DEMOS\MANUAL。

OnMouseOverObject
在预览窗口中当鼠标在任何时间移到某个对象时这个事件被激活。事件句柄将返回这个对象的光标类型(例如“pointing hand”光标)。这能让用户观察哪些对象可“点击”,哪些不能。

OnObjectClick
当你在预览窗口中点击某个对象时这个事件被激活。

OnPrintColumn
打印透视表栏前这个事件被激活。这个事件能够返回栏宽。

OnProgress
在长时间的运行中这个事件被激活。这个事件处理可以显示工作进度。

OnUserFunction
当FastReport在表达式中查找不名函数时这个事件被激活。这个事件处理将返回这个函数值。

///////////////////////

我在报表中使用了这样一个Memo:

自定义数据:[Test]

然后

uses
frxVariables;

procedure TForm1.Button1Click(Sender: TObject);
begin
frxReport1.LoadFromFile('Test.fr3');
frxReport1.Variables['Test']:='hello';
frxReport1.ShowReport();
end;

结果发生异常。不能赋值。请问该怎么传递程序中的变量到报表里面?

在你的 frReport 控件的 OnGetValue 事件中加入以下代码:
procedure TForm1.frReport1GetValue(const ParName: string;
var ParValue: Variant);
var
Test: string;
begin
if ParName = 'Test' then
    parValue := 'hello';
end;
然后,在你的报表上加入,这个变量,就可以了。

////////////////////////
由于在统计汇总表里对一段时间进行查询的,现在需要把从起始时间到终止时间送到报表里去,应该如何送。
如:起始时间:2005-05-01 终止时间:2005-05-31,如何把这两个时间送到报表里去,谢谢!

假设报表中有一个memo,里面定义一个变量[mydate]
Report.Dictionary.Variables.Variable['mydate']:=''''+edtsz.Text+'''';

////////////////////////////////
: 我怎样添加我的自定义函数?
A: 使用 TfrReport.OnUserFunction 事件. 这里有一个简单的例子:

procedure TForm1.frReport1UserFunction(const Name: String;
p1, p2, p3: Variant; var val: Variant);
begin
if AnsiCompareText('SUMTOSTR', Name) = 0 then
val := My_Convertion_Routine(frParser.Calc(p1));
end;

然后,你就可以在报表(任何表达式或脚本)的任何地方使用 SumToStr 函数了。


Q: 但是它仅仅能工作在一个TfrReport组件中。可我想在任何地方(在所有的TfrReport组件中)使用的我的自定义函数?
A: 使 OnUserFunction event 句柄作为所有组件的公用句柄。如果你不能做到这一点,你需要创建函数库:

type
TMyFunctionLibrary = class(TfrFunctionLibrary)
public
constructor Create; override;
procedure DoFunction(FNo: Integer; p1, p2, p3: Variant;
var val: Variant); override;
end;

constructor TMyFunctionLibrary.Create;
begin
inherited Create;
with List do
begin
Add('DATETOSTR');
Add('SUMTOSTR');
end;
end;

procedure TMyFunctionLibrary.DoFunction(FNo: Integer; p1, p2, p3: Variant;
var val: Variant);
begin
val := 0;
case FNo of
0: val := My_DateConvertion_Routine(frParser.Calc(p1));
1: val := My_SumConvertion_Routine(frParser.Calc(p1));
end;
end;

要注册函数库,调用
frRegisterFunctionLibrary(TMyFunctionLibrary);
要卸载函数库,调用
frUnRegisterFunctionLibrary(TMyFunctionLibrary);


Q: 我怎样将我的函数添加到函数列表中 (用表达式生成器)?
A: 使用 frAddFunctionDesc 过程 (在FR_Class 单元中):

frAddFunctionDesc(FuncLib, 'SUMTOSTR', 'My functions',
'SUMTOSTR(<Number>)/Converts number to its verbal presentation.');

注意: "/" 符号是必须的! 它从它的描述中分隔函数语法。
FuncLib 被声明为你自己的函数库 (如果你不使用函数库可以将其设置为nil). 当函数库未注册时,所有它的函数将自动从函数列表中删除。


---------------- 使用变量 -------------------------------------

Q: 我怎样编程实现填充变量列表(在数据词典中)?

A: 数据词典中的所有变量及分类都被存储在 TfrReport.Dictionary.Variables 中.

with frReport1.Dictionary do
begin
// 创建分类(名称用空白)
Variables[' New category'] := '';
// 创建变量
Variables['New Variable'] := 'CustomerData.Customers."CustNo"';
Variables['Another Variable'] := 'Page#';
end;

Q: 我定义了字符串变量:

with frReport1.Dictionary do
Variables['Month'] := 'March';

但是当我运行报表是,出现了错误,为什么?

A: 因为 FastReport 假定数据词典中的字符串变量值是一个表达式,它需要分析、计算它。
可以使用其它的方法:

with frReport1.Dictionary do
Variables['Month'] := '''' + 'March' + '''';

或者, 使用 frVariables 来传输固定数据到报表。


Q: 我不想在数据词典中显示某些数据集?

A: 使用 TfrReport.Dictionary.DisabledDatasets:

with frReport1.Dictionary do
begin
// 关闭该数据集
DisabledDatasets.Add('CustomerData.Bio');
// 或者, 关闭整个数据模块/窗体
DisabledDatasets.Add('CustomerData*');
end;


Q: 我怎样将数据传送到报表?

A: 有几个方法可以实现它. 第一是使用全局对象 frVariables (在 FR_Class 单元中被定义):

frVariables['My variable'] := 10;

这段代码创建了一个名称为“My variable”,值为 10 的变量。这是最好的传输固定数据的报表的方法。

第二种方法是使用 TfrReport.OnGetValue 事件. 这可以使用这个方法来传送动态数据、记录等。

procedure TForm1.frReport1GetValue(ParName: String; var ParValue: Variant);
begin
if ParName = 'MyField' then
ParValue := Table1MyField.Value;
end;

最后, 第三种方法是通过编程在数据词典中定义变量(可以参考以前的问题):

with frReport1.Dictionary do
begin
Variables['MyVariable'] := 'CustomerData.Customers."CustNo"';
Variables['Another Variable'] := '10';
end;


Q: 我能在报表和程序间传送数据吗?
A: 使用 frVariables 对象. 如果你在报表的任何对象的脚本中写入以下代码:

MyVariable := 10

那么,在你的程序中,你可以使用以下代码来获取 MyVariable 的值:
v := frVariables['MyVariable'];


---------------- 脚本 (FastReport Pascal) ---------------------------------

Q: Band 中是否可以使用脚本?

A: 当然. 选择 band ,然后按 Ctrl+Enter 或在对象浏览器中选择 "OnBeforePrint" 属性。

Q: 报表页中是否可以使用脚本?

A: 当然. 选择页 (在空白处单击) ,然后在对象浏览器中选择 "OnBeforePrint" 属性。如果该页是一个对话框窗体,那么这个属性就是 "OnActivate".


Q: 我有两个对象: Memo1 和 Memo2. 我能否在 Memo1 的脚本中调用 Memo2 的属性和方法?

A: 当然, 例如,你可以这样做: 对象名.属性名.


Q: 在脚本中,我可以使用对象的哪些属性?

A: 几乎所有你能在对象浏览器中看到的属性。例如,可以使用 Font.Name, Font.Size等来存取字体属性。


---------------- 其它问题 --------------------------------------------

Q: 怎样改变多页报表中某一页的顺序?

A: 拖动页标签到目的位置。


Q: 我想查看所有的字段及变量,我想在报表中使用列表来实现它?

A: 设置 TfrReport.MixVariablesAndDBFields := True.现在,所有的数据字段及变量可在“插入数据字段”对话框中可存取了。


Q: 我不想显示导入选项对话框?

A: 在导入组件(比如,TfrTextExport)中设置所有必需的选项,然后通过设置ShowDialog属性为False来关闭此对话框。


Q: 为什么 TotalPages 变量不起作用? 它总是返回 0.

A: 在你的报表中设置 Two-pass 选项. 要设置它,你需要在报表设计器的“文件”菜单中,打开“报表选项”对话框。


Q: 我用BLOB字段来存储我的报表。当我运行报表设计器时,它显示我的报表未命名?

A: 在运行报表设计器前,这样做:

frReport1.FileName := 'Name of my report';


Q: 我想在重新定义报表设计器中的“打开”及“保存”按钮的功能?


A: 查看 TfrDesigner 组件. 它有几个必需的事件: OnLoadReport 和
OnSaveReport. 这里有一小段代码例子:

procedure TForm1.frDesigner1LoadReport(Report: TfrReport;
var ReportName: String; var Opened: Boolean);
begin
with MyOpenDialog do
begin
Opened := ShowModal = mrOk;
if Opened then
begin
Report.LoadFromBlobField(...);
ReportName := ...;
end;
end;
end;

procedure TForm1.frDesigner1SaveReport(Report: TfrReport;
var ReportName: String; SaveAs: Boolean; var Saved: Boolean);
begin
if SaveAs then
with MySaveDialog do
begin
Saved := ShowModal = mrOk;
if Saved then
begin
Report.SaveToBlobField(...);
ReportName := ...;
end;
end
else
Report.SaveToBlobField(...);
end;


Q: 在 QR 中, 我可以写这样的代码: QRLabel1.Caption := 'Some text'. 我可以用FR这样做吗?

A: FR 对象并不是一个组件 (这并不像 QR, RB). 但使用 TfrReport.FindObject 方法可以通过对象名称找到该对象。

var
t: TfrMemoView;
begin
t := TfrMemoView(frReport1.FindObject('Memo1'));
if t <> nil then
t.Memo.Text := 'FastReport';
end;


Q: 我想在用户预览(TfrPreview组件)中自定义热键?

A: 这个组件有个窗口: TForm 属性. 将自定义句柄指定到 Window.OnKeyDown 属性.


Q: Fast Report 2.4 不能装载 FreeReport 2.21 文件?

A: 这仅需要使用16进制数改变报表文件的第一字节,然后在源代码中修改下面的部分。在这些修改之后,装载报表并保存它. 最后,返回到源代码处.

FR_Class:

function ReadString(Stream: TStream): String;
begin
{ if frVersion >= 23 then}
Result := frReadString(Stream) {else
Result := frReadString22(Stream);}
end;

procedure ReadMemo(Stream: TStream; Memo: TStrings);
begin
{ if frVersion >= 23 then}
frReadMemo(Stream, Memo){ else
frReadMemo22(Stream, Memo);}
end;


FR_Utils:

procedure frReadMemo(Stream: TStream; l: TStrings);
var
s: String;
b: Byte;
n: Word;
begin
l.Clear;
l.Text := frReadString(Stream); exit;
Stream.Read(n, 2);
if n > 0 then
repeat
Stream.Read(n, 2);
SetLength(s, n);
Stream.Read(s[1], n);
l.Add(s);
Stream.Read(b, 1);
until b = 0
else
Stream.Read(b, 1);
end;

function frReadString(Stream: TStream): String;
var
s: String;
n: Integer;
b: Byte;
begin
Stream.Read(n, 4);
SetLength(s, n);
Stream.Read(s[1], n);
if (n > 0) and (s[n] = #$0A) then
SetLength(s, n - 2);
// Stream.Read(b, 1);
Result := s;
end;


Q: 怎样不在打印预览中打印报表?
A: 这里有一段代码:

frReport1.PrepareReport;
frReport1.PrintPreparedReport('', 1, True, frAll);

frReport1.PrintPreparedReportDlg;


Q: 我想在报表中旋转图片。问题是这张图片是由我的应用程序生成的。是否有方法可以在打印前将这幅图片装载到报表中?

A: 使用 TfrReport.OnBeforePrint 事件:

if View.Name = 'Picture1' then
TfrPictureView(View).Picture.LoadFromFile(...) 或
.Assign 或
.你所想要做的任何事情

这个指南让你熟悉报表设计器和了解报表设计的基本概念(各种区域,数据源,二次表,等等)。指南将帮助你开始用FastReport创建报表,但它不能告诉你怎样使用其它基本的报表设计器。 如果你不熟悉报表设计器,我们建议你参考QuickReport的帮助系统。QuickReport的指南已经包含在你的Delphi拷贝中。QuickReport的大部分基本概念也适用于FastReport,然而,FastReport能提供更多的弹性和最终用户的自定义。 关于FastReport的说明 FastReport是高弹性的报表设计器,用于报表的数据可以从任何类型的数据源获取,包含字符列表,BDE数据库,ADO数据源(不使用BDE),Interbase(使用IBO),Pascal数组和记录,以及一些不常用的数据源。 整个FastReport系统是用Delphi的Pascal编写的。FastReport不需要动态链接库,但需在你的项目中占用大约400kb(Delphi 5)。如果你想最终用户拥有设计能力,这将在你的.EXE中增加大约500kb。虽然这看上去比较大,但这只是其它设计的几分之一。你同样应该考虑到FastReport不仅仅只是包含最终用户更改报表设计的能力,还能够适应查询和数据库的变化。FastReport还包含自己的脚本语言,让应用程序和最终用户能够更容易地改变报表。如果你的大部分应用使用FastReport,你可以简单地配置FastReport BPL(大约1400kb)而所有你的应用程序只需要保留很少的一部分。 你可以发现FastReport有一个非常吸引人的用户界面,使用最新的用户界面组件,例如可停靠的工具栏。你的最终用户将会非常愿意使用这个设计器,只需使用鼠标就可以创建大多数报表。 FastReport是名副其实的快速报表:较其它一些Delphi报表设计器而言,你可以发现没有什么可以接近于它的开发速度。报表预览窗口一直是大多数报表设计器的弱点,高品质的外观,赋于你的应用程序非常专业的用户界面。 FastReport是一个已经拥有三年历史的非常成熟的报表设计器,成长使它拥有其它Delphi报表设计器所不能相比的诸多先进特性。
fastreport快速上手手册 这个也是从别的地方下载的 目 录 入门 5 绪言 6 关于FASTREPORT的说明 6 FASTREPORT的历史 6 创建报表 7 数据 8 参数 8 窗体 9 处理 10 准备报表 10 举例:设计一个简单报表 11 FASTREPORT内核 14 DELPHI控件面板 15 “FastReport”页 15 “FRTools”页 17 TfrReport控件 17 TfrDBDataSet控件 20 TfrUserDataSet控件 21 FASTREPORT对象 21 “Text”对象 22 “Band”对象 26 “Image”对象 29 “SubReport”对象 30 “Line”对象 30 “CheckBox”对象 30 “RichText”对象 30 “OLE”对象 31 “Chart”对象 32 “Shape”对象 34 “Barcode”对象 34 “RichText 2.0”对象 35 创建报表 36 FastReport中的Bands 36 简单报表(列表) 39 主-从报表 40 主-细-子细报表 40 交叉报表 40 动态报表 41 bands分隔 42 分栏报表 43 带封面的报表 43 嵌套报表(子报表) 43 主-从-从报表 44 复合报表 44 包含BLOB字段报表 44 没有band的报表 44 分组报表 44 图表报表 45 设计器 46 设计器 47 使用控制键 47 使用鼠标 48 报表选项 48 页面选项 49 设计器选项 51 对象观察器 52 “插入数据字段”窗口 53 数据字典 53 表达式编辑器 58 工具栏 60 “标准”工具栏 60 “格式”工具栏 61 “边框”工具栏 62 “对齐”工具栏 62 程序设计 64 事件 65 TfrReport对象的其它事件 65 变量 66 扩展FASTREPORT函数 68 设计你自己的预览窗口 68 扩展函数列表 69 报表示例 71 报表示例 72 在报表中插入图表 72 运用OnManualBuild事件控制报表逻辑结构 74 运行时使用代码手工合成报表 76 打印可变栏数或未知栏数的报表 77 打印可变栏数和栏宽可变的报表 78 最终用户特性 80 介绍 81 对话框 81 对话框窗体控件 82 Label 83 Edit 83 Memo 84 Button 84 CheckBox 85 RadioButton 85 ListBox 86 ComboBox 86 输入信息到报表中 87 数据访问控件 88 FastReport数据感知控件简介 89 TfrBDELookupComboBox 89 TfrBDETable 89 TfrBDEQuery 92 TfrBDEDataBase 93 创建报表 94 简单的“表格式”报表 94 带参数的报表 95 TFRDATASTORAGE控件 96 连接到一个数据库 97 打开一个数据表 98 生成一个查询 99 字段编辑器 99 创建查询字段 100 查询参数编辑器 101 联接数据 101 参数对话框 102 参数对话框设计器 102 内置语言 103 脚本语言和对象 104 编写代码 105 对象修改 107 内置函数 107 对象的属性和方法 110 解释器的使用 119
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值