Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何传递方法';是否将嵌套过程作为参数?_Delphi_Delphi 2010_Freepascal - Fatal编程技术网

Delphi 如何传递方法';是否将嵌套过程作为参数?

Delphi 如何传递方法';是否将嵌套过程作为参数?,delphi,delphi-2010,freepascal,Delphi,Delphi 2010,Freepascal,给定一个带有t列表框的t表单,以下操作有效: procedure TForm1.FormCreate(Sender: TObject); procedure _WorkOnListBox; begin ListBox.Items.Append('Test'); end; begin _WorkOnListBox; end; 以下方面也是如此: procedure TForm1.DoWithoutListBoxEvents(AProc: TProc); begin

给定一个带有
t列表框的
t表单
,以下操作有效:

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无法捕获符号“\u worknlistbox”
。为什么?有没有办法让
DoWithOutlostBoxeEvents
在不使用匿名过程的情况下工作?虽然我觉得它看起来很优雅,但我还是努力保持FPC的兼容性。

DoWithoutEvents()
TProc
作为输入:

type
  TProc = procedure;
只有独立的非类过程匿名过程可以分配给
TProc
<代码>\u workinfo
不是这两个,而是一个本地过程。本地过程具有特殊的编译器处理,将其绑定到其父级堆栈框架。因此,
\u worknform
TProc
不兼容
DoWithoutEvents()
TProc
作为输入:

type
  TProc = procedure;

只有独立的非类过程匿名过程可以分配给
TProc
<代码>\u workinfo不是这两个,而是一个本地过程。本地过程具有特殊的编译器处理,将其绑定到其父级堆栈框架。因此,
\u worknform
TProc

不兼容。我可以使用任何类型吗?不适用于本地过程,不。间接调用本地过程是不安全的(调用不会在调用站点正确设置),所以不要尝试这样做。本地过程意味着直接调用,以某种方式编译器可以看到它,从而正确设置调用。这与将本地过程用作API回调(错误的调用设置)是危险的。不要这样做。有什么类型我可以使用吗?不适用于本地过程,不。间接调用本地过程是不安全的(调用不会在调用站点正确设置),所以不要尝试这样做。本地过程意味着直接调用,以某种方式编译器可以看到它,从而正确设置调用。这与将本地过程用作API回调(错误的调用设置)是危险的。请不要这样做。@KromStern FreePascal相容性银行澄清。为您添加了标签:-)@KromStern FreePascal compatibilitytanks以供澄清。为您添加了标签:-)