I am attempting to reference a procedure as a parameter of another procedure and am having trouble understanding the documentation.(http://docwiki.embarcadero.com/RADStudio/Sydney/en/Procedural_Types_(Delphi))
From what I understood I need to create a new type for the procedure..
type
TCallback = procedure of object;
and declare the higher order procedure as
procedure HigherOrder(pProc: TCallback);
I receive the compilation error " E2010 Incompatible types: 'TCallBack' and 'procedure, untyped pointer or untyped parameter' " when attempting to call the function(when the button is clicked)
type
TCallBack = procedure of object;
TfrmMain = class(TForm)
btnAct: TButton;
procedure btnActClick(Sender: TObject);
private
procedure HigherOrder(pProc: TCallback);
procedure Callback();
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
{ TfrmMain }
procedure TfrmMain.btnActClick(Sender: TObject);
begin
HigherOrder(Callback()); <--Error occurs here
end;
procedure TfrmMain.Callback;
begin
//Do some stuff
end;
procedure TfrmMain.HigherOrder(pProc: TCallback);
begin
//Do some other stuff
pProc();
end;
end.
Any help is greatly appreciated. I am quite new to programming in delphi.
The problem is that you are calling Callback() first and then trying to pass its return value (which, it doesn't have one) to HigherOrder(), but that is not what HigherOrder() is expecting, which is why you are getting the error. In other words, your code is roughly equivalent to this:
procedure TfrmMain.btnActClick(Sender: TObject);
begin
//HigherOrder(Callback());
var res := Callback();
HigherOrder(res);
end;
Except that the type of res is undefined since Callback() is a procedure and not a function.
When calling HigherOrder(), you need to remove the trailing () parenthesis from Callback() in order to pass Callback itself (well, its memory address, anyway) as the value of the pProc parameter, eg:
procedure TfrmMain.btnActClick(Sender: TObject);
begin
HigherOrder(Callback);
end;
Yes, you can also drop the parenthesis when calling a procedure without passing any parameters to it. But, in this case, the compiler is smart enough to know that the parenthesis-omitting Callback identifier is being assigned to a closure type and so will pass it as-is and not call it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With