2010-07-31 78 views
1

我正在使用Delphi 2009.我的程序一直在编译和运行正常。我使用动作列表并将它们内置到我的程序中 - 尽管我在一段时间内没有改变它们。为什么在Delphi中添加Action导致致命错误

因此,今天我只需以正常的方式添加一个新的动作到我的ActionList中。没有做任何事情,我现在建立并运行我的程序,我得到以下错误:

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

我没有做任何改变任何使用条款。我找不到任何自己的Userface设备实例,或者调用另一个调用Userface的设备。我应该在实现部分放置潜在的递归调用。

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

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


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

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

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

这一定是某种毛病。我不知道发生了什么事。有人知道这是什么或为什么可能发生?


跟进。正如马里安所说,它可能发生在其他情况下,而其中一件事发生在我身上。所以这可能与添加一个动作没有直接关系,我的问题就是这样。

无论如何,这是迄今为止比较罕见的事情,只是变成了一个小小的烦恼。它可能已经在Delphi 2010中得到了修复,而我的最终解决方案将是在我下次升级到Delphi 2011或12时添加64位或多平台。

+1

不知道它为什么会发生,但如果它有任何安慰,我也看到它在其他情况下也会发生。修改后立即生成将失败,编译,然后构建会成功。在这些情况下,有时候也有帮助的是在编译/构建之前显式保存全部。我想这可能与IDE中的定时和缓存有关。可能还包括启用代码洞察,错误红衬等的编译线程。 – 2010-08-01 10:30:00

+0

@Marjan:这个评论对我很有帮助。请将其添加为答案,并允许其他人直接对其进行评论,如果没有更好的答案,我可能会给予您答案。 – lkessler 2010-08-01 16:35:27

+0

好的谢谢,完成。 – 2010-08-01 17:37:42

回答

1

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

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

在编译/构建之前,有时候在这些情况下有助于显式保存所有内容。

我想这可能与IDE中的定时和缓存有关。可能还包括启用代码洞察,错误红衬等的编译线程。

+0

我刚刚发生在另一种情况。不知道到底发生了什么,但是在我的“编译”解决方案和“全部保存”解决方案之间,它正在变成一种相对罕见的小问题。 – lkessler 2010-08-02 16:20:32

2

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

没有来源无话可说我可以......

编辑:考虑到您额外的信息,我建议的地方使用相同的名称检查项目

  1. 循环依赖
  2. 单位的搜索路径

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

+0

感谢您的想法,@Uwe,但我不添加组件。我双击已经在表单上的ActionList组件。然后我点击我的“查看”类别。然后我点击添加“Action1”到我的动作列表中的“New Action”图标。我关闭了ActionList。构建看,并得到致命的错误是消息列表。然后...(请参阅我的编辑问题):-) – lkessler 2010-07-31 22:52:24

+0

您正在添加一个实际上是TComponent后代的TAction。要看到我的建议并不落后,请尝试添加像TFileOpen这样的标准操作。这将在您的使用条款中包含StdActns。 – 2010-08-01 08:00:50

2

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

IOW也许编译器让它通过,如果A和B导入彼此,但其中一个不使用另一个的符号。一旦你开始使用符号(因为之前的死代码通过选择动作变得可达),它会变成相互引用冲突。

+0

那么,过去几周我一直忙着为我的程序工作,而且它一直在建设中。只有当我尝试添加一个我遇到此问题的操作时才这样做。 – lkessler 2010-07-31 23:23:41

+0

注释掉动作激活的所有代码,并查看是否发生了变化。无论如何,当寻找变化时,不要忘记消除死亡代码。 – 2010-07-31 23:36:50

+0

我没有实现任何代码。我刚刚添加了该操作。以前从未听说过“死亡代码”。听起来很可怕。 – lkessler 2010-08-01 00:27:27