fastreport 怎样使用自定义函数???(50分)

  • 主题发起人 主题发起人 JimmyBoy
  • 开始时间 开始时间
J

JimmyBoy

Unregistered / Unconfirmed
GUEST, unregistred user!
我的报表里有一个Memo,是阿拉伯数字,我写了一个转换成大写的函数,应该把函数放在那里?怎么使用?
是放在一个onuserfunction方法里吗?怎么放?怎么用?
 
给一个例子
procedure TForm1.frReport1UserFunction(const Name: String;
p1, p2,
p3: Variant;
var Val: Variant);
begin
if AnsiCompareText('MONEYNAME', Name) = 0 then
Val := MONEYNAME(p1);//MONEYNAME是你的函数名,这样定义以后,任你随处引用
end;
 
给你贴一段帮助
---------------- 使用自定义函数 ----------------------------------------
问: 我怎样才可以自己添加函数?
答: 用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函数:)

问: Ok, 但是这个函数仅仅在一个TfrReport组件中其作用.可以让这个函数在所有的
TfrReport组件中都能使用吗?
答: 给所有报表组件的OnUserFunction事件赋句柄:)如果你不想这么干的话,你就
只好创建一个函数库了:
type
TMyFunctionLibrary = class(TfrFunctionLibrary)
public
constructor Create;
override;
proceduredo
Function(FNo: Integer;
p1, p2, p3: Variant;
var val: Variant);
override;
end;

constructor TMyFunctionLibrary.Create;
begin

inherited Create;
with Listdo

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);

问: 怎样可以把自定义函数增加到函数列表中去?
答: 用frAddFunctionDesc过程(在FR_Class单元中):
frAddFunctionDesc(FuncLib, 'SUMTOSTR', 'My functions',
'SUMTOSTR(<Number>/Converts number to its verbal presentation.');

注意: "/"符号是必需的!它标示了哪段是函数的声明部分哪段是描述部分.
FuncLib指向你的函数库(可以为nil如果你没有使用函数库的话),当函数库取消注册时,
它包含的所有函数自动从函数列表中移出。
 
我想以上的方法应该可以实现,但是我没有试过,下面这个方法是我运行通的
如果你感兴趣,可以自己试一试:
1、先在fastreport的数据字典里面,把要转换大小写的字段重新名一个参数名字(针对从数据库表里面读字段的情况):
这里假设字段1:名为m1,字段2:名为m2;
2、然后在frreport的OnGetValue事件里面写入以下代码:
procedure TForm1.frReport3GetValue(const ParName: String;
var ParValue: Variant);
var
a,A:string;
begin
if (ParName='m1') then
//如果参数(数据字典中)的名字为m1则转换;
begin
调用转换函数;
ParValue :=转换以后的值;
end;
if (ParName='m1') then

begin
//道理同上
end;
end;
 
sorry,第二个参数是:
if (ParName='m2') then
begin
end;
这样,你可以选择要转换的不同字段,调用函数
 
最后实现:
procedure TForm1.frReport1UserFunction(const Name: String;
p1, p2,
p3: Variant;
var Val: Variant);
begin
if AnsiCompareText('MONEYNAME', Name) = 0 then
Val := MONEYNAME(frParser.Calc(p1));//MONEYNAME是你的函数名,这样定义以后,任你随处引用
end;
 
多人接受答案了。
 
后退
顶部