FastReport问题集 选自Delphi园地 http://www.delphifans.com/InfoView/Article_401.html---------------- 使用自定义函数 ----------------------------------------
Q: 我怎样添加我的自定义函数?
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 或
.你所想要做的任何事情
分享到:
相关推荐
1. **中文字符集增强**:全面优化了内部编码处理,确保在任何环节中,中文字符都能正确显示,避免了常见的乱码现象。 2. **Delphi版本兼容性**:不仅限于特定的Delphi版本,而是广泛支持D4到D15,为不同阶段的项目...
- `frxHelp.chm`:这是FastReport的帮助文件,包含了详细的功能介绍、API参考和常见问题解答。 - `FRVCLDeveloperManual-en.pdf`:开发者手册,深入讲解如何在项目中集成和使用FastReport控件,包括安装、配置、...
除了详细讲解基础功能,本指南还分享了一些高级技巧和常见问题的解决方法,帮助开发者提高工作效率,避免常见的错误和陷阱。 总结,FastReport 2.4开发指南是一份全面的参考资料,不仅涵盖了报表设计的基础知识,还...
首先,我们要理解“乱码”问题在软件开发中的常见原因。在处理多语言字符集,特别是中文这样的双字节字符集(如GB2312、GBK或UTF-8)时,如果编码和解码不一致,就可能导致乱码现象。FastReport 4.15 DXE6之前的版本...
在IT领域,特别是软件开发与报告生成工具的使用过程中,遇到汉字显示不全的问题是较为常见的挑战之一。本文将深入探讨fastReport汉字显示不全的解决办法,旨在为使用fastReport进行复杂报告设计与生成的开发者提供...
4. **数据连接和处理**:源代码中会涉及到如何连接和操作数据库,以及如何使用数据集来填充报表。这对于需要集成FastReport到已有数据库系统的开发者非常有价值。 5. **脚本和宏支持**:FastReport支持在报表中使用...
在使用FastReport 4.9.20时,可能会遇到一个常见的问题,即中文菜单显示不全或出现乱码的情况。这通常是由于字符编码不兼容或者资源文件未能正确处理中文字符集导致的。针对这个问题,我们可以采取一些有效的解决...
3. **数据绑定**:FastReport能够直接连接多种数据库,如SQL Server、Oracle、MySQL等,支持数据集、数据表等多种数据源,可以方便地将数据库中的数据绑定到报表单元格,实现动态报表生成。 4. **多语言支持**:...
- `使用说明.txt`:这是用户指南或快速入门教程,会提供安装步骤、基本操作和常见问题解答,帮助用户快速上手FastReport 3.05。 综上所述,FastReport 3.05是一个强大的报表解决方案,它的全面功能和易于使用的...
- 数据集:FastReport.NET使用数据集作为数据容器,可以连接多个数据源,进行数据合并或筛选。 - 动态数据绑定:通过参数化查询,实现报表数据的动态加载,适应不同场景需求。 5. 打印与导出: - 打印功能:提供...
最后,手册通常会包含一些实用技巧和常见问题解答,帮助用户解决在实际操作中可能遇到的问题。例如,如何优化大型报表的性能,如何调试脚本错误,以及如何自定义报表样式等。 总之,《FastReport中文操作手册》是一...
这份文档对于初次接触FastReport的用户来说非常有用,可以帮助他们顺利完成安装和配置过程,避免遇到常见的问题。 `173绿色软件.url` 是一个快捷方式,可能指向一个网页,提供更多的FastReport资源,比如最新的版本...
在这个特定的问题中,我们要探讨的是如何在FastReport报表中动态地为变量赋值,这是一个常见的需求,尤其是在处理动态数据或者需要根据用户输入调整报告内容时。 首先,让我们理解FastReport的工作原理。FastReport...
FastReport 4提供了对多种数据集的支持。其中TfrxDBDataSet是一个数据集类型,它可以通过数据库连接直接为报表提供数据;而TfrxAdoQuery、TfrxAdoConnection、TfrADBDataSet等组件则可以与ADO(ActiveX Data Objects...
在IT领域,报表打印和导出是常见的需求之一,FastReport作为一款强大的报表设计工具,因其灵活、高效的特点,被广泛应用。然而,在处理中文字符时,尤其是涉及到字体选择时,可能会遇到一些挑战。本文将深入探讨...
3. 数据集:数据集是FastReport中的一个重要概念,它可以存储查询结果,供报表使用。 五、报表预览与打印 1. 预览:FastReport提供了强大的预览功能,可以查看报表在不同输出格式下的效果,支持缩放、打印预览等...
在IT领域,尤其是在软件开发中,字符编码问题是一个常见的挑战,特别是当涉及到多语言支持时。FastReport是一款流行的报表设计工具,它允许开发者创建复杂的报表并集成到他们的应用程序中。然而,FastReport 4.2在...
此外,FastReport还支持数据集的分组、排序和过滤,为数据分析提供了便利。 报表的输出方式也是FastReport的一大亮点。除了常见的打印,FastReport还能导出报表为PDF、HTML、Excel、XML等多种格式,方便数据交换和...
包括设计模式工具栏、“标准”工具栏、“文本”工具栏、“边框”工具栏和“对齐”工具栏等,每种工具栏都带有特定的功能,比如设计模式工具栏用于切换报表的设计模式,标准工具栏则提供文件操作、编辑工具等常见功能...
10. **Readme from evget.txt**:这个文件可能是FastReport.Net的阅读指南或者使用说明,可能包含了关于软件的安装步骤、功能详解、常见问题解答等内容。 11. **慧都控件网.url**:这是一个链接到慧都控件网的快捷...