2009-08-10 34 views
4

我在Delphi7中的后台编译器出现问题:在我的项目中有一行代码导致后台编译器停止并显示一条错误消息,因此无法执行CodeCompletion。正常的编译器和语法检查对此代码没有问题,并且生成的应用程序是正确的。在后台跳过源代码(kibitz)编译器

我的问题是,如果在执行后台编译时有任何方法跳过此代码行(例如编译器指令)。

实施例的代码重现该错误:

procedure ProduceKibitzError; 
var 
    v : Variant; 
begin 
    v.End; // This line stops kibitz compiler 
end; 

此代码放置在其在主单元中使用的单位“Error.pas”。 如果您尝试在主单元中调用CodeCompletion,它会停止并显示消息“Error.pas could not be compiled”(真实消息是德语)。

有趣的是,只有在编译项目或首次执行语法检查时才会出现错误。 编译后CodeCompletion正在工作,Delphi必须重新启动才能重现错误。

更新: 添加一个空的汇编程序块与一个结束标签是一个问题的解决方案。 这里是改变的示例代码,不停止后台编译:

procedure ProduceKibitzError; 
var 
    v : Variant; 
begin 
    asm 
    @@END: 
    end; 
    v.End; 
end; 

非常感谢,

基督教

+0

护理后什么代码*一行*和* errormessage的*是什么样子? – 2009-08-10 10:56:47

+0

您可以尝试在此例程中添加一个空的asm/end块。它可以防止kibitz编译器跳过程序分析。 Graphics.pas有一个带有@@ end标签的asm/end块,编译器专门处理asm/end块。 – 2009-08-10 15:51:03

回答

10

当解析到达光标位置时,背景编译器不执行过程体分析。相反,它使用简单的语法匹配(如begin/end对)。如果简单的语法匹配表明该单元中的最终end已满足,则它会提前退出。

这就是你的例子发生的事情。第一个End令牌不会被后期绑定逻辑转义,因为它不会被真实表达式编译器解析,而是被读为过程的结尾。第二个end看起来像单元的末尾,后台编译器从来没有看到任何进一步的。

补充:您可以尝试在此例程中添加一个空的asm/end块。它可以防止kibitz编译器跳过程序分析。 Graphics.pas有一个带有@@ end标签的asm/end块,编译器专门处理asm/end块。

2

貌似后台编译不知道如何处理做后期捆绑。 您是否知道使用哪个COM类型库在对象上进行调用?如果您可以导出和使用基于类型库的pascal包装单元,那么这对编译和应用程序的性能都会有好处。 (请参阅主菜单中的导入类型库选项)

+1

感谢您的回复。该应用程序用于Word自动化。 单独的晚期束缚似乎没有问题。例如,您可以使用像“v.Foo”这样的函数名称,这将在后台编译中不会造成任何问题,尽管不存在具有此名称的函数。 我认为与Delphi关键字“结束”的组合是在这种特殊情况下的问题。 我认为,使用包装类的早期绑定是解决问题的最佳方法,当无法从源代码中排除源代码时。 – user153642 2009-08-10 14:53:49

+0

你是对的,我没有注意到被调用的方法是一个保留字。这可能确实是杀手。如果你真的想要后期绑定,你可以*调用IDispatch方法来获得一个方法指针来传递一个(空的)参数数组,但是这是一个漫长的过程... – 2009-08-10 18:13:12

1

尝试用&转义令牌?

所以

诉&end;

+0

对不起,但是用这个标记代码不会被编译。 – user153642 2009-08-14 11:08:57

+0

它被添加(我认为)D2005。与.Net支持有关 - 我认为很多.Net库的名称都是Delphi中保留关键字的方法。 – 2011-05-26 06:06:38

+0

不,它是更旧的。 D6手册已经提到过它。我认为它支持IDispatch,但原因是一样的。 COM对象已经支持非delphi名字的方法。 – 2011-05-26 13:28:10