Delphi 如何定义适用于本地过程的过程类型?

Delphi 如何定义适用于本地过程的过程类型?,delphi,delphi-xe2,subroutine,Delphi,Delphi Xe2,Subroutine,我正在自定义线程TMyThread中创建一个请求队列,但我很难定义可用于子例程的过程类型。我有一个表示请求的记录,一个对应的记录指针,以及一个在记录中使用并使用记录指针的过程类型 type PRequest = ^TRequest; TResponseProc = procedure(Sender: TMyThread; Request: PRequest); TRequest = record Request: String; Proc: TResponsePr

我正在自定义线程
TMyThread
中创建一个请求队列,但我很难定义可用于子例程的过程类型。我有一个表示请求的记录,一个对应的记录指针,以及一个在记录中使用并使用记录指针的过程类型

type
  PRequest = ^TRequest;

  TResponseProc = procedure(Sender: TMyThread; Request: PRequest);

  TRequest = record
    Request: String;
    Proc: TResponseProc;
    Response: String;
  end;
问题是,当我实现名为
ResponseProc
的子例程并尝试将
ResponseProc
分配给
TResponseProc
时,它不起作用,IDE返回此错误消息:

[DCC Error] MyProject.dpr(42): E2094 Local procedure/function 'ResponseProc' assigned to procedure variable

如何定义此过程类型
t响应
并将其与子例程一起使用?

记录和过程声明很好。错误消息表示您正在使用本地过程,该过程是在另一个函数的作用域内定义的。您不能使用指向此类函数的指针,因为它们需要额外的工作才能调用,而这不能用普通函数指针表示。(编译器不允许创建指向调用方不知道如何使用的函数的指针。)

解决方案是将您的函数移到您在其中定义它的任何其他函数之外。如果这很难做到,因为内部函数使用外部函数中的变量,那么您必须找到其他方法将它们的值传递给另一个函数,例如将它们作为参数传递,可能使它们成为该请求记录的其他成员


另一种选择是使用过程引用,然后将本地过程定义为匿名过程。它可以访问本地变量,尽管只有Delphi和C++ Builder知道如何调用它,所以如果需要外部API兼容性,它不是一个选项。

这个答案可以在XE2文档中找到(本地安装,而不是通过DoWiki),简单搜索<代码> E2094。因此,不应将其视为先检查文档的替代品。我不投反对票的唯一原因是这个问题写得很好,但我投票决定结束,因为一开始就不应该问这个问题。哦,那么有用的问题/答案不再适合StackOverflow了?我在这里看到了很多可以在文档中发现的好问题。你会投票以“不是真正的问题”结束,这也很尴尬,因为你自己说这是一个写得很好的问题。写得好并不意味着“好”。如果我在这里发布了一个问题,解释了数学的一般原理,最终等同于“什么是12*12?”,那么我使用了良好的措辞这一事实并不能作为我不懂基本数学、不使用纸笔或不启动Windows计算器的借口。:-)如果你愿意,我也可以投反对票;我觉得我不这么做是出于好意。很好的解释。我重新阅读了这个问题/答案,并开始对自己说“问这个问题的人根本不知道他在做什么。”然后我意识到这就是我自己。