我用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)等都不行  这是什么回事?
  请高手指点!真着急!

解决方案 »

  1.   

    帖一段給你。扩展函数列表
    这个手册很早就描述了怎样扩展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.');
      

  2.   

    zhaolee():
      谢谢你!
      不过这个文件我也有,就是fastreport的中文文档。
      我也不想将自己的函数做一个类,我只是想在报表中简单的用到我的函数,但是就是不知道怎么调用才能成功?
      请高手继续指点!谢谢!
      

  3.   

    问题解决了:
    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;