¿Cómo pasar un método de objeto como un parámetro en Delphi y luego llamarlo?
Pregunta
Me temo que esta es probablemente una pregunta falsa, pero me ha dejado perplejo.
Estoy buscando la forma más simple posible de pasar un método de un objeto a un procedimiento, de modo que el procedimiento pueda llamar al método del objeto (por ejemplo, después de un tiempo de espera, o tal vez en un hilo diferente). Así que básicamente quiero:
- Capture una referencia al método de un objeto.
- Pase esa referencia a un procedimiento.
- Usando esa referencia, llame al método del objeto desde el procedimiento.
Me imagino que podría lograr el mismo efecto utilizando interfaces, pero pensé que había otra forma, ya que este " procedimiento de objeto " existe una declaración de tipo.
El siguiente no funciona, pero ¿podría ayudar a explicar dónde estoy confundido ...?
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;
(Una vez que se responda la pregunta, eliminaré el código anterior a menos que ayude a la explicación de alguna manera).
Solución
Solo quita las cosas del puntero. Delphi lo hará por ti:
procedure TCallbackObject.SetupCallback;
begin
CallbackTheCallback(CallbackMethodImpl);
end;
Otros consejos
La razón por la que no necesita la sintaxis del puntero es que ha declarado el tipo de método como un procedimiento de objeto. El compilador descubrirá el " del objeto " declaración de cómo manejar pasar el método fuera del proceso de devolución de llamada.