如何将方法的嵌套过程作为参数传递?
How to pass a method's nested procedure as a parameter?
给定一个带有 TListBox
的 TForm
,以下工作:
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
两者都不是,而是 本地过程 。本地过程具有特殊的编译器处理,将其绑定到其父级的堆栈框架。因此,_WorkOnForm
与 TProc
不兼容。
给定一个带有 TListBox
的 TForm
,以下工作:
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
两者都不是,而是 本地过程 。本地过程具有特殊的编译器处理,将其绑定到其父级的堆栈框架。因此,_WorkOnForm
与 TProc
不兼容。