2012-10-16 147 views
3

可能重複:
Is there a Delphi option to ‘lock’ the design (layout) of a form against accidental changes?德爾福XE2改變DFM即使什麼也沒有改變

我們最近改變了從StarTeam已更改爲SVN,但我們有我們的DFM問題文件。它看起來像Delphi改變了DFM文件,即使我們並沒有真正改變表單。

例如:我打開一個現有的文件,我更改活動標籤頁,保存文件,將標籤頁更改回原始狀態,並再次保存。當我對兩個文件進行比較時,PixelsPerInch,TextHeight,Top和其他許多值都已更改?我的代碼一個小例子:

PixelsPerInch = 96 
     TextHeight = 13 
     inherited PageControl1: TPageControl 
     Top = 105 
     Height = 629 
     Margins.Left = 5 
     Margins.Top = 5 
     Margins.Right = 5 
     Margins.Bottom = 5 
     HotTrack = True 
     inherited TabSheet1: TTabSheet 
      Margins.Left = 5 
      Margins.Top = 5 
      Margins.Right = 5 
      Margins.Bottom = 5 

我的問題是:有沒有辦法讓德爾福只改變DFM只有當形式發生了變化?現在,當我們一直更新SVN時,我們有衝突。

+0

您已更改表單,或者.dfm不會更改。更改pagecontrol的活動標籤頁確實會更改內存中的表單並將其標記爲已修改,因此下次保存文件時.dfm將保存到磁盤。 如果您沒有更改任何內容,則無法保存到磁盤; .dfm文件不會被觸及。 –

回答

6

這只是Delphi的表單流式機制如何工作的結果。

當您在Delphi設計器中打開表單時,.dfm文件用於在表單上創建每個組件的實例。在你的情況下,表單設計者將實例化.dfm文件中的每個對象。 .dfm文件中的每個屬性都將被讀入。

然後,如果您在設計器中做了任何將表單標記爲已被修改的內容(例如更改活動標籤頁),則設計人員將重新創建。 dfm文件保存時。然後通過要求內存組件保存自己來重新創建.dfm文件。此保存過程不會記錄磁盤上的.dfm文件的外觀。每個組件只是在該時間點保存其屬性。

因此,總而言之,您無法改變德爾福的行爲。您可以做的最好的方法就是解決此問題,以最大限度地降低影響。

如果您的表單有Scaled=True那麼您應該確保所有開發人員機器都使用相同的字體縮放比例。否則,當開發人員A以一種字體縮放進行保存時,該.dfm文件將與開發人員B以不同字體縮放保存的文件完全不同。所有職位將被改變。這聽起來好像你有一些使用120dpi字體縮放的開發者。這會給你無盡的悲傷。

如果對錶單文件進行良性編輯會導致較大的更改,請提交這些更改。一旦您將每臺開發人員機器配置爲相同的方式,您就會發現事情安頓下來。這些良性的編輯不應再導致.dfm文件更改。

這只是Delphi的視覺設計職業病危害之一。無論何時提交,您都需要對您的.dfm文件進行大量的關注和關注。我經常發現自己恢復了對Tortoise commit對話框中的.dfm文件的更改。我還經常選擇在文本編輯器中修改.dfm文件,而不是使用表單設計器!

+3

最後一段如此真實。在提交更改之前,您應該始終注意dfm。 –

+0

事實上,有一位開發人員使用120dpi字體縮放的筆記本電腦。我們改變了這個設置,他的PixelsPerInch值和我們的一樣,但是他的TextHeight(= 16)(和許多其他寬度/高度值...)是不同的。 – Liezzzje

+0

確實需要重新啓動。一旦你在那臺筆記本電腦上加載了這個表格,就改變它並保存。如果你讓每個人都在同一個dpi上,它就可以工作。 –

0

如果您自上次保存表單之後更新了delphi版本,您還將看到dfm更改。所以,如果你有一箇舊的表格,並檢查出來做一個小改動,你會看到一些其他的改變。有時這些是在新的delphi版本中引入的新屬性,有時會更改值。這些還表明尚未對未簽出的表單進行的未決修改。升級delphi之後,您可以檢出每個表單,並立即將其重新記入以記錄所有這些更改。

隨着視覺設計我們喜歡創建「就像我們喜歡它」一樣,然後讓delphi保存所有這些變化。它悄悄地設置了很多屬性,但這些屬性可能隨着不同開發人員在表單上工作而發生變化。如果設置很重要 - 可能是表單高度和寬度 - 將其設置在代碼中。您仍會看到屬性更改,但您會知道這並不重要。