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

#delphi #pointers #callback

Вопрос:

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

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

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

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

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

 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;
 

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

Комментарии:

1. впечатляет, как некоторые люди иногда делают вещи сложнее, анализируя метод вызова потока здесь, где я работаю, было бы намного проще, если бы они выполняли вызовы с использованием этого подхода. спасибо за вопрос

Ответ №1:

Просто удалите указатель. Дельфи сделает это за вас:

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

Ответ №2:

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