2013-03-03 63 views
4

我在自定义线程TMyThread中创建请求队列,我很难定义可用于子例程的过程类型。我有表示请求,相应的记录指针,并且其在记录和使用记录指针所使用的程序类型的记录...如何定义适用于本地过程的过程类型?

type 
    PRequest = ^TRequest; 

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

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

的问题是,当我执行的子程序命名为ResponseProc和尝试分配ResponseProcTResponseProc,它不工作,以及IDE返回该错误消息:

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

如何定义这个程序类型TResponse与子程序使用它呢?

+4

通过简单搜索'E2094',可以在XE2文档(本地安装,而不是通过docwiki)中找到答案。所以SO *不应被视为首先替代文件检查。我不低调的唯一原因是这个问题写得很好,但我正在投票结束,因为它本来不应该被问到。 – 2013-03-03 02:49:12

+1

哦,如此有用的问题/答案不适合StackOverflow了?我在这里看到很多很好的问题,可以在文档中找到。 – 2013-03-03 02:53:24

+1

因为你自己说这是一个写得很好的问题,所以你会投票结束为“不是真正的问题”,这也很尴尬。 – 2013-03-03 02:59:57

回答

8

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

的解决方案是将您的功能任何其他的功能你定义它。如果这是很难做到的,因为内函数使用来自外部函数的变量,那么你必须找出其他方法来获取它们的值到另一个函数,比如通过将它们作为参数传递,可能使它们成为请求记录的附加成员。

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

+0

+1。优秀的解释。 – 2013-03-03 11:45:21

+0

我回头看这个问题/答案,开始想我自己:“问这个问题的人不知道他在做什么。”然后我意识到那是我自己。 – 2017-11-01 00:46:18

相关问题