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

StackOverflow https://stackoverflow.com/questions/178138

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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;

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

Это было полезно?

Решение

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top