delphi中的高阶程序

delphi中的高阶程序,delphi,pascal,Delphi,Pascal,我试图引用一个过程作为另一个过程的参数,但在理解文档时遇到困难。() 据我所知,我需要为程序创建一个新类型 type TCallback = procedure of object; 并将高阶过程声明为 程序高级顺序(pProc:TCallback) 尝试调用函数时(单击按钮时),我收到编译错误“E2010不兼容类型:'TCallBack'和'procedure,untyped pointer或untyped parameter'” 类型 TCallBack=对象的过程; TfrmMain

我试图引用一个过程作为另一个过程的参数,但在理解文档时遇到困难。()

据我所知,我需要为程序创建一个新类型

type
  TCallback = procedure of object;
并将高阶过程声明为
程序高级顺序(pProc:TCallback)

尝试调用函数时(单击按钮时),我收到编译错误“E2010不兼容类型:'TCallBack'和'procedure,untyped pointer或untyped parameter'”

类型
TCallBack=对象的过程;
TfrmMain=类(TForm)
btnAct:t按钮;
程序btnActClick(发送方:TObject);
私有的
程序高级顺序(pProc:TCallback);
过程回调();
{私有声明}
公众的
{公开声明}
结束;
变量
frmMain:TfrmMain;
实施
{$R*.dfm}
{TfrmMain}
程序TfrmMain.btnActClick(发送方:TObject);
开始

高阶(Callback()) 问题是,您首先调用
Callback()
,然后试图将其返回值(它没有)传递给
HigherOrder()
,但这不是
HigherOrder()
所期望的,这就是为什么会出现错误的原因。换句话说,您的代码大致相当于:

过程TfrmMain.btnActClick(发送方:TObject);
开始
//高阶(Callback());
var res:=Callback();
高阶(res);
结束;
除了
res
的类型未定义,因为
Callback()
是一个
过程
而不是
函数

调用
HigherOrder()
时,需要从
Callback()
中删除后面的
()
括号,以便将
Callback
本身(以及它的内存地址)作为
pProc
参数的值传递,例如:

过程TfrmMain.btnActClick(发送方:TObject);
开始
高阶(回调);
结束;
是的,您也可以在调用过程时删除括号,而无需向其传递任何参数。但是,在这种情况下,编译器足够聪明,知道省略
回调
标识符的括号被分配给闭包类型,因此将按原样传递它,而不是调用它

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.