Подтвердить что ты не робот

Как передать метод объекта в качестве параметра в Delphi, а затем вызвать его?

Я боюсь, что это, наверное, немного фиктивный вопрос, но у меня все в порядке.

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

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

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

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

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;

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

4b9b3361

Ответ 1

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

procedure TCallbackObject.SetupCallback;
begin
  CallbackTheCallback(CallbackMethodImpl);
end;

Ответ 2

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