这是FastReport的主控件。它包含了调入、保存、预览和打印报表的方法。每个TfrReport控件只能包含一个单独报表。
TfrReport属性
描 述
DataSet
-
联接到一个TfrxxxDatSEO靠我aSet。这个数据源的记录数定义需多少时间这个报表才能被构建和打印。(参考:ReportType属性)
GrayedButtons
False
如果为True,设计器和预览窗口的工具栏将显示为灰色。
InitSEO靠我ialZoom
pzDefault
定义预览的初始缩放值。
MDIPreview
False
显示预览窗口为一个MDI子窗口。
ModalPreview
True
如果为True,预览窗口为模式方式。
ModifyPrSEO靠我epared
True
如果为True,在预览窗口中双击页面则可以修改准备好的报表。
Preview
-
连接到一个TfrPreview。如果这个属性被设置,准备好的报表将被显示在这个控件中。
PreviewBuSEO靠我ttons
All
定义在预览窗口中可用的按钮集。
ReportType
RtSimple
Defines how to interpret the data source connected to the DSEO靠我ataSet property. If ReportType = rtMultiple, the report will be built as many times as the number ofSEO靠我 records in the connected data source. This is useful for printing a report multiple times based on SEO靠我a list (i.e. the data source).定义怎样解释数据源连接到DataSet属性。如果ReportType = rtMultiple,报表将在不同时间构建连接数据源的记录数。
ShSEO靠我owProgress
True
如果为True,当准备、打印或输出报表时显示过度窗口。
StoreInDFM
False
如果为True,存贮报表在DFM文件中。注意:报表存入DFM文件后存贮在可执行文件(EXSEO靠我E)中而不能被修改。
Title
-
报表标题。这个名称显示在预览窗口和打印任务列表中。注意:TfrReport.StoreInDFM属性缺省为False。意思是你的报表必须存入一个可执行文件或转换到数据库SEO靠我的BLOB或二进制字段中。如果你想保存你的报表到DFM资源(像在其它的报表工具中,例如QuickReport和ReportBuilder),设置这个属性为True。但必需记住——这将要求你在任何一个报SEO靠我表被修改时都必须重新编译你的应用程序。
TfrReport事件
事件
描 述
OnBeforePrint
这个事件在打印报表之前被激活。注意:FastReport对象不是控件,因此它们不能显示在在对象观察中。你SEO靠我不能指定各个对象的个别事件处理。不过,你可以使用公共事件处理,像OnBeforePrin,OnBeginBand和OnEndBand。
OnBeginBand
在打印一个区域前这个事件被激活。
OnBegiSEO靠我nColumn
在打印透视表栏前这个事件被激活。
OnBeginDoc
在打印一个报表前这个事件被激活。
OnBeginPage
在开始打印一个页面时这个事件被激活。
OnEndBand
在打印一个区域结束后这个事SEO靠我件被激活。
OnEndDoc
在结束一个报表的打印时这个事件被激活。
OnEndPage
在结束一个页面的打印时这个事件被激活。
OnGetValue
当FastReport在表达式中查找不明变量时这个事件被激活SEO靠我。指定事件处理返回这个变量值。
OnManualBuild
指定这个事件的处理将允许你手工构建报表。(例如用代码显示一个需要的区域)。参考演示:DEMOS\MANUAL。
OnMouseOverObjectSEO靠我
在预览窗口中当鼠标在任何时间移到某个对象时这个事件被激活。事件句柄将返回这个对象的光标类型(例如“pointing hand”光标)。这能让用户观察哪些对象可“点击”,哪些不能。
OnObjectCliSEO靠我ck
当你在预览窗口中点击某个对象时这个事件被激活。
OnPrintColumn
打印透视表栏前这个事件被激活。这个事件能够返回栏宽。
OnProgress
在长时间的运行中这个事件被激活。这个事件处理可以显示SEO靠我工作进度。
OnUserFunction
当FastReport在表达式中查找不名函数时这个事件被激活。这个事件处理将返回这个函数值。///
我在报表中使用了这样一个Memo:
自定义数据:[Test]
然后
uSEO靠我ses
frxVariables;procedure TForm1.Button1Click(Sender: TObject);
begin
frxReport1.LoadFromFile(Test.fr3SEO靠我);
frxReport1.Variables[Test]:=hello;
frxReport1.ShowReport();
end;结果发生异常。不能赋值。请问该怎么传递程序中的变量到报表里面?
在你的 fSEO靠我rReport 控件的 OnGetValue 事件中加入以下代码:
procedure TForm1.frReport1GetValue(const ParName: string;
var ParValSEO靠我ue: Variant);
var
Test: string;
begin
if ParName = Test then
parValue := hello;
end;
然后,在你的报表上加入,这个变量,就可以了。SEO靠我由于在统计汇总表里对一段时间进行查询的,现在需要把从起始时间到终止时间送到报表里去,应该如何送。
如:起始时间:2005-05-01 终止时间:2005-05-31,如何把这两个时间送到报表里去,谢谢!SEO靠我假设报表中有一个memo,里面定义一个变量[mydate]
Report.Dictionary.Variables.Variable[mydate]:=+edtsz.Text+;: 我怎样添加我的自定义SEO靠我函数?
A: 使用 TfrReport.OnUserFunction 事件. 这里有一个简单的例子:procedure TForm1.frReport1UserFunction(const Name: SEO靠我String;
p1, p2, p3: Variant; var val: Variant);
begin
if AnsiCompareText(SUMTOSTR, Name) = 0 then
val :=SEO靠我 My_Convertion_Routine(frParser.Calc(p1));
end;然后,你就可以在报表(任何表达式或脚本)的任何地方使用 SumToStr 函数了。
Q: 但是它仅仅能工作在一SEO靠我个TfrReport组件中。可我想在任何地方(在所有的TfrReport组件中)使用的我的自定义函数?
A: 使 OnUserFunction event 句柄作为所有组件的公用句柄。如果你不能做到这一SEO靠我点,你需要创建函数库:type
TMyFunctionLibrary = class(TfrFunctionLibrary)
public
constructor Create; override;
procSEO靠我edure DoFunction(FNo: Integer; p1, p2, p3: Variant;
var val: Variant); override;
end;constructor TMyFuSEO靠我nctionLibrary.Create;
begin
inherited Create;
with List do
begin
Add(DATETOSTR);
Add(SUMTOSTR);
end;
end;proSEO靠我cedure TMyFunctionLibrary.DoFunction(FNo: Integer; p1, p2, p3: Variant;
var val: Variant);
begin
val :=SEO靠我 0;
case FNo of
0: val := My_DateConvertion_Routine(frParser.Calc(p1));
1: val := My_SumConvertion_RoutSEO靠我ine(frParser.Calc(p1));
end;
end;要注册函数库,调用
frRegisterFunctionLibrary(TMyFunctionLibrary);
要卸载函数库,调用
frUnRSEO靠我egisterFunctionLibrary(TMyFunctionLibrary);Q: 我怎样将我的函数添加到函数列表中 (用表达式生成器)?
A: 使用 frAddFunctionDesc 过程 SEO靠我(在FR_Class 单元中):frAddFunctionDesc(FuncLib, SUMTOSTR, My functions,
SUMTOSTR(<Number>)/Converts numberSEO靠我 to its verbal presentation.);注意: "/" 符号是必须的! 它从它的描述中分隔函数语法。
FuncLib 被声明为你自己的函数库 (如果你不使用函数库可以将其设置为nilSEO靠我). 当函数库未注册时,所有它的函数将自动从函数列表中删除。---------------- 使用变量 -------------------------------------
Q: 我怎样编程实现填SEO靠我充变量列表(在数据词典中)?
A: 数据词典中的所有变量及分类都被存储在 TfrReport.Dictionary.Variables 中.
with frReport1.Dictionary do
begSEO靠我in
// 创建分类(名称用空白)
Variables[ New category] := ;
// 创建变量
Variables[New Variable] := CustomerData.CustomerSEO靠我s."CustNo";
Variables[Another Variable] := Page#;
end;Q: 我定义了字符串变量:
with frReport1.Dictionary do
VariablSEO靠我es[Month] := March;但是当我运行报表是,出现了错误,为什么?
A: 因为 FastReport 假定数据词典中的字符串变量值是一个表达式,它需要分析、计算它。
可以使用其它的方法:witSEO靠我h frReport1.Dictionary do
Variables[Month] := + March + ;或者, 使用 frVariables 来传输固定数据到报表。
Q: 我不想在数据词典中显示SEO靠我某些数据集?
A: 使用 TfrReport.Dictionary.DisabledDatasets:
with frReport1.Dictionary do
begin
// 关闭该数据集
DisabledSEO靠我Datasets.Add(CustomerData.Bio);
// 或者, 关闭整个数据模块/窗体
DisabledDatasets.Add(CustomerData*);
end;Q: 我怎样将数据传送SEO靠我到报表?
A: 有几个方法可以实现它. 第一是使用全局对象 frVariables (在 FR_Class 单元中被定义):
frVariables[My variable] := 10;
这段代码创建了一SEO靠我个名称为“My variable”,值为 10 的变量。这是最好的传输固定数据的报表的方法。
第二种方法是使用 TfrReport.OnGetValue 事件. 这可以使用这个方法来传送动态数据、记录等SEO靠我。
procedure TForm1.frReport1GetValue(ParName: String; var ParValue: Variant);
begin
if ParName = MyFielSEO靠我d then
ParValue := Table1MyField.Value;
end;最后, 第三种方法是通过编程在数据词典中定义变量(可以参考以前的问题):
with frReport1.DictionSEO靠我ary do
begin
Variables[MyVariable] := CustomerData.Customers."CustNo";
Variables[Another Variable] := 1SEO靠我0;
end;Q: 我能在报表和程序间传送数据吗?
A: 使用 frVariables 对象. 如果你在报表的任何对象的脚本中写入以下代码:MyVariable := 10
那么,在你的程序中,你可以使用以SEO靠我下代码来获取 MyVariable 的值:
v := frVariables[MyVariable];---------------- 脚本 (FastReport Pascal) ----------SEO靠我-----------------------
Q: Band 中是否可以使用脚本?
A: 当然. 选择 band ,然后按 Ctrl+Enter 或在对象浏览器中选择 "OnBeforePrint" 属SEO靠我性。
Q: 报表页中是否可以使用脚本?
A: 当然. 选择页 (在空白处单击) ,然后在对象浏览器中选择 "OnBeforePrint" 属性。如果该页是一个对话框窗体,那么这个属性就是 "OnActivSEO靠我ate".
Q: 我有两个对象: Memo1 和 Memo2. 我能否在 Memo1 的脚本中调用 Memo2 的属性和方法?
A: 当然, 例如,你可以这样做: 对象名.属性名.
Q: 在脚本中,我可以使SEO靠我用对象的哪些属性?
A: 几乎所有你能在对象浏览器中看到的属性。例如,可以使用 Font.Name, Font.Size等来存取字体属性。
---------------- 其它问题 ----------SEO靠我----------------------------------
Q: 怎样改变多页报表中某一页的顺序?
A: 拖动页标签到目的位置。
Q: 我想查看所有的字段及变量,我想在报表中使用列表来实现它?
A:SEO靠我 设置 TfrReport.MixVariablesAndDBFields := True.现在,所有的数据字段及变量可在“插入数据字段”对话框中可存取了。
Q: 我不想显示导入选项对话框?
A: 在导入SEO靠我组件(比如,TfrTextExport)中设置所有必需的选项,然后通过设置ShowDialog属性为False来关闭此对话框。
Q: 为什么 TotalPages 变量不起作用? 它总是返回 0.
A: SEO靠我在你的报表中设置 Two-pass 选项. 要设置它,你需要在报表设计器的“文件”菜单中,打开“报表选项”对话框。
Q: 我用BLOB字段来存储我的报表。当我运行报表设计器时,它显示我的报表未命名?
A:SEO靠我 在运行报表设计器前,这样做:
frReport1.FileName := Name of my report;
Q: 我想在重新定义报表设计器中的“打开”及“保存”按钮的功能?
A: 查看 TfrDesiSEO靠我gner 组件. 它有几个必需的事件: OnLoadReport 和
OnSaveReport. 这里有一小段代码例子:procedure TForm1.frDesigner1LoadReport(ReSEO靠我port: TfrReport;
var ReportName: String; var Opened: Boolean);
begin
with MyOpenDialog do
begin
Opened :=SEO靠我 ShowModal = mrOk;
if Opened then
begin
Report.LoadFromBlobField(...);
ReportName := ...;
end;
end;
end;proSEO靠我cedure TForm1.frDesigner1SaveReport(Report: TfrReport;
var ReportName: String; SaveAs: Boolean; var SSEO靠我aved: Boolean);
begin
if SaveAs then
with MySaveDialog do
begin
Saved := ShowModal = mrOk;
if Saved then
beSEO靠我gin
Report.SaveToBlobField(...);
ReportName := ...;
end;
end
else
Report.SaveToBlobField(...);
end;Q: 在 QR SEO靠我中, 我可以写这样的代码: QRLabel1.Caption := Some text. 我可以用FR这样做吗?
A: FR 对象并不是一个组件 (这并不像 QR, RB). 但使用 TfrReportSEO靠我.FindObject 方法可以通过对象名称找到该对象。
var
t: TfrMemoView;
begin
t := TfrMemoView(frReport1.FindObject(Memo1));
if SEO靠我t <> nil then
t.Memo.Text := FastReport;
end;Q: 我想在用户预览(TfrPreview组件)中自定义热键?
A: 这个组件有个窗口: TForm 属性. 将自定SEO靠我义句柄指定到 Window.OnKeyDown 属性.
Q: Fast Report 2.4 不能装载 FreeReport 2.21 文件?
A: 这仅需要使用16进制数改变报表文件的第一字节,然后在源SEO靠我代码中修改下面的部分。在这些修改之后,装载报表并保存它. 最后,返回到源代码处.
FR_Class:
function ReadString(Stream: TStream): String;
begin
{SEO靠我 if frVersion >= 23 then}
Result := frReadString(Stream) {else
Result := frReadString22(Stream);}
end;pSEO靠我rocedure ReadMemo(Stream: TStream; Memo: TStrings);
begin
{ if frVersion >= 23 then}
frReadMemo(Stream,SEO靠我 Memo){ else
frReadMemo22(Stream, Memo);}
end;FR_Utils:
procedure frReadMemo(Stream: TStream; l: TStrinSEO靠我gs);
var
s: String;
b: Byte;
n: Word;
begin
l.Clear;
l.Text := frReadString(Stream); exit;
Stream.Read(n, 2)SEO靠我;
if n > 0 then
repeat
Stream.Read(n, 2);
SetLength(s, n);
Stream.Read(s[1], n);
l.Add(s);
Stream.Read(b, 1SEO靠我);
until b = 0
else
Stream.Read(b, 1);
end;function frReadString(Stream: TStream): String;
var
s: String;
nSEO靠我: Integer;
b: Byte;
begin
Stream.Read(n, 4);
SetLength(s, n);
Stream.Read(s[1], n);
if (n > 0) and (s[n] =SEO靠我 #$0A) then
SetLength(s, n - 2);
// Stream.Read(b, 1);
Result := s;
end;Q: 怎样不在打印预览中打印报表?
A: 这里有一段代码:frReSEO靠我port1.PrepareReport;
frReport1.PrintPreparedReport(, 1, True, frAll);
或
frReport1.PrintPreparedReportDlSEO靠我g;Q: 我想在报表中旋转图片。问题是这张图片是由我的应用程序生成的。是否有方法可以在打印前将这幅图片装载到报表中?
A: 使用 TfrReport.OnBeforePrint 事件:
if View.NSEO靠我ame = Picture1 then
TfrPictureView(View).Picture.LoadFromFile(...) 或
.Assign 或
.你所想要做的任何事情网站备案号:浙ICP备17034767号-2