我现有一控件,这个有一个事件:
procedure TForm1.RMDesigner1SaveReport(Report: TRMReport;
var ReportName: String; SaveAs: Boolean; var Saved: Boolean);
beginend;现在我想动态创建这个控件,写需要用到这个事件,不知道应该如何写这个事件代码?
procedure TForm1.RMDesigner1SaveReport(Report: TRMReport;
var ReportName: String; SaveAs: Boolean; var Saved: Boolean);
beginend;现在我想动态创建这个控件,写需要用到这个事件,不知道应该如何写这个事件代码?
procedure HandleRMDesignerSaveReport(Report: TRMReport;
var ReportName: String; SaveAs: Boolean; var Saved: Boolean);
begin
//处理东西
end;procedure TForm1.Create(AOwner: TComponent);
begin
RMDesigner1.OnSaveReport := HandleRMDesignerSaveReport;
end;
var ReportName: String; SaveAs: Boolean; var Saved: Boolean);
begin
//
end;
RMDesigner1.onSaveReport := SaveReport;
[Error] RMT.pas(73): Incompatible types: 'method pointer and regular procedure'还有我注意到楼上有的朋友写的是TForm1.Create我的这个没有窗体,是在一个unit单元中。
请问问题出在哪儿呀?!
如果是在不同的unit单元,引用单元名称,实例化类,调用写好的单元中的方法名赋给事件就好了。
我平时写东西就喜欢动态创建,事件就是这么写的。
不行,要出现:[Error] RMT.pas(73): Incompatible types: 'method pointer and regular procedure'
var ReportName: String; SaveAs: Boolean; var Saved: Boolean);
begin end;procedure TForm1.Create(AOwner: TComponent);
begin
RMDesigner1.OnSaveReport := HandleRMDesignerSaveReport;
end;
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;
TEventProvider 这句就编译不过去,提示说:
[ Declaration expected but identifier 'TEventProvider' found
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实现事件的秘密