如果TForm
上有TListBox
,则以下内容有效:
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兼容。
答案 0 :(得分:5)
DoWithoutEvents()
输入TProc
:
type
TProc = procedure;
只能为TProc
分配独立非课程和匿名程序。 _WorkOnForm
不是那些,而是本地程序。本地过程具有特殊的编译器处理,将其与其父堆栈帧相关联。因此,_WorkOnForm
与TProc
不兼容。