ステップ 5 - カスタム プロパティ(C++)
FireMonkey コンポーネントの作成(C++) への移動
コンポーネントでは、"Do" ボタンを表示するために、ダイアログの操作を表わす動詞("Save" など)の追加プロパティが必要です。この動詞は、"Don't" ボタンにも結び付けられます (さらに複雑な国際化は、このトピックの範囲外)。
ボタンが存在することが保証され、動詞を保持する Text をデリゲートできる場合に簡単になります。ただし、スタイルが適用されるまでボタンは存在しません。スタイルが再度適用された場合、既存のボタンは破棄されます。したがってコンポーネントでは、この文字列自体を保持する必要があります。次のように DoVerb プロパティを宣言し実装します。
class PACKAGE TDialogButtonPanel : public TPanel
{
private:
String FDoVerb;
TAlignLayout FAlign;
void __fastcall SetDoVerb(String AString);
String __fastcall GetDoVerb();
protected:
TControl* __fastcall TDialogButtonPanel::GetStyleObject();
void __fastcall ApplyStyle();
public:
__fastcall TDialogButtonPanel(TComponent* Owner);
__published:
__property Align = { default = TAlignLayout::Bottom };
__property String DoVerb ={ read=GetDoVerb, write=SetDoVerb };
};
//---------------------------------------------------------------------------
const String DoButtonName = "DoButton";
const String DontButtonName = "DontButton";
const String CancelButtonName = "CancelButton";
// ---------------------------------------------------------------------------
__fastcall TDialogButtonPanel::TDialogButtonPanel(TComponent* Owner)
: TPanel(Owner){
Height = 46;
Width = 300;
Align = TAlignLayout::Bottom;
DoVerb = "Verb";
}
// ---------------------------------------------------------------------------
void __fastcall TDialogButtonPanel::ApplyStyle() {
TStyledControl::ApplyStyle();
SetDoVerb(FDoVerb);
}
// ---------------------------------------------------------------------------
String __fastcall TDialogButtonPanel::GetDoVerb(){
TFmxObject* Base;
TTextControl* TextBase;
Base = FindStyleResource(DoButtonName);
if ((TextBase = dynamic_cast<TTextControl*>(Base)) != NULL) {
FDoVerb = TextBase->Text;
}
return FDoVerb;
}
// ---------------------------------------------------------------------------
void __fastcall TDialogButtonPanel::SetDoVerb(String AString) {
TFmxObject* Base;
TTextControl* TextBase;
Base = FindStyleResource(DoButtonName);
FDoVerb = AString;
if ((TextBase = dynamic_cast<TTextControl*>(Base)) != NULL) {
TextBase->Text = AString;
}
Base = FindStyleResource(DontButtonName);
if ((TextBase = dynamic_cast<TTextControl*>(Base)) != NULL) {
TextBase->Text = "Don't " + AString;
}
}
3 つのボタンのそれぞれに StyleName を定数として宣言し、"Don't" ボタンに "OK" モーダル結果コードの負の値も指定します。FDoVerb フィールドは、動詞文字列を保持するために、オブジェクトに追加されます。
実行時に、アクセス順序は次のようになります。
- このアプリケーションを実行すると、そのフォーム(ボタン パネルがあるダイアログ ボックス フォームを含む)がすべて作成されます。パネルは、
.fmx
から読み込んだとき、object
行によりインスタンスが作成されます。コンストラクタはデフォルトの動詞をプロパティに書き込み、SetDoVerb を呼び出します。フィールドが設定されます。ボタンは見つかりません。 - プロパティ値を
.fmx
から割り当て、SetDoVerb は再び呼び出され、デザイナによって保存された文字列("Save" など)で、フィールドが変更されます。 - ダイアログ ボックスが開くと、塗りつぶされます。コントロールを塗りつぶす準備手順の 1 つは、必要な場合にスタイルを適用することです。これはコントロールが最初に塗りつぶされた場合も該当します。ApplyStyle を呼び出して終了します。ここでオーバーライドされ、フィールドから動詞文字列が再適用されます。フィールドに冗長に割り当て直されますが、ここでボタンが表示され、"Do" ボタンで動詞も設定され、"Don't" ボタンで動詞が "Don't" に結合されます。
- ボタンをレンダリングするとき、GetDoVerb が実行されません。理由はスタイルを構成するボタンが、直接レンダリングされ、既に適切なテキストがあり、設定アクセサ メソッドにより割り当てられるからです。取得アクセサ メソッドが第一に使用されるのは、フォーム デザイナおよびパネルのプロパティを取得する実行時コードによってです。完全性のため、メソッドは存在するが、ボタンが直接操作されない(カプセル化の省略)場合、メソッドは "Do" ボタンからフィールドの更新を試み、テキストとフィールドは、既に同期しています。