アクション リンクの使用方法

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

FireMonkey のアクション への移動


プログラムでアクション リンクを使用して、アクションをクライアントに接続することができます。このトピックでは、アクション リンクがどう実装されているかを説明します。

アクション クラスの種類

Appmethod のアクションの実装では、最も重要な次の 3 種類のアクション クラスを使用しています。

  • TAction クラス。TAction クラスおよびその下位クラスでは、FireMonkey アクション オブジェクトを定義します。TAction クラスおよびその下位クラスでは、コントロールやメニュー項目やツール ボタンと組み合わせて使用するアクションを実装します。アクションの published のプロパティやイベントは、設計時に[オブジェクト インスペクタ]で管理することができます。
  • TActionLink クラス。TActionLink クラスおよびその下位クラスでは、アクション リンクを定義します。アクション リンクとは、アクションをクライアント(オブジェクト、コンポーネント、コントロール)に接続するものです。クライアントはパラメータとして TActionLink のコンストラクタに渡され、割り当てられたアクション オブジェクトは TBasicActionLink.Action プロパティで示されます。アクション リンク オブジェクトでは、アクションと、クライアントのプロパティ、実行、更新イベントとの間のリンクもセットアップされます。
アクションを使用すると、ユーザー コマンドへの応答をアプリケーションで一元管理することができます。アクション リンクによってクライアントとアクションを関連付けると、アクションによってクライアントの適切なプロパティおよびイベントが決まります(クライアントが有効かどうか、クライアントが OnClick イベントにどう応答するか、など)。

TActionLink リンクの使用方法とその理由

Appmethod アプリケーションの設計時には、通常、アクションをクライアント(コントロール、メニュー項目、ツール ボタンなど、Action プロパティをサポートしている TFmxObject 型のコンポーネント)に割り当てます。

アクションをクライアントに割り当てる方法

設計時には、以下の手順でこの割り当てを行うことができます。

  1. フォーム デザイナで、クライアント コンポーネント(TFmxObject 型にキャスト可能なオブジェクト)を選択します。選択したコンポーネントに可視性が publishedAction プロパティがあれば、そのプロパティが[オブジェクト インスペクタ]に表示されます。
  2. [オブジェクト インスペクタ]で Action の項目を選択し、右側の下向き矢印をクリックします。クライアントに割り当てたいアクションを選択します。

実行時には、望ましいアクションをクライアント オブジェクトの ActionTFmxObject.Action)プロパティに割り当てればよいだけです。

Action プロパティにアクセスする方法

Action プロパティに対してアクションを割り当てたり取得することは、直接的な操作ではありません。Action プロパティは次のように宣言されています。

property Action: TBasicAction read GetAction write SetAction;

ただし、TFmxObject クラスには FAction フィールドがありません。private の設定アクセサ SetAction および取得アクセサ GetAction は、適切な TActionLink などのオブジェクトの Action プロパティに対して、アクションの値を設定または取得します。設定アクセサおよび取得アクセサは、GetActionLinkClass を呼び出して TActionLink などのオブジェクトを取得します。

設定アクセサ SetAction の中核部分は次のようになっています。

 procedure TFmxObject.SetAction(const Value: TBasicAction);
 var
   lClass: TActionLinkClass;
 begin
    lClass := GetActionLinkClass;
    FActionLink := lClass.Create(Self);
    ActionLink.Action := Value;
 end;

上記の

lClass: TActionLinkClass;

この部分では、変数 lClass を宣言しています。この値は、TActionLink クラスまたはその下位クラスのクラス参照です。このコードを理解するために、TFmxObject クラスで読み取り専用の ActionLink プロパティを宣言していることに注目してください。これは次のように FActionLink フィールドに格納されます。

property ActionLink: TActionLink read FActionLink;

SetAction 設定アクセサでは、クライアントに関連付けられたアクション リンク オブジェクトの ActionLink.Action プロパティを設定します。このアクション リンク オブジェクトは、次のようにして作成され、FActionLink に割り当てられます。

FActionLink := lClass.Create(Self);

以下のコードでは、クラス参照値 lClass を取得しています。

lClass := GetActionLinkClass;

GetActionLinkClass は、関連付けられたアクション リンク クラスを返します。 Action を取得するには、クライアント オブジェクトで GetAction を呼び出します。

 function TFmxObject.GetAction: TBasicAction;
 begin
  if Assigned(FActionLink) then
    Result := FActionLink.Action
 end;

この例でも、FActionLink プロパティに格納されたアクション リンク オブジェクトを使用しています。 つまり、クライアント オブジェクトでは、関連付けられたアクションを明示的に保持していません。アクションは、関連付けられたアクション リンク オブジェクトに格納されています。取得アクセサ GetAction および設定アクセサ SetAction は、このアクション リンク クラス オブジェクトの Action プロパティに対して、それぞれアクションの取得や設定を行います。 GetActionLinkClassnil 以外の値を返すなら、アクション オブジェクトが Action に割り当てられています。コントロール オブジェクトがアクションをサポートしていない場合には、GetActionLinkClassnil を返すはずです。この場合、値を Action プロパティに設定しようとすると、次の例外が発生します。

StrEActionNoSuported = 'クラス %s ではこのアクションをサポートしていません'

ActionClient プロパティに注目してください。

property ActionClient: boolean read FActionClient;


ActionClient プロパティは Action の値に応じて次のように変わります。

  • Action = nil の場合には、ActionClient = False です。つまり、このコンポーネント オブジェクトはどのアクションのクライアントでもありません。
  • Action <> nil の場合には、ActionClient = True です。つまり、このコンポーネント オブジェクトは関連付けられた何らかのアクションのクライアントです。ActionClient プロパティを変更すると、仮想メソッド DoActionClientChanged が呼び出されます。
メモ: アクション リンク クラスは Appmethod の内部機能です。アプリケーション内で明示的にアクション リンク クラスを使用する必要はありませんが、独自の型のクライアント コンポーネントを作成する場合は例外です。たとえば、作成するクライアント コンポーネントに新しいプロパティがある場合には、適切なアクション リンク オブジェクトを使ってそのプロパティの状態を制御する必要があります。そのため、いずれかのアクション リンク クラスを拡張してそのプロパティを処理する必要が生じる可能性があります。

関連項目