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