4

我正在自定义线程中创建请求队列,TMyThread并且在定义可用于子例程的过程类型时遇到了困难。我有一个代表请求的记录,一个相应的记录指针,以及一个在记录中使用使用记录指针的过程类型......

type
  PRequest = ^TRequest;

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

  TRequest = record
    Request: String;
    Proc: TResponseProc;
    Response: String;
  end;

问题是,当我实现一个名为ResponseProc并尝试分配ResponseProc给 a的子例程时TResponseProc,它不起作用,并且 IDE 返回此错误消息:

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

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

4

1 回答 1

8

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

解决方案是将您的函数移到您定义它的任何其他函数之外。如果这很难做到,因为内部函数使用来自外部函数的变量,那么您将不得不找出其他方法将它们的值传递给另一个函数,例如通过将它们作为参数传递,也许使它们成为该请求记录的附加成员。

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

于 2013-03-03T08:07:16.650 回答