#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», как обрабатывать передачу метода из процесса обратного вызова.