2012-01-02 15 views
10

私は、多くのプロジェクトでしばらく使用されているいくつかの公開プロパティを持つカスタムコンポーネントを持っています。これらの古いプロパティを削除し、新しいプロパティに置き換える必要がある、このコンポーネントにいくつか特別な変更を加えたいと思います。そうでなければ、必ずしもプロパティを削除しているわけではありませんが、単にプロパティの名前をPropNameからMyPropNameに変更するだけです。次回そのコンポーネントを使用しているプロジェクトを開くと、PropNameが見つかりません。コンポーネントのプロパティが変更されたときにそのコンポーネントを維持しますか?

これを自動変換する方法はありますか?それとも人々が手動でやらなければならないことでしょうか?これらのプロパティの名前が変更されたときにコンポーネントプロパティ値を維持する適切な方法は何でしょうか?

DFMコードの中で、ソースコード内にあるわけではありません。

+2

誰かが怒っている怒りの下で... –

答えて

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

今は素晴らしいです! –

+4

@David、私はあなたの答えにPropNameとMyPropNameを入れ替えました.POPNameの新しいプロパティを新しいMyPropNameプロパティに置き換えたいからです。とにかく、優れた答えは、それが私が将来得るかもしれない問題に取り組むのにも役立ちました。 – iamjoosy