如何将方法的嵌套过程作为参数传递?

How to pass a method's nested procedure as a parameter?

给定一个带有 TListBoxTForm,以下工作:

procedure TForm1.FormCreate(Sender: TObject);
  procedure _WorkOnListBox;
  begin
    ListBox.Items.Append('Test');
  end;
begin  
  _WorkOnListBox;
end;

如下:

procedure TForm1.DoWithoutListBoxEvents(AProc: TProc);
begin
  ListBox.Items.BeginUpdate;
  try
    AProc;  
  finally
    ListBox.Items.EndUpdate;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DoWithoutListBoxEvents(procedure
  begin
    LayersListBox.Items.Append('Test'); 
  end);
end;

但以下不是:

procedure TForm1.FormCreate(Sender: TObject);
  procedure _WorkOnListBox;
  begin
    ListBox.Items.Append('Test');
  end;
begin  
  DoWithoutListBoxEvents(_WorkOnListBox);
end;

我得到一个 E2555 Cannot capture symbol '_WorkOnListBox'。为什么?有什么方法可以让 DoWithoutListBoxEvents 在不使用匿名过程的情况下工作吗?虽然我觉得它看起来很优雅,但我正在努力保持 FPC 兼容。

DoWithoutEvents()TProc 作为输入:

type
  TProc = procedure;

只能将 独立非 class 过程 匿名过程 分配给 TProc . _WorkOnForm 两者都不是,而是 本地过程 。本地过程具有特殊的编译器处理,将其绑定到其父级的堆栈框架。因此,_WorkOnFormTProc 不兼容。