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