ステップ 5 - カスタム プロパティ(Object Pascal)

提供: Appmethod Topics
移動先: 案内検索

FireMonkey コンポーネントの作成(Object Pascal) への移動


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

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

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


前のステップ

関連項目