Comment passer une méthode d'objet en tant que paramètre dans Delphi, puis l'appeler?

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

  •  05-07-2019
  •  | 
  •  

Question

Je crains que ce ne soit probablement une question un peu fictive, mais cela me laisse perplexe.

Je cherche le moyen le plus simple possible de passer une méthode d'un objet dans une procédure, afin que celle-ci puisse appeler la méthode de l'objet (par exemple, après un délai d'attente ou dans un autre thread). Donc, fondamentalement, je veux:

  • Capturez une référence à la méthode d'un objet.
  • Transmettez cette référence à une procédure.
  • En utilisant cette référence, appelez la méthode de l'objet à partir de la procédure.

Je pense que je pourrais obtenir le même effet en utilisant des interfaces, mais je pensais qu'il existait un autre moyen, puisque cette "procédure d'objet". La déclaration de type existe.

Ce qui ne fonctionne pas , mais pourrait-il aider à expliquer où je suis confus ...?

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;

(Une fois la question résolue, je supprimerai le code ci-dessus, à moins que cela ne facilite l'explication.)

Était-ce utile?

La solution

Il suffit de retirer le contenu du pointeur Delphi le fera pour vous:

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

Autres conseils

La raison pour laquelle vous n’avez pas besoin de la syntaxe de pointeur est que vous avez déclaré le type de méthode comme procédure d’objet. Le compilateur déterminera à partir du " d'objet " instruction comment gérer le passage de la méthode au processus de rappel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top