1

我正在使用 Delphi 2009。我的程序已经编译并运行良好。我使用动作列表并将它们内置到我的程序中——尽管我已经有一段时间没有更改它们了。

所以今天我去简单地以正常方式向我的 ActionList 添加一个新动作。没有做任何其他事情,我现在构建并运行我的程序,我收到以下错误:

[DCC 致命错误] Userface.pas(1): F2092 程序或单元“Userface”递归使用自身。

我没有做任何改变任何使用条款的事情。我找不到任何我的 Userface 单元调用自身或调用另一个调用 Userface 的单元的实例。我将潜在的递归调用放在实施部分,因为它们应该是。

如果我退出 Delphi 而不保存、重建并运行它,它运行良好。如果我再次尝试将新操作添加到操作列表,则会再次发生致命错误。

我不知道发生了什么。我将不胜感激任何帮助弄清楚如何解决这个问题。


编辑:在 Uwe 的回答之后,我再次检查以确保它仍然在发生。果然,我又做了一次,正如我在对 Uwe 的评论中所描述的那样。建好后,又发生了。

...但是,偶然在项目菜单下,我错过了选择“构建”并选择了“编译”。它编译得很好。然后我尝试构建,现在构建正常工作。没有致命错误!对我来说一切似乎都很好。

如果我尝试添加另一个操作然后构建,则会再次出现错误。但是如果我编译,那么我可以成功构建它 - 所以至少我有一个解决方法。

这一定是某种故障。我不知道发生了什么。有谁知道这是什么或为什么会发生?


跟进。正如 Marjan 所说,它可能发生在其他情况下,其中一种情况发生在我身上。因此,它可能与我的问题所要求的添加操作没有直接关系。

尽管如此,到目前为止,这对我来说是一个相对罕见的事情,并且只是变成了一个小烦恼。它可能已经在 Delphi 2010 中修复,我的最终解决方案将是当我下次升级到 Delphi 2011 或 12 时,一旦他们添加了 64 位或多平台。

4

3 回答 3

2

有时添加组件会自动更改 uses 子句。这可以由 Delphi 自己完成,也可以由 ModelMaker CodeExplorer 等第三方插件完成。您可以使用历史记录选项卡快速识别任何更改。

没有来源,我只能说...

编辑:考虑到您的其他信息,我建议检查项目

  1. 循环依赖
  2. 搜索路径中某处具有相同名称的单位

对于循环依赖,您可以使用 ModelMakerTools 中的免费Unit Dependency Analyzer。您可以在该页面的底部找到下载链接。

于 2010-07-31T21:11:09.800 回答
2

如果您绝对确定您编译了正确的源代码(.dpr 路径!)并且使用部分相同,那么如果非常简单或未使用,Delphi 可能会消除相互引用。

IOW 如果 A 和 B 相互导入,编译器可能会让它通过,但其中一个不使用另一个的符号。一旦您开始使用符号(因为通过选择操作可以访问以前的死代码),它就会变成相互引用冲突。

于 2010-07-31T23:15:51.787 回答
1

根据要求,我的评论作为答案。

不知道它为什么会发生,但如果它有任何安慰的话,我也看到它发生在其他情况下。更改后立即构建会失败,编译,然后构建会成功。

有时在这些情况下也有帮助的是在编译/构建之前显式保存所有内容。

我想这可能与 IDE 中的时间和缓存有关。可能还涉及启用代码洞察、错误红线等的编译线程。

于 2010-08-01T17:37:07.343 回答