在不引用过程类型的情况下传递对象的过程

我需要传递一个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;

...但是在编译时会在CallMethod(@ShowCaption);行生成E2036:

[dcc32 Error] Unit1.pas(33): E2036 Variable required
iCMS 回答:在不引用过程类型的情况下传递对象的过程

我已经找到了使用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;

它似乎工作良好,但我想知道它是否安全或是否会导致其他问题。

如果有更好/替代的方法,请发布它,我很乐意考虑

本文链接:https://www.f2er.com/2253647.html

大家都在问