Delphi Xe2 プラットフォームの firemonkey でカスタム コンポーネントの作成に取り組んでいます。firemonkey カスタム コンポーネントで公開プロパティを作成しています。ブール値、カスタムタイプなどのデフォルト値を設定していますが、デフォルトの整数値を設定しています。クラス TControl1 = class(TControl) を使用しています。Published Property Test : Integer 読み取り FTest 書き込み Set Test デフォルト 10; コンポーネント ビューアで、カスタム コンポーネントのデフォルトが 0 と表示されます。英語が下手で申し訳ありません。誰か助けてください
2 に答える
私の記憶が正しければ、default
ディレクティブはプライベートメンバーを設定しませんFTest
。次のように、コンポーネントのコンストラクターで初期化する必要があります。
TControl1 = class(TControl)
private
FTest: Integer;
procedure SetTest(Value: Integer);
public
constructor Create(AOwner: TComponent); override;
published
property Test: Integer read FTest write SetTest default 10;
end;
.
.
.
constructor TControl1.Create;
begin
inherited;
FTest := 10;
end;
プロパティ値を指定default
しても、その値は実行時にプロパティに割り当てられません。プロパティの格納方法を制御するだけです。プロパティが保存されるときにプロパティの値がデフォルトと等しい場合、VCL ストリーミング フレームワークはそのプロパティを省略します。
ドキュメントには次のように書かれています。
プロパティを宣言するときに、そのデフォルト値を指定できます。VCL はデフォルト値を使用して、プロパティをフォーム ファイルに保存するかどうかを決定します。プロパティのデフォルト値を指定しない場合、VCL は常にそのプロパティを保存します。
...
デフォルト値を宣言しても、プロパティはその値に設定されません。コンポーネントのコンストラクター メソッドは、必要に応じてプロパティ値を初期化する必要があります。ただし、オブジェクトは常にフィールドを 0 に初期化するため、コンストラクターが整数プロパティを 0、文字列プロパティを null、またはブール型プロパティを False に設定する必要はありません。
つまり、デフォルト値を設定するだけでなく、コンポーネントのコンストラクターでプロパティを初期化する必要があります。として指定したのと同じ値に初期化するのはあなたの責任ですdefault
。
私は個人的に、デザインに内在する重複が幾分イライラすることを常に発見しました. 設計者は、DRY 原則に反するものを言語に組み込むことに成功しました。あなたがこの質問をしたという事実そのものが、設計の弱点を示しています。値を指定するdefault
と、コンパイラが無視しているように見えて、再度設定するように要求することに驚きます。