首页 » SEO优化 » php挪用fastreport技巧_FastReport的运用方法

php挪用fastreport技巧_FastReport的运用方法

访客 2024-12-12 0

扫一扫用手机浏览

文章目录 [+]

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

TfrReport属性描   述DataSet-联接到一个TfrxxxDataSet。
这个数据源的记录数定义需多少韶光这个报表才能被构建和打印。
(参考:ReportType属性)GrayedButtonsFalse如果为True,设计器和预览窗口的工具栏将显示为灰色。
InitialZoompzDefault定义预览的初始缩放值。
MDIPreviewFalse显示预览窗口为一个MDI子窗口。
ModalPreviewTrue如果为True,预览窗口为模式办法。
ModifyPreparedTrue如果为True,在预览窗口中双击页面则可以修正准备好的报表。
Preview-连接到一个TfrPreview。
如果这个属性被设置,准备好的报表将被显示在这个控件中。
PreviewButtonsAll定义在预览窗口中可用的按钮集。
ReportTypeRtSimpleDefines 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).

php挪用fastreport技巧_FastReport的运用方法

定义若何阐明数据源连接到DataSet属性。
如果ReportType = rtMultiple,报表将在不同韶光构建连接数据源的记录数。
ShowProgressTrue如果为True,当准备、打印或输出报表时显示过度窗口。
StoreInDFMFalse如果为True,存贮报表在DFM文件中。
把稳:报表存入DFM文件后存贮在可实行文件(EXE)中而不能被修正。
Title-报表标题。
这个名称显示在预览窗口和打印任务列表中。

php挪用fastreport技巧_FastReport的运用方法
(图片来自网络侵删)

把稳: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]

然后

usesfrxVariables;

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

结果发生非常。
不能赋值。
叨教该怎么通报程序中的变量到报表里面?

在你的 frReport 控件的 OnGetValue 事宜中加入以下代码:procedure TForm1.frReport1GetValue(const ParName: string;var ParValue: Variant);varTest: string;beginif ParName = 'Test' thenparValue := '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);beginif AnsiCompareText('SUMTOSTR', Name) = 0 thenval := My_Convertion_Routine(frParser.Calc(p1));end;

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

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

typeTMyFunctionLibrary = class(TfrFunctionLibrary)publicconstructor Create; override;procedure DoFunction(FNo: Integer; p1, p2, p3: Variant;var val: Variant); override;end;

constructor TMyFunctionLibrary.Create;begininherited Create;with List dobeginAdd('DATETOSTR');Add('SUMTOSTR');end;end;

procedure TMyFunctionLibrary.DoFunction(FNo: Integer; p1, p2, p3: Variant;var val: Variant);beginval := 0;case FNo of0: 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 dobegin// 创建分类(名称用空缺)Variables[' New category'] := '';// 创建变量Variables['New Variable'] := 'CustomerData.Customers."CustNo"';Variables['Another Variable'] := 'Page#';end;

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

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

但是当我运行报表是,涌现了缺点,为什么?

A: 由于 FastReport 假天命据词典中的字符串变量值是一个表达式,它须要剖析、打算它。
可以利用其它的方法:

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

或者, 利用 frVariables 来传输固天命据到报表。

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

A: 利用 TfrReport.Dictionary.DisabledDatasets:

with frReport1.Dictionary dobegin// 关闭该数据集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);beginif ParName = 'MyField' thenParValue := Table1MyField.Value;end;

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

with frReport1.Dictionary dobeginVariables['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);beginwith MyOpenDialog dobeginOpened := ShowModal = mrOk;if Opened thenbeginReport.LoadFromBlobField(...);ReportName := ...;end;end;end;

procedure TForm1.frDesigner1SaveReport(Report: TfrReport;var ReportName: String; SaveAs: Boolean; var Saved: Boolean);beginif SaveAs thenwith MySaveDialog dobeginSaved := ShowModal = mrOk;if Saved thenbeginReport.SaveToBlobField(...);ReportName := ...;end;endelseReport.SaveToBlobField(...);end;

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

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

vart: TfrMemoView;begint := TfrMemoView(frReport1.FindObject('Memo1'));if t <> nil thent.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) {elseResult := frReadString22(Stream);}end;

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

FR_Utils:

procedure frReadMemo(Stream: TStream; l: TStrings);vars: String;b: Byte;n: Word;beginl.Clear;l.Text := frReadString(Stream); exit;Stream.Read(n, 2);if n > 0 thenrepeatStream.Read(n, 2);SetLength(s, n);Stream.Read(s[1], n);l.Add(s);Stream.Read(b, 1);until b = 0elseStream.Read(b, 1);end;

function frReadString(Stream: TStream): String;vars: String;n: Integer;b: Byte;beginStream.Read(n, 4);SetLength(s, n);Stream.Read(s[1], n);if (n > 0) and (s[n] = #$0A) thenSetLength(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' thenTfrPictureView(View).Picture.LoadFromFile(...) 或.Assign 或.你所想要做的任何事情

每天早上敲醒自己的不是闹钟,是夢想!

标签:

相关文章