Передача процедуры объекта без привязки к типу процедуры - PullRequest
0 голосов
/ 28 мая 2020

Мне нужно передать 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

1 Ответ

0 голосов
/ 28 мая 2020

Я нашел решение, используя тип 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;

Кажется, он работает хорошо, но мне интересно, безопасно ли это или может привести к другим проблемам.

Если есть лучший / альтернативный способ, опубликуйте его, и я буду рад его рассмотреть

...