ステップ 5 - カスタム プロパティ(C++)

提供: RAD Studio
移動先: 案内検索

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 フィールドは、動詞文字列を保持するために、オブジェクトに追加されます。

実行時に、アクセス順序は次のようになります。

  1. このアプリケーションを実行すると、そのフォーム(ボタン パネルがあるダイアログ ボックス フォームを含む)がすべて作成されます。パネルは、.fmx から読み込んだとき、object 行によりインスタンスが作成されます。コンストラクタはデフォルトの動詞をプロパティに書き込み、SetDoVerb を呼び出します。フィールドが設定されます。ボタンは見つかりません。
  2. プロパティ値を .fmx から割り当て、SetDoVerb は再び呼び出され、デザイナによって保存された文字列("Save" など)で、フィールドが変更されます。
  3. ダイアログ ボックスが開くと、塗りつぶされます。コントロールを塗りつぶす準備手順の 1 つは、必要な場合にスタイルを適用することです。これはコントロールが最初に塗りつぶされた場合も該当します。ApplyStyle を呼び出して終了します。ここでオーバーライドされ、フィールドから動詞文字列が再適用されます。フィールドに冗長に割り当て直されますが、ここでボタンが表示され、"Do" ボタンで動詞も設定され、"Don't" ボタンで動詞が "Don't" に結合されます。
  4. ボタンをレンダリングするとき、GetDoVerb が実行されません。理由はスタイルを構成するボタンが、直接レンダリングされ、既に適切なテキストがあり、設定アクセサ メソッドにより割り当てられるからです。取得アクセサ メソッドが第一に使用されるのは、フォーム デザイナおよびパネルのプロパティを取得する実行時コードによってです。完全性のため、メソッドは存在するが、ボタンが直接操作されない(カプセル化の省略)場合、メソッドは "Do" ボタンからフィールドの更新を試み、テキストとフィールドは、既に同期しています。

前のステップ

関連項目