传递对象的存储过程,而不参考存储过程的类型。

问题描述 投票:0回答:1

我需要通过一个 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
delphi delphi-xe7
1个回答
0
投票

我找到了一个解决方案,使用 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;

看起来效果不错,但我想知道它是否安全,或者是否会引发其他问题。

如果有更好的替代方法,请贴出来,我很乐意考虑。

© www.soinside.com 2019 - 2024. All rights reserved.