アクションの起動時に何が発生するか
アクション リストを使用した VCL アクションの処理 への移動
あるイベントが発生すると、主に汎用アクションを目的とした一連のイベントが発生します。 ここでイベントがアクションを処理しなければ、別の一連のイベントが発生します。
イベントによる応答
クライアント コンポーネントまたはクライアント コントロールに対してクリック動作などの操作を行うと、ユーザーが応答できる一連のイベントが発生します。 たとえば、次のコードは、アクションが実行されたときにツールバーの表示を切り替えるアクションのイベント ハンドラを示しています。
procedure TForm1.Action1Execute(Sender: TObject);
begin
{ Toggle Toolbar1's visibility }
ToolBar1.Visible := not ToolBar1.Visible;
end;
void __fastcall TForm1::Action1Execute(TObject *Sender)
{
// Toggle Toolbar1's visibility
ToolBar1->Visible = !ToolBar1->Visible;
}
メモ: イベントとイベント ハンドラに関する一般情報については、「イベント/イベントハンドラでの作業」を参照してください。
作成するイベント ハンドラは、次の 3 つのレベルのいずれかで応答します: アクション、アクション リスト、アプリケーション。 これを気にする必要があるのは、定義済み標準アクション以外の、新しい汎用アクションを使用する場合のみです。 標準アクションを使用する際にはこれを気にする必要はありません。なぜなら、標準アクションには、これらのイベントが発生した場合に実行される動作が組み込まれているからです。
イベント ハンドラばイベントに応答する順番は、次の通りです:
- アクション リスト
- アプリケーション
- アクション
ユーザーがクライアント コントロールをクリックした際、Delphi はアクションの Execute メソッドを呼び出します。このメソッドは、まずアクション リストに従い、次のApplication オブジェクト、そして、アクションと Application のどちらもこれを処理しなかった場合、アクション自身に従います。 もう少し詳しく説明します。Delphi では、ユーザー アクションへの応答方法を探す際、次のディスパッチ シーケンスに従います。
アクション リストに OnExecute イベント ハンドラがあり、それがアクションを処理した場合、アプリケーションは続行します。
アクション リストのイベント ハンドラには、Handled というパラメータがあり、デフォルトでは False を返します。 ハンドラが割り当てられて、イベントを処理した場合、True が返され、処理シーケンスはそこで終わります。 例:
procedure TForm1.ActionList1ExecuteAction(Action: TBasicAction; var Handled: Boolean);
begin
Handled := True;
end;
void __fastcall TForm1::ActionList1ExecuteAction(TBasicAction *Action,
bool &Handled) {
Handled = true;
}
アクション リストのイベント ハンドラで、Handled を True に設定しなかった場合、処理は続行されます。
アクション リストの OnExecute イベント ハンドラを記述しなかった場合、または、そのイベント ハンドラがアクションを処理しなかった場合、アプリケーションの OnActionExecute イベント ハンドラが呼び出されます。 これがアクションを処理した場合、アプリケーションは続行します。
アプリケーション内のアクション リストが、イベントの処理に失敗した場合、グローバルの Application オブジェクトが Vcl.Forms.TApplication.OnActionExecute イベントを受け取ります。 アクション リストの OnExecute イベント ハンドラと同様、OnActionExecute ハンドラにはパラメータ Handled があり、デフォルトでは False を返します。 イベント ハンドラが割り当てられて、イベントを処理した場合には、True が返され、処理シーケンスはそこで終わります。 例:
procedure TForm1.ApplicationExecuteAction(Action: TBasicAction; var Handled: Boolean);
begin
{ Prevent execution of all actions in Application }
Handled := True;
end;
void __fastcall TForm1::ApplicationExecuteAction(TBasicAction *Action,
bool &Handled)
{
// Prevent execution of all actions in Application
Handled = true;
}
アプリケーションの OnExecute イベント ハンドラがアクションを処理しなかった場合、アクション自身の OnExecute イベント ハンドラが呼び出されます。
組み込みのアクションを使用しても、独自のアクション クラスを作成しても構いません。独自クラスの場合、特定のターゲット クラス(編集コントロールなど)に対して、どう作用するかを定義してください。 どのレベルにもイベント ハンドラが見つからなかった場合、アプリケーションは次に、アクションの実行ターゲットを見つけようとします。 アクションが到達方法を分かっているターゲットを、アプリケーションが見つけた場合、そのアクションを呼び出します。 アプリケーションが、定義アクション クラスに応答可能なターゲットをみつける方法については、「アクションがどのようにターゲットを見つけるか」を参照してください。