delphi中的高阶过程

Dil*_*uin 4 delphi pascal

我试图引用一个过程作为另一个过程的参数,但在理解文档时遇到问题。(http://docwiki.embarcadero.com/RADStudio/Sydney/en/Procedural_Types_(Delphi)

据我了解,我需要为该过程创建一个新类型..

type
  TCallback = procedure of object;
Run Code Online (Sandbox Code Playgroud)

并将高阶过程声明为 procedure HigherOrder(pProc: TCallback);

我在尝试调用函数时收到编译错误“E2010 Incompatible types: 'TCallBack' and '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.
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏。我对 Delphi 编程很陌生。

Rem*_*eau 11

问题是您首先调用 Callback()然后尝试将其返回值(它没有一个)传递给HigherOrder(),但这不是HigherOrder()预期的,这就是您收到错误的原因。换句话说,您的代码大致相当于

procedure TfrmMain.btnActClick(Sender: TObject);
begin
  //HigherOrder(Callback());
  var res := Callback();
  HigherOrder(res);
end;
Run Code Online (Sandbox Code Playgroud)

除了类型res不确定的,因为Callback()是一个procedure,而不是一个function

调用 时HigherOrder(),您需要删除结尾的()括号 fromCallback()以便将Callback 其自身(无论如何,它的内存地址)作为pProc参数的值传递,例如:

procedure TfrmMain.btnActClick(Sender: TObject);
begin
  HigherOrder(Callback);
end;
Run Code Online (Sandbox Code Playgroud)

是的,您也可以在调用过程而不向其传递任何参数时去掉括号。但是,在这种情况下,编译器足够聪明,知道省略括号的Callback标识符被分配给闭包类型,因此将按原样传递它而不是调用它