MB.
MB.

Reputation: 7533

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:

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

Upvotes: 17

Views: 14205

Answers (2)

Jody Dawkins
Jody Dawkins

Reputation: 63

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.

Upvotes: 2

Roman Ganz
Roman Ganz

Reputation: 1571

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

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

Upvotes: 20

Related Questions