2008-12-18 61 views
4

我已經在德爾福多年的形式共享圖像列表多年了。我的應用程序的主窗體上有一個TImageList,然後我有其他形式的組件,我在設計時將Images屬性設置爲主窗體(例如MyMainForm.MyImageList)中的圖像列表。德爾福問題與跨表格共享圖像列表

我遇到的問題是隨機的圖片屬性,都會對那些引用主窗體上的圖像列表的形式清除。

這似乎只是在最近纔開始的,但我一直無法查明確切原因還沒有。我似乎無法找到一種方法來隨意複製這個問題;它似乎是隨機發生的。當打開表單時,我確實注意到它正好發生。我沒有在德爾福最近更改

一兩件事是我啓用了自動保存項目的桌面和符號功能。所以現在當我打開這個項目時,它總是記住哪些表單是開放的。因此,當打開表單時發生此問題,並且因爲它現在重新打開上次打開項目時打開的所有表單,所以發生次數更多。

我們有一些開發者在這個項目上的工作,我們正在使用SVN版本控制。啓用自動保存項目桌面和符號功能導致的一個問題是,當我們對項目執行SNV更新時,符號文件可能變得無效(因爲我們在版本控制下沒有符號文件)。這隻會導致Delphi的錯誤信息,但除此之外它看起來無害。我們只是重新編譯項目,它修復了符號文件。

順便說一句,我用Delphi 7

如果您有任何疑問,或想澄清,發表評論,我會更新的問題。

回答

8

多年前我遇到了同樣的問題。從那以後,我一直習慣於將幾種形式共享的圖像列表放到TDataModule上。然後Delphi不會丟失鏈接。在數據模塊上放置非可視化組件還可以縮短表單上的設計時間。在運行時,TDataModule在主表單之前被實例化。

6

當我遇到這種類型的行爲時,總是因爲我打開了「其他」窗體而沒有在IDE中打開主窗體...... IDE將嘗試解析MyMainForm.MyImageList引用,失敗,並刪除參考。

我們合作解決此通過手動分配代碼中的圖像列表(通常在AfterConstruction)。

+0

因此,如果我在窗體的AfterConstruction方法中設置Images屬性,但確實如此,則在設計時無法看到圖像(例如,在工具欄上,引用圖像列表)。任何解決方案? – 2008-12-18 04:07:02

+0

那麼,你可以在設計時設置它(如果MyMainForm當然是開放的)並且設計是正常的; AfterConstruction只是確保該屬性保持設置。一個保障,如果你願意。 – moobaa 2008-12-18 04:12:38

+0

這不會改變錯誤的設計時行爲...... – Serguzest 2008-12-18 22:41:46

3

啊 - 和「自動保存項目桌面」功能有時會以「反向」順序打開文件(和因此形式) - 加劇IDE-不知道關於MyMainForm「功能」。

+0

是的,如果您閱讀我的答案,您會看到我通過禁用AutoSave來解決此問題。但奇怪的是,即使禁用了AutoSave,我仍然可以在我的主項目中重現該問題,但不能在全新的項目中重現(請參閱我的答案以獲取更多信息)。 – 2008-12-18 05:35:13

1

我做了一堆試驗,發現了一些非常奇怪的結果。但是我做了一些改變,以便我可以在沒有發生此問題的情況下處理我的項目。我不得不禁用自動保存功能(這可以防止可能引用主窗體在主窗體之前打開的輔助窗體)。然後我必須確保刪除項目的.dsk文件(項目桌面AutoSave文件)。所以現在當我打開這個項目時,它總是打開主窗體,所以我從來沒有得到清除主窗體引用的問題。但是,如果在打開項目後我仍然遇到問題,請關閉主窗體,然後打開引用主窗體的窗體。

此外,我無法重現此問題的另一種形式的參考,在禁用自動保存功能的全新項目中被清除,儘管我可以在當前項目中禁用AutoSave來重現此問題。我不知道爲什麼,但我不認爲這是值得進一步調查。

下面是一些對我現有的項目進行我的實驗數據。作品意味着對主要形式的引用很好。 BUG意味着主表單的引用被清除。這是在AutoSave開啓的情況下完成的,並且在關閉項目之前始終手動關閉所有表單。


  1. 打開項目
  2. 打開主模
  3. 打開二次形式
  4. 結果:WORKS

  1. 打開項目
  2. 打開二次形式
  3. 結果:BUG

  1. 打開項目
  2. 打開主模
  3. 關閉主要形式
  4. 打開次級從
  5. 結果:BUG

  1. 打開項目
  2. 打開輔助形式
  3. 結果:BUG
  4. 二次形式圖片列表主窗體上的組件的
  5. 設置影像屬性
  6. 關閉輔助形式
  7. 開放二次形式
  8. 結果:WORKS(僅緩存僅用於輔助表單的引用;請參閱下面的 「緩存」 的解釋)

  1. 打開項目
  2. 打開魔術的形式(參見下面的什麼 「神奇」 的形式解釋)
  3. 結果:WORKS( 「緩存」 的任何參考主要形式的所有形式,請參閱下面的「緩存」的解釋)

其他有趣的網絡連接ndings:

  • 當你打開窗體並且圖像列表沒有顯示時,.dfm被修改,但是delphi並沒有說這個文件被修改了。如果您關閉表單,它不會警告您未保存的更改)。 只有按下表格上的保存後,dfm纔會清除圖像列表參考。
  • 我注意到我的項目中有一些「魔術」形式(缺少更好的術語)。魔術表單在他們的.dfm中引用了我的項目的主表單,並且在打開它們後,它們不會丟失對主表單的引用,即使它們是在任何其他表單之前打開的。
  • 這些魔術形式會導致主窗體中所有圖像列表引用的「緩存」。一旦你打開了這些表單中的一個,那麼你可以打開任何引用主表單的表單,並且在這個項目會話期間不會丟失它的引用(即使魔術表單被關閉)。
1

您是否將mainform.pas包含在項目中?不僅作爲「使用mainform.pas」在.pas中的某處,而且作爲

fMainForm in 'fMainForm.pas' {MainForm}, 

在您的應用程序**。dpr **中。對於Delphi來說,{MainForm}是必要的 - 用於解決它們之間的繼承形式和鏈接。

+0

我確實擁有項目中包含的主要表單,並且它具有Delphi所需的註釋。 – 2008-12-18 23:10:10

2

我把一些共享的東西給Datamodules而不是形式。試試這種方式。