Как передать метод объекта в качестве параметра в Delphi, а затем вызвать его? - PullRequest
16 голосов
/ 07 октября 2008

Боюсь, это, наверное, немного глупый вопрос, но он меня сильно озадачил.

Я ищу самый простой способ передать метод объекта в процедуру, чтобы процедура могла вызывать метод объекта (например, после истечения времени ожидания или, возможно, в другом потоке). Так что в основном я хочу:

  • Захватить ссылку на метод объекта.
  • Передайте эту ссылку в процедуру.
  • Используя эту ссылку, вызовите метод объекта из процедуры.

Я полагаю, что смог бы добиться того же эффекта, используя интерфейсы, но я подумал, что есть другой способ, поскольку существует объявление типа «процедура объекта».

Следующая не не работает, но может ли она помочь объяснить, где я в замешательстве ...?

interface 
  TCallbackMethod = procedure of object;

  TCallbackObject = class
    procedure CallbackMethodImpl;
    procedure SetupCallback;
  end;

implementation

procedure CallbackTheCallback(const callbackMethod: TCallbackMethod);
begin
  callbackMethod();
end;

procedure TCallbackObject.CallbackMethodImpl;
begin
  // Do whatever.
end;

procedure TCallbackObject.SetupCallback;
begin
  // following line doesn't compile - it fails with "E2036 Variable required"
  CallbackTheCallback(@self.CallbackMethodImpl);
end;

(После ответа на вопрос я удалю приведенный выше код, если это не поможет объяснению).

Ответы [ 2 ]

18 голосов
/ 07 октября 2008

Просто удалите Pointer. Delphi сделает это за вас:

procedure TCallbackObject.SetupCallback;
begin
  CallbackTheCallback(CallbackMethodImpl);
end;
2 голосов
/ 07 октября 2008

Причина, по которой вам не нужен синтаксис указателя, заключается в том, что вы объявили тип метода как процедуру объекта. Компилятор выяснит из оператора "объекта", как обрабатывать передачу метода из процедуры обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...