我需要通过一个 procedure of object
作为参数,而不使用过程类型作为参数。
我试过用 Pointer
类型如下。
TMyMethod = procedure () of object;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
public
procedure CallMethod(AMethod : Pointer);
procedure ShowCaption();
end;
procedure TForm1.CallMethod(AMethod : Pointer);
begin
TMyMethod(AMethod^)();
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CallMethod(@ShowCaption);
end;
procedure TForm1.ShowCaption();
begin
ShowMessage(Self.Caption);
end;
...但在编译时却产生了E2036,在... CallMethod(@ShowCaption);
行,我需要传递一个对象的过程作为参数,而不使用过程类型作为参数。
[dcc32 Error] Unit1.pas(33): E2036 Variable required
我找到了一个解决方案,使用 TMethod
型。
TMyMethod = procedure () of object;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
public
procedure CallMethod(AMethod : TMethod);
procedure ShowCaption();
end;
procedure TForm1.CallMethod(AMethod : TMethod);
begin
TMyMethod(AMethod)();
end;
procedure TForm1.FormCreate(Sender: TObject);
var
Meth : TMethod;
begin
Meth.Data := Self;
Meth.Code := @TForm1.ShowCaption;
CallMethod(Meth);
end;
procedure TForm1.ShowCaption();
begin
ShowMessage(Self.Caption);
end;
看起来效果不错,但我想知道它是否安全,或者是否会引发其他问题。
如果有更好的替代方法,请贴出来,我很乐意考虑。