2017-05-26 23 views
3

は、私は自分のコンポーネントを作成し、私は、このプロパティを持っている:ストリーミングシステムから最初に読み込むカスタムプロパティを設定するにはどうすればよいですか?

property DefStyleAttr: String read fDefStyleAttr write SetDefStyleAttr; 

私は、このプロパティは、コンポーネントの作成時にロードされることは非常に最初にすることを望みます。ストリーミングシステムがフォームファイルからフォームまたはデータモジュールをロードするときは、コンストラクタを呼び出してフォームコンポーネントを構築し、フォームファイルからプロパティ値を読み込みます。 DefStyleAttrが最初に読まれるようにしたいところです。

+1

非常に最初の...定義するプロパティは、定義された順序でロードされます。祖先のプロパティは、継承の順に最初にロードされます。 –

+0

'DefineProperties'メソッドをオーバーライドします。 – Victoria

+0

@thanks dalija、それは答えでなければなりません:) – loki

答えて

6

コンポーネントのプロパティは、定義された順序でロード(保存)されます。祖先のプロパティは、継承の順に最初にロードされます。

あなたのようなクラスの階層構造を持っている場合:ご自分のクラス階層にあなたが必要な場合は、だから、

object TSecondDescendant 
    First = 1 
    Second = 2 
    Third = 3 
    Fourth = 4 
end 

TBase = class(TComponent) 
    protected 
    FFirst: integer; 
    FSecond: integer; 
    published 
    property First: integer read FFirst write FFirst; 
    property Second: integer read FSecond write FSecond; 
    end; 

    TFirstDescendant = class(TBase) 
    protected 
    FThird: integer; 
    published 
    property Third: integer read FThird write FThird; 
    end; 

    TSecondDescendant = class(TFirstDescendant) 
    protected 
    FFourth: integer; 
    published 
    property Fourth: integer read FFourth write FFourth; 
    end; 

そして、あなたはタイプTSecondDescendantのインスタンスを作成し、ストリーミング、それはのようになります。 DefStyleAttrを最初のものにするには、他のすべてのプロパティの前に公開する必要があります。あなたの階層がTFirstDescendantで始まり、あなたはそのクラスにDefStyleAttrを追加する必要がある場合は、それだけでストリーミングされます。例えば

あなたの階層がTBaseで始まる場合は、First

TBase = class(TComponent) 
    ... 
    published 
    property DefStyleAttr: String read fDefStyleAttr write SetDefStyleAttr; 
    property First: integer read FFirst write FFirst; 
    property Second: integer read FSecond write FSecond; 
    end; 

object TSecondDescendant 
    DefStyleAttr = 'abc' 
    First = 1 
    Second = 2 
    Third = 3 
    Fourth = 4 
end 

前にそれを追加する必要がありますafter properties of TBaseクラス。

TFirstDescendant = class(TBase) 
    ... 
    published 
    property DefStyleAttr: String read fDefStyleAttr write SetDefStyleAttr; 
    property Third: integer read FThird write FThird; 
    end; 

object TSecondDescendant 
    First = 1 
    Second = 2 
    DefStyleAttr = 'abc' 
    Third = 3 
    Fourth = 4 
end 

ストリーミングプロパティの順序に依存したコードを扱う際に懸念の一部に対処するために。

主な問題は、誰かが間違って公開プロパティの順序を変更したり、(非常にありそうもない)デルファイストリーミングシステムをいつか変更して間違えた場合でもそのコードが動作し続けることを確実にする組み込み(コンパイラ)注文をアップする。

コードが文書化されている場合、そのようなプロパティのある場所ははっきりとマークされ、注文が変更された場合に破損する単体テストがあれば、そのようなコードは安全に使用でき、誰でも書くことができる他のコード。

関連する問題