在后台(kibitz)编译器中跳过源代码

时间:2009-08-10 10:40:25

标签: delphi

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

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

重现错误的示例代码:

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

此代码放置在主单元中使用的单元“Error.pas”中。 如果您尝试在主单元中调用CodeCompletion,它将停止并显示消息“Error.pas无法编译”(真实消息是德语)。

有趣的是,错误只发生在项目编译或第一次执行语法检查之前。 编译完成后,CodeCompletion正在运行,必须重新启动Delphi才能重现错误。

更新 添加带有结束标签的空Assembler块是该问题的解决方案。 以下是不会停止后台编译器的更改示例代码:

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

非常感谢,

基督教

3 个答案:

答案 0 :(得分:10)

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

这就是你的例子所发生的事情。第一个End标记不会被后期绑定逻辑转义,因为它不是由真实表达式编译器解析的,而是作为过程的结尾读取。第二个end看起来像单元的结尾,后台编译器再也看不到了。

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

答案 1 :(得分:2)

看起来后台编译不知道如何处理后期绑定。 您知道使用哪个COM类型库来对对象进行调用吗?如果您可以基于类型库导出和使用pascal-wrapper单元,那么它将有利于编译和应用程序的性能。 (请参阅主菜单中的“导入类型库”选项)

答案 2 :(得分:1)

尝试使用&转义令牌?

所以

V&安培;端;