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 而不是 称它为