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).

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top