我正在自定义线程TMyThread
中创建请求队列,并且我在定义可用于子例程的过程类型时遇到困难。我有一个表示请求的记录,一个相应的记录指针,以及记录中使用的过程类型,使用记录指针......
type
PRequest = ^TRequest;
TResponseProc = procedure(Sender: TMyThread; Request: PRequest);
TRequest = record
Request: String;
Proc: TResponseProc;
Response: String;
end;
问题是,当我实现一个名为ResponseProc
的子例程并尝试将ResponseProc
分配给TResponseProc
时,它不起作用,并且IDE返回此错误消息:< / p>
[DCC Error] MyProject.dpr(42): E2094 Local procedure/function 'ResponseProc' assigned to procedure variable
如何定义此过程类型TResponse
并将其与子例程一起使用?
答案 0 :(得分:8)
记录和程序声明没问题。错误消息表明您正在使用本地过程,这是在另一个函数的范围内定义的过程。您不能使用指向这些函数的指针,因为它们需要额外的工作来调用,而不能用普通的函数指针表示。 (编译器不允许创建指向调用者不知道如何使用的函数的指针。)
解决方案是将你的函数移动到之外的任何其他函数。如果这很难做,因为内部函数使用外部函数的变量,那么你将不得不弄清楚另一种将其值传递给另一个函数的方法,例如将它们作为参数传递,或许使它们成为该请求记录的附加成员。
另一种选择是使用过程引用,然后将本地过程定义为匿名过程。它可以访问局部变量,虽然只有Delphi和C ++ Builder知道如何调用它,所以如果你需要外部API兼容性,它不是一个选项。