FastReport的使⽤⽅法
以下是我在⽹上收集的
这是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);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。