|
Fast Report 问题集(1)
Fast Report 问题集 nxyc_twz@163.com ---------------- 使用自定义函数 ----------------------------------------
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 中.
|