How to Pass an Object Method as a Parameter in Delphi, and then Call It?

五迷三道 提交于 2020-01-22 13:26:13

问题


I fear this is probably a bit of a dummy question, but it has me pretty stumped.

I'm looking for the simplest way possible to pass a method of an object into a procedure, so that the procedure can call the object's method (e.g. after a timeout, or maybe in a different thread). So basically I want to:

  • Capture a reference to an object's method.
  • Pass that reference to a procedure.
  • Using that reference, call the object's method from the procedure.

I figure I could achieve the same effect using interfaces, but I thought there was another way, since this "procedure of object" type declaration exists.

The following doesn't work, but might it help explain where I'm confused...?

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;

(Once the question is answered I'll remove the above code unless it aids the explanation somehow.)


回答1:


Just remove the Pointer stuff. Delphi will do it for you:

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



回答2:


The reason you don't need the pointer syntax is that you've declared the method type as a procedure of object. The compiler will figure out from the "of object" statement how to handle passing the method off the callback proc.



来源:https://stackoverflow.com/questions/178138/how-to-pass-an-object-method-as-a-parameter-in-delphi-and-then-call-it

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!