2010-07-31 77 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