我现有一控件,这个有一个事件:
procedure TForm1.RMDesigner1SaveReport(Report: TRMReport;
  var ReportName: String; SaveAs: Boolean; var Saved: Boolean);
beginend;现在我想动态创建这个控件,写需要用到这个事件,不知道应该如何写这个事件代码?

解决方案 »

  1.   


    procedure HandleRMDesignerSaveReport(Report: TRMReport; 
      var ReportName: String; SaveAs: Boolean; var Saved: Boolean); 
    begin
      //处理东西
    end;procedure TForm1.Create(AOwner: TComponent);
    begin
      RMDesigner1.OnSaveReport := HandleRMDesignerSaveReport;
    end;
      

  2.   

    procedure SaveReport(Report: TRMReport; 
      var ReportName: String; SaveAs: Boolean; var Saved: Boolean); 
    begin 
      //
    end; 
    RMDesigner1.onSaveReport := SaveReport;
      

  3.   

    谢谢楼上的,现在出现这个问题:
    [Error] RMT.pas(73): Incompatible types: 'method pointer and regular procedure'还有我注意到楼上有的朋友写的是TForm1.Create我的这个没有窗体,是在一个unit单元中。
    请问问题出在哪儿呀?!
      

  4.   

    不管在窗体还是unit单元,如果你执行的方法在当前的unit单元中,只要把你的事件要执行的方法名赋给RMDesigner1.onSaveReport 就好了
    如果是在不同的unit单元,引用单元名称,实例化类,调用写好的单元中的方法名赋给事件就好了。
    我平时写东西就喜欢动态创建,事件就是这么写的。
      

  5.   

    不是窗体的话,最好也要把方法写在某个对象里,然后再关联过去。这是推荐给初学的做法。我的例子中“HandleRMDesignerSaveReport”应该为“TForm1.HandleRMDesignerSaveReport”,手误了。
      

  6.   


    不行,要出现:[Error] RMT.pas(73): Incompatible types: 'method pointer and regular procedure' 
      

  7.   

    普通函数怎么能赋值给event?procedure TForm1.RMDesigner1SaveReport(Report: TRMReport; 
      var ReportName: String; SaveAs: Boolean; var Saved: Boolean); 
    begin end;procedure TForm1.Create(AOwner: TComponent);
    begin
      RMDesigner1.OnSaveReport := HandleRMDesignerSaveReport;
    end;
      

  8.   


    TEventProvider = class(TObject)
    public
      procedure HandleRMDesignerSaveReport(Report: TRMReport; var ReportName: String; SaveAs: Boolean; var Saved: Boolean);
    end;procedure TEventProvider.HandleRMDesignerSaveReport(Report: TRMReport; var ReportName: String; SaveAs: Boolean; var Saved: Boolean);
    begin
      //.....
    end;TMyObject = class(TObject)
    private
      FEventProvider: TEventProvider;
      FRMDesigner: TRMDesigner;
    public
      constructor Create;
      destructor Destroy; override;
    end;procedure TMyObject.Create;
    begin
      inherited;
      FEventProvider := TEventProvider.Create;
      FRMDesigner := TRMDesigner.Create(nil);
      FRMDesigner.OnSaveReport := FEventProvider.HandleRMDesignerSaveReport;
    end;procedure Destroy;
    begin
      FRMDesigner.Free;
      FEventProvider.Free;
      inherited;
    end;
      

  9.   

    完了,这个问题确实从来没有遇到过。
    TEventProvider 这句就编译不过去,提示说:
    [ Declaration expected but identifier 'TEventProvider' found
      

  10.   

    9楼的对,少了个对象方法定义对象方法定义
    type
      TObjProc=procedure(Report: TRMReport; var ReportName: String; SaveAs: Boolean; var Saved: Boolean) of object;
     //对象方法,隐含了一个self引用.
    然后如:
    Type
      TMyClass=class
        MyProc: TObjProc;
      end;
    实现方法的类
      TOrtherClass=class
        procedure InstProc(Report: TRMReport; var ReportName: String; SaveAs: Boolean; var Saved: Boolean);
      end;
    可以这样调用:
    var
      MyClass:TMyClass;
      OrtherClass:TOrtherClass;....
      MyClass.Myproc=OrtherClass.InstProc;
      //只要参数类型一致的对象方法,注意是“对象方法”,都可以调用,普通方法可不行。这个就是VCL实现事件的秘密
      

  11.   

    to 11楼:无需声明TObjProc,我不是把那个方法作为属性,我是直接关联的。