我用fastreport2.5和Delphi7做一个简单的报表程序,遇到问题如下:
我想在报表中的
memo1显示字段"金额"的值,
想要在memo2中显示字段"金额"的大写(汉字),于是想调用一个自定义的函数
dxje(),当然,这个函数是定义在Delphi里的。
于是,我就在frReport1的OnUserFunction事件里写下:
if Ansicomparetext('dxje',name) = 0 then
Val:=dxje(p1);然后,在frReport1里面的Band1(memo1和memo2都在其上)的OnBeforePrint事件中写了:
memo2.Memo:=dxje([金额]) 却不能出来结果,并且编译器报错。我看了单步调试的结果,[金额]并没有传值,只是成为一个字符串(还是‘[金额]’)。
我换了几种写法,如:memo2.Memo:=dxje(memo1.memo)等都不行 这是什么回事?
请高手指点!真着急!
我想在报表中的
memo1显示字段"金额"的值,
想要在memo2中显示字段"金额"的大写(汉字),于是想调用一个自定义的函数
dxje(),当然,这个函数是定义在Delphi里的。
于是,我就在frReport1的OnUserFunction事件里写下:
if Ansicomparetext('dxje',name) = 0 then
Val:=dxje(p1);然后,在frReport1里面的Band1(memo1和memo2都在其上)的OnBeforePrint事件中写了:
memo2.Memo:=dxje([金额]) 却不能出来结果,并且编译器报错。我看了单步调试的结果,[金额]并没有传值,只是成为一个字符串(还是‘[金额]’)。
我换了几种写法,如:memo2.Memo:=dxje(memo1.memo)等都不行 这是什么回事?
请高手指点!真着急!
解决方案 »
- 使用Delphi XE TThread时的一些问题
- 如何在A4纸上打印固定格式内容的记录。并且是多个表的记录?
- 请问怎么在程序里实现OCX控件注册,还有,注册表的修改问题
- 一段sql语句,我执行like可以,执行<和>都无法返回数据
- delphi和触发器
- Abstract (抽象类)可否理解为它下面可实例化类的框架?
- 开放源代码的编译器 OpoenPL/G V0.02,有兴趣的欢迎提意见.
- 如何判断输入的是数字?!
- 关于Mass Storage USB应用程序的开发问题
- 客户要求软件能在95、98、2000、XP、ME、NT下都能跑,给个解决方案。
- 全国各地搞软件销售的底薪是什么水平?在没有业绩的情况下,怎么维持基本生活,了解的,麻烦说两句
- 新手提问:创建自定义函数
这个手册很早就描述了怎样扩展FastReport的函数功能。这个方法是基于TfrReport控件的OnUserFunction事件。这个方法的缺点是:所有的TfrReport对象的自定义函数都必须放在同一个OnUserFunction事件处理中(也就是自定义函数都必须到TfrReport中去找)。作为选择,你也可以将一系列的函数放到一个单独的类库中(函数类库)。FastReport支持这种可选方法,你可以写一个TfrFunctionLibrary的继承类(“继承”什么?-或者可以使用“引用”)。这个类中定义了一些开发者需要了解的FastReport工作的基本属性和方法。这是TfrFunctionLibrary在FR_Class模块中的声明:TfrFunctionLibrary = class(TObject)public List: TStringList; constructor Create; virtual; destructor Destroy; override; function OnFunction(const FName: String; p1, p2, p3: Variant; var val: String): Boolean; procedure DoFunction(FNo: Integer; p1, p2, p3: Variant; var val: String); virtual; abstract;end;下面是一些关键模块:Create-设计器生成一个可用的函数列表,并按大写字母顺序;DoFunction-当调用时,这个方法用于返回(返回什么?)使用参数计算的函数值。每个函数最多有三个参数。这些参数的值是通过DoFunction的P1,P2,P3参数取得。下面是一个有两个函数的简单例子: 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('DATEPROPIS'); Add('SUMPROPIS'); 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;要在FastReport中激活已定义的函数类库,你需要注册它。意思是调用frRegisterFunctionLibrary方法并将这个类库作为它的一个参数(不是类的实例)。例如:frRegisterFunctionLibrary(TMyFunctionLibrary);要增加附加函数列表以“插入函数”对话框中,你需要通过下列参数调用frAddFunctionDesc方法:函数名称;这个函数的分类名;这个函数的语法和目的的描述。注意:在函数描述中必须有“/”标记!它用于在函数中分隔语法描述。记住每个函数都需要单独调用rAddFunctionDesc。这里有一个在表达式生成器中注册函数的例子:frAddFunctionDesc('SUMPROPIS', 'My functions', 'SUMPROPIS(<Number>)/Returns value spelled out.');
谢谢你!
不过这个文件我也有,就是fastreport的中文文档。
我也不想将自己的函数做一个类,我只是想在报表中简单的用到我的函数,但是就是不知道怎么调用才能成功?
请高手继续指点!谢谢!
procedure TForm1.frRepGyydUserFunction(const Name: String; p1, p2,
p3: Variant; var Val: Variant);
var
s_temp:string;
begin if Ansicomparetext('dxje',name) <> 0 then exit;
s_temp:=frParser.Calc(p1);
Val:=dxje(s_temp);
end;