摘要: Delphi报表插件FastReport中如何加入自定义函数
在fastreport脚本可以写函数,当有许多windows自动api不能用,试着利用fastreport的AddFunction,OnUserFunction实现。
(网上搜)Fastreport可以自己加入需要的函数,来实现特定的功能。过程就是:
1)添加函数到报表中。
frxreport1.AddFunction('完整的函数声明');
如有一个自定义函数,为GetName(Old:String):String;这个函数通过数据集的一个字段,得到另一个返回值。
则语句为:frxreport1.AddFunction('Function GetName(Old:String):String;');
2)脚本中使用函数。
在脚本中或报表中使用自定义函数,就像使用其它Fastreport内置函数一样。
3)程序中处理函数。
使用函数是通过frxreport1的OnUserFunction函数来实现的。
OnUserFunction的声明如下:Function(constMet
我:
3)程序中处理函数。
使用函数是通过frxreport1的OnUserFunction函数来实现的。
OnUserFunction的声明如下:Function(constMethodName: String;var Params: Variant): Variant;
比如上面的函数,首先要有一个函数,这个函数是GetName的实现部分。如有一个在程序中实现的函数。
function RealGetName(Old:String):String;这个函数名是无所谓的,也可以是GetName。
在OnUserFunction的事件处理中有如下代码即可完成自定义函数在报表中的使用。
if CompareText(MethodName,'GetName')=0 thenResult:=RealGetName(VarToStr(Params[0]));
我一般都是使用CompareText来比较函数名,因为我发现二个版本的Fastreport,一个是
MethodName全部自动变成了小写,一个是全部自动变成了大写,所以干脆用CompareText来比较,
肯定不会出错。
如果有多个参数,则依次传递Params[0],Params[1]即可,要保持顺序一致。
这里要注意一点,如果参数为指针,则不能直接使用Pointer(Integer(Params[0]))。因为实际传
递过来的是指针的整数值,可以使用Pointer(StrToInt(VarToStr(Params[0])))。
实例代码:
unit Unit3;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Data.DB, Datasnap.DBClient,
frxClass, frxDBSet, frxDesgn;
type
TForm3 = class(TForm)
Button1: TButton;
Button2: TButton;
frxDesigner1: TfrxDesigner;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
dt1: TClientDataSet;
ds1: TDataSource;
frxDBDataset1: TfrxDBDataset;
dt2: TClientDataSet;
ds2: TDataSource;
frxDBDataset2: TfrxDBDataset;
frxReport: TfrxReport;
Function UserFunction(const MethodName: String;var Params: Variant): Variant;
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
//简繁体装换函数
function Cn2Big(CnStr: string): string;
var
Len: Integer;
begin
Len := Length(CnStr);
SetLength(Result, Len);
LCMapString(GetUserDefaultLCID, LCMAP_TRADITIONAL_CHINESE, PChar(CnStr), Len, PChar(Result), Len);
end;
function BIG2cn(bigStr: string): string;
var
Len: Integer;
begin
Len := Length(bigStr);
SetLength(Result, Len);
LCMapString(GetUserDefaultLCID, LCMAP_SIMPLIFIED_CHINESE, PChar(bigStr), Len, PChar(Result), Len);
end;
Function TForm3.UserFunction(const MethodName: String;var Params: Variant): Variant;
begin
if CompareText(MethodName,'Cn2Big')=0 then
Result:=Cn2Big(VarToStr(Params[0]))
else if CompareText(MethodName,'BIG2cn')=0 then
Result:=BIG2cn(VarToStr(Params[0]));
end;
procedure TForm3.Button1Click(Sender: TObject);
begin
frxReport.DesignReport();
end;
procedure TForm3.Button2Click(Sender: TObject);
var OpenTemplate : TOpenDialog;
begin
try
OpenTemplate := TOpenDialog.Create(nil);
OpenTemplate.DefaultExt := 'fr3';
OpenTemplate.Title := '预览模板';
if not OpenTemplate.Execute then exit;
if not fileexists(OpenTemplate.FileName) then exit;
self.frxReport.LoadFromFile(OpenTemplate.FileName);
if assigned(OpenTemplate) then
freeandnil(OpenTemplate);
frxreport.PrepareReport(true);
frxreport.ShowReport;
except on e : exception do
showmessage(e.Message);
end;
end;
procedure TForm3.FormCreate(Sender: TObject);
var
i, j : integer;
begin
dt1 := TClientDataSet.Create(nil);
ds1 := TDataSource.Create(nil);
frxDBDataset1 := TfrxDBDataset.Create(nil);
frxDBDataset1.UserName := '学生表';
dt2 := TClientDataSet.Create(nil);
ds2 := TDataSource.Create(nil);
frxDBDataset2 := TfrxDBDataset.Create(nil);
frxDBDataset2.UserName := '课程表';
dt1.FieldDefs.Add('sid',ftInteger);
dt1.FieldDefs.Add('sname',ftString,1000);
dt2.FieldDefs.Add('sid',ftInteger);
dt2.FieldDefs.Add('cid',ftInteger);
dt2.FieldDefs.Add('cname',ftString,1000);
ds1.DataSet := dt1;
frxDBDataset1.DataSource := ds1;
ds2.DataSet := dt2;
frxDBDataset2.DataSource := ds2;
dt2.MasterSource := ds1;
dt2.MasterFields := 'sid';
dt2.IndexFieldNames := 'sid';
frxReport := TfrxReport.Create(nil);
frxReport.DataSets.Add(frxDBDataset1);
frxReport.DataSets.Add(frxDBDataset2);
frxReport.AddFunction('function Cn2Big(CnStr: string): string;','用户自定义函数','简体装换繁体');
frxReport.AddFunction('function BIG2cn(bigStr: string): string;','用户自定义函数','繁体装换简体');
frxReport.OnUserFunction := UserFunction;
dt1.CreateDataSet;
dt2.CreateDataSet;
for i := 1 to 3 do
begin
dt1.Append;
dt1.FieldByName('sid').AsInteger := i;
dt1.FieldByName('sname').AsString := '学生' + inttostr(i);
dt1.Post;
for j := 1 to 3 do
begin
dt2.Append;
dt2.FieldByName('sid').AsInteger := i;
dt2.FieldByName('sid').AsInteger := i;
dt2.FieldByName('cname').AsString := '学生' + inttostr(i) + '課程' + inttostr(j);
dt2.Post;
end;
end;
end;
procedure TForm3.FormDestroy(Sender: TObject);
begin
frxReport.Destroy;
frxDBDataset1.Destroy;
frxDBDataset2.Destroy;
ds2.Destroy;
ds1.Destroy;
dt2.Destroy;
dt1.Destroy;
end;
end.
效果:
原文链接
相关推荐
在FastReport中添加自定义函数是一项常见的需求,它允许用户扩展报表引擎的功能,以满足特定的业务逻辑。FastReport是一款强大的报表设计工具,广泛应用于Windows应用程序中,支持多种编程语言,如Delphi和C++...
在这个"fastreport4.5函数大全"中,每个函数都配以实例,方便开发者理解和应用。 1. **函数概述** FastReport中的函数主要分为几个类别:数据操作、格式转换、数学运算、字符串处理、日期时间处理等。这些函数可以...
提供的“FastReport自定义制作报表.txt”文件可能包含了一些示例代码或教程,用于解释如何在程序中调用FastReport API,自定义报表的生成过程。这可能是创建报表实例、设置数据源、编译模板、填充数据、导出或打印...
FastReport 中可以加入自定义函数来实现特定的功能,过程如下:1)添加函数到报表中,例如:frxreport1.AddFunction('Function GetName(Old:String):String;');2)脚本中使用函数,例如:使用 GetName 函数来得到另一...
FastReport常见的几个问题 1.FastReport中如何共用...7.加入自定义函数 8.在FastReport中将两字段连接起来(用脚本实现) 9.数据栏的动态调试设置 10.在Delphi中定义数据字段 11.分组时打印页号(组内分页显示页码)
FastReport提供了一种方法,通过编写自定义函数来实现这一转换。本例中的代码展示了一个具体的实现过程,用于将货币类型的数值(小写金额)转换为汉字大写形式。 #### 实现原理与步骤 1. **初始化与预处理**:首先...
或者,可以自定义一个适合中文的折行算法,通过重载OnBeforePrint或OnFormat事件,在事件处理函数中插入自己的折行逻辑。 资源方面,可以参考FastReport的官方文档,以及社区论坛中关于中文折行问题的讨论和解决...
FastReport是一款强大的报表开发控件,尤其在Delphi环境中被广泛应用。它提供了丰富的报表设计功能,使开发者能够轻松创建复杂的报表布局,并且支持多种数据源,使得报表数据的获取和展示变得简单高效。本指南将深入...
6. **过滤与计算**:提供关于如何使用过滤条件和自定义函数进行数据筛选和计算的实例。 7. **打印与导出**:解释如何设置打印选项,以及如何将报表导出为PDF、Excel、HTML等多种格式。 8. **错误排查与优化**:针对...
此外,FastReport还支持自定义组件开发,极大地扩展了其功能范围。 在.NET环境中,FastReport可以无缝集成到Visual Studio中,提供拖放式报表设计界面,使得设计过程直观而高效。它支持多种.NET编程语言,如C#、VB...
在C#中,我们可以通过P/Invoke(平台调用)技术来调用这个DLL中的函数,实现与FastReport的交互。 4. **C#调用FastReport步骤** - **创建报表对象**:实例化`FastReport.Report`类,它是报表的基础对象。 - **...
在FastReport中,用户可以利用内置函数来实现日期时间的提取和展示,例如提取某个字段中的年份、月份和日期,并将这些值以自定义的格式显示出来。 根据题目提供的部分代码示例:`[YearOf()][MonthOf()][DayOf()]`,...
FastReport4 开发者手册不仅涵盖了基础的类层级结构介绍,还包括了如何编写自定义组件、通用控件、事件处理器等内容,同时还提供了关于脚本系统中的组件注册、编写组件编辑器和属性编辑器、编写自定义数据库引擎、在...
当我们需要在DUILib项目中集成自定义数据源的报表功能时,FastReport就显得尤为适用。下面将详细解释如何在DUILib中使用FastReport来处理自定义数据。 首先,理解DUILib的核心概念。DUILib提供了一套基于Windows...
在这个“FastReport控件帮助与开发文档”中,我们将探讨FastReport的核心功能、设计原理以及如何在实际项目中应用。 1. **FastReport简介** - FastReport是一种基于组件的报表解决方案,它允许开发者在应用程序中...
DLL(Dynamic Link Library)是Windows操作系统中的一个共享库,包含了可供多个程序调用的函数和资源。将FastReport的完整版DLL替换掉DEMO版本的DLL,就能解除水印限制,使报告设计和打印功能不受干扰。 要实现这个...
在IT行业中,报表生成工具是不可或缺的一部分,FastReport作为一款流行的报表引擎,广泛应用于Delphi开发环境中。然而,像许多软件一样,它也可能遇到一些问题,例如在处理含有HTML标签的中文内容时可能会出现显示...
FastReport是一款强大的报表设计和打印工具,它允许在Delphi应用程序中创建复杂的报表,支持多种数据库连接和自定义脚本。FastReport不仅提供预览和打印功能,还支持导出报表为PDF、HTML、Excel等多种格式。 接下来...
本文将深入探讨FastReport 3.15版本中针对PDF导出,支持任意简体中文字体的源码实现,并提供关键知识点。 FastReport的PDF导出功能在默认情况下可能只支持有限的字体集,这可能导致某些特定的简体中文字体无法正常...
- **全局应用**: 若要使自定义函数在所有TfrReport组件中生效,可通过为所有报表组件设置相同的`OnUserFunction`事件处理程序实现。此外,还可以创建一个自定义函数库来管理这些函数。 ```pascal type ...