delphi中的高阶过程

问题描述

我试图将一个过程作为另一个过程的参数引用,并且在理解文档时遇到麻烦。(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; 标识符已分配给闭包类型,因此将按原样传递而不是调用