delphi 中的高阶过程
Higher order Procedures in delphi
我试图将一个过程作为另一个过程的参数进行引用,但我无法理解文档。(http://docwiki.embarcadero.com/RADStudio/Sydney/en/Procedural_Types_(Delphi))
根据我的理解,我需要为过程创建一个新类型..
type
TCallback = procedure of object;
并将高阶过程声明为
procedure HigherOrder(pProc: TCallback);
我在尝试调用函数时(单击按钮时)收到编译错误“E2010 不兼容类型:'TCallBack' 和 'procedure, untyped pointer or untyped parameter'”
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()
然后尝试传递它的 return 值 (它没有)到 HigherOrder()
,但这不是 HigherOrder()
所期望的,这就是您收到错误的原因。换句话说,您的代码大致等同于:
procedure TfrmMain.btnActClick(Sender: TObject);
begin
//HigherOrder(Callback());
var res := Callback();
HigherOrder(res);
end;
除了 res
的类型是 undefined 因为 Callback()
是 procedure
而不是 function
。
调用HigherOrder()
时,需要去掉Callback()
后面的()
括号,才能传递Callback
本身 (好吧,它的内存地址,无论如何)作为 pProc
参数的值,例如:
procedure TfrmMain.btnActClick(Sender: TObject);
begin
HigherOrder(Callback);
end;
是的,您也可以在 调用 过程而不向其传递任何参数时去掉括号。但是,在这种情况下,编译器足够聪明,知道 parenthesis-omitting Callback
标识符被分配给闭包类型,因此 将它传递给 as-is 而不是 称它为 。
我试图将一个过程作为另一个过程的参数进行引用,但我无法理解文档。(http://docwiki.embarcadero.com/RADStudio/Sydney/en/Procedural_Types_(Delphi))
根据我的理解,我需要为过程创建一个新类型..
type
TCallback = procedure of object;
并将高阶过程声明为
procedure HigherOrder(pProc: TCallback);
我在尝试调用函数时(单击按钮时)收到编译错误“E2010 不兼容类型:'TCallBack' 和 'procedure, untyped pointer or untyped parameter'”
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()
然后尝试传递它的 return 值 (它没有)到 HigherOrder()
,但这不是 HigherOrder()
所期望的,这就是您收到错误的原因。换句话说,您的代码大致等同于:
procedure TfrmMain.btnActClick(Sender: TObject);
begin
//HigherOrder(Callback());
var res := Callback();
HigherOrder(res);
end;
除了 res
的类型是 undefined 因为 Callback()
是 procedure
而不是 function
。
调用HigherOrder()
时,需要去掉Callback()
后面的()
括号,才能传递Callback
本身 (好吧,它的内存地址,无论如何)作为 pProc
参数的值,例如:
procedure TfrmMain.btnActClick(Sender: TObject);
begin
HigherOrder(Callback);
end;
是的,您也可以在 调用 过程而不向其传递任何参数时去掉括号。但是,在这种情况下,编译器足够聪明,知道 parenthesis-omitting Callback
标识符被分配给闭包类型,因此 将它传递给 as-is 而不是 称它为 。