Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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

like image 960
MB. Avatar asked Oct 07 '08 12:10

MB.


2 Answers

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

procedure TCallbackObject.SetupCallback;
begin
  CallbackTheCallback(CallbackMethodImpl);
end;
like image 104
Roman Ganz Avatar answered Oct 18 '22 23:10

Roman Ganz


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.

like image 41
Jody Dawkins Avatar answered Oct 18 '22 23:10

Jody Dawkins