2012-01-02 59 views
10

我有一些自定義組件,其中包含一些在許多項目中已經使用了一段時間的已發佈屬性。我想對這個組件進行一些特殊的更改,它需要刪除這些舊屬性並用新的屬性替換它們。否則,我不一定要刪除屬性,但我們假設我只是簡單地將屬性名稱從PropName更改爲MyPropName。那麼,下次打開使用該組件的任何項目時,將無法找到PropName維護我的組件的屬性時,它們被更改?

有什麼辦法可以自動轉換這個嗎?或者這是人們必須手動做的事情?當這些屬性的名稱被更改時,維護組件屬性值的正確方法是什麼?

我的意思是隻在DFM代碼中,不一定在源代碼中。

+2

有人正在瘋狂downvoting狂歡... – 2012-01-03 11:12:23

回答

14

您可以使用DefineProperties擴展點來幫助遷移.dfm文件。

type 
    TMyComponent = class(...) 
    private 
    procedure ReadPropName(Reader: TReader); 
    protected 
    procedure DefineProperties(Filer: TFiler); override; 
    published 
    property MyPropName: string read ... write ...; 
    end; 

procedure TMyComponent.DefineProperties(Filer: TFiler); 
begin 
    inherited; 
    Filer.DefineProperty('PropName', ReadPropName, nil, False); 
end; 

procedure TMyComponent.ReadPropName(Reader: TReader); 
begin 
    MyPropName := Reader.ReadString; 
end; 

這將允許您的新組件讀取具有舊屬性名稱的舊.dfm文件。當再次寫入.dfm文件時,將使用新的屬性名稱。

請注意,這種技術會導致組件能夠讀取包含舊屬性名稱或新屬性名稱的.dfm文件,因此,如果您願意,可以逐步遷移。一旦你已經遷移了所有的.dfm文件,那麼爲了整潔起見,應該刪除這些代碼。

Component Writer's GuideStoring and Loading Unpublished Properties部分,Delphi文檔涵蓋了這個主題領域,雖然略有不同。

+3

現在,這是輝煌! – 2012-01-02 23:12:26

+4

@David,我想你在你的答案中切換了PropName和MyPropName,因爲OP想用新的MyPropName屬性替換舊的PropName屬性。無論如何,這是非常好的答案,因爲它也幫助我解決了將來可能會遇到的問題。 – iamjoosy 2012-01-03 07:23:37

相關問題