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

时间:2015-02-01 00:49:37

标签: delphi delphi-2010 freepascal

如果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兼容。

1 个答案:

答案 0 :(得分:5)

DoWithoutEvents()输入TProc

type
  TProc = procedure;

只能为TProc分配独立非课程匿名程序_WorkOnForm不是那些,而是本地程序。本地过程具有特殊的编译器处理,将其与其父堆栈帧相关联。因此,_WorkOnFormTProc不兼容。