2011-08-29 96 views
17

我正在研究一個由多個編譯後的Delphi應用程序(超過20個exe和dll)組成的項目,我將需要共享60多個圖像(16x16,24x24,32x32 ,...)之間。在多個應用程序之間共享圖像的最佳方式

我雖然已經將所有的應用程序之間共享圖像兩種不同的方式,但我不知道哪個好:


理念1:

創建資源 - 只有DLL項目,其中包含一個資源鏈接引用的.res文件,其中包含我的所有圖像。每個應用程序將依次加載dll並根據需要將它可能需要的必要圖像讀入TImageList或TImage。

優點:允許以原始格式保存存儲庫中的圖像。

缺點:我將無法在設計時看到圖像,因爲它們只會在運行時加載。我還必須創建與圖像相同數量的常量,或者使用與圖像數量相同的集合,以便可以在資源文件上獨立於它的名稱引用每個圖像。


理念2:

創建其被編譯爲BPL和包括作爲上的所有應用程序運行時封裝的數據模塊。我會將這些圖像添加到幾個TImageList(取決於圖像大小)或TPngImageList(它允許在單個組件上有幾種尺寸的圖像)。

優點:我可以將此數據模塊添加到所需的所有應用程序,並在設計時查看可能需要使用的所有圖像。

缺點:所有的圖像將被加載到內存中,即使我只需要使用一個。我需要確保在向TImageList/TPngImageList中添加/修改圖像時,圖像的順序始終不會改變。所有圖像都將存儲在一個.dfm文件中。


理念3:(新)

看着誰也需要編譯的exe之間共享圖像的其它應用程序後,我有另一種想法。 將所有共享圖像保存爲編譯文件所在的子文件夾(例如Data)上的普通png/ico文件。

優點:無需在內存中加載所有圖像,我可以得到所需的圖像。如果圖像的總數量相當大(使用此方法的一個應用程序在數據子文件夾上有1400個圖像),這可能特別重要。

缺點:任何人都可以看到/可以看到圖像。可能會在用戶機器上佔用更多的磁盤空間。


我想問一下關於這兩種觀點或如何更好地做到這一點任何其他建議意見。

謝謝!

+0

關於理念2:你可以釋放你不會需要在運行時的圖片? – Jeff

+0

我不認爲我可以在運行時輕鬆釋放我不需要的圖像,主要是因爲如果我從TImageList中刪除不需要的圖像,那麼它將不會將正確的圖像索引分配給任何控件誰使用TImageList。 – smartins

回答

11

我有一個選項1.有強烈的偏好這樣做,這樣可以讓你保持你的版本控制庫中的圖片在他們的原生格式。使用選項2,您將圖像存儲在.dfm文件中,我發現這些文件非常不令人滿意。缺點是你會失去觀看圖像的設計時間。我個人更喜歡做這種交易。

在我的軟件,我有我從資源在運行時加載填充一個單一的全球圖像列表,當然還可在運行時指定的圖像索引。這帶來的另一個好處是可以選擇適合字體縮放的圖像大小。否則,你需要有單獨的圖像列出了16px的圖標,圖標爲20px,24px的圖標,圖標32PX等

+0

感謝大衛的回答。我沒有討論如何將每種解決方案存儲在存儲庫中,您對dfm問題提出了一個有效的觀點,這是對想法2的另一種認可。我將編輯問題以包含此內容。 – smartins

7

另一種方法是寫自己的TImage組件,具有額外的屬性調用。

property dllname: string read fdllname write set_dllname; 
property resname: string read fresname write set_resname; 

在setter程序中,您然後從資源中加載圖像。
這樣,你仍然可以看到在設計時的圖像。

確保覆蓋機制在DFM文件保存圖像,讓您的exe文件沒有得到臃腫與已經在DLL中的圖像。

不是100%確定如何做到這一點,但如果你想遵循這條路線,我肯定有人對這個問題有一個簡單的答案。

+0

沒有'存儲'指令的屬性,你也可以指定爲false? –

+0

@Marjan,很好的電話,請參閱:http://stackoverflow.com/questions/2072096/stored-keyword-in-delphi – Johan

相關問題