解决方案

FASTREPORT的使用方法

seo靠我 2023-09-22 21:02:22

这是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 或

.你所想要做的任何事情
“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2