问题描述
我试图将一个过程作为另一个过程的参数引用,并且在理解文档时遇到麻烦。(http://docwiki.embarcadero.com/RADStudio/Sydney/en/Procedural_Types_(Delphi))
据我了解,我需要为该过程创建一个新类型。
type
TCallback = procedure of object;
并将高阶过程声明为
procedure HigherOrder(pProc: TCallback);
尝试调用函数时(单击按钮时),我收到编译错误“ E2010不兼容类型:'TCallBack'和'过程,无类型指针或无类型参数'
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.
任何帮助将不胜感激。我对使用delphi编程很陌生。
解决方法
问题是您先调用 Callback()
,然后尝试将其返回值(没有值)传递给{ {1}},但这不是HigherOrder()
所期望的,这就是为什么出现错误的原因。换句话说,您的代码与此大致等效:
HigherOrder()
由于procedure TfrmMain.btnActClick(Sender: TObject);
begin
//HigherOrder(Callback());
var res := Callback();
HigherOrder(res);
end;
是res
而不是Callback()
,因此procedure
的类型是未定义。
调用function
时,您需要从HigherOrder()
删除尾随的()
括号,才能通过Callback()
(嗯,其内存地址(无论如何)作为Callback
参数的值,例如:
pProc
是的,在调用过程时,也可以在不传递任何参数的情况下删除括号。但是,在这种情况下,编译器足够聪明,可以知道省略括号的procedure TfrmMain.btnActClick(Sender: TObject);
begin
HigherOrder(Callback);
end;
标识符已分配给闭包类型,因此将按原样传递而不是调用。