#3 アクティブフォームの切り替えをトレースする

ここに出てくるイベント
  • Activate/アクティブ時
  • Deactivate/非アクティブ時
  • MouseMove/マウスボタン移動時
  • MouseDown/マウスボタンクリック時
  • MouseUp/マウスボタン解放時
  • Click/クリック時
  • Enter/フォーカス取得時
  • GotFocus/フォーカス取得後


2つのフォームを切り替える

ここでは、2つのフォームを使って、それらの間でアクティブフォームが切り替わったとき、どのようなイベントがどのような順序で発生するかを調べてみます。

まず、その準備として、「frm顧客マスタ1」と「frm顧客マスタ2」という2つのフォームを用意し、両方とも開かれた状態にします。もちろん、それぞれのフォームの各イベントプロパティには、"TrackEvents()"の呼び出しが設定されています。また、今回はフォームの中味までは関係ありませんので、デザインはまったく同じものとしています。
2つのフォームを開いたところ

上の図では、現在、左側のフォーム「frm顧客マスタ1」がアクティブになっています。この状態から、右側のフォーム「frm顧客マスタ2」のタイトルバーの部分をクリックして、アクティブフォームを切り替えてみます。

その際のイベントの発生結果を、VBEのイミディエイトウィンドウで確認してみましょう。


発生順序 オブジェクト名 イベント名
1 frm顧客マスタ1 非アクティブ時
2 frm顧客マスタ2 アクティブ時


ご覧のように、非常に分かりやすい結果になっています。まず、それまでアクティブだった「frm顧客マスタ1」がアクティブでなくなり、続いて「frm顧客マスタ2」がアクティブな状態になるという順番で、アクティブフォームの切り替えイベントが発生しています。

しかし、今回、「frm顧客マスタ2」のタイトルバーをクリックしてフォームを切り替えたのには訳があります。タイトルバーのクリックによる切り替え、タスクバーのクリックによる切り替え、メニューの[ウィンドウ]からの選択による切り替えでは、単純に上記のような2つのイベントが発生するだけです。しかし、切り替える際の操作手順、特にマウスの動きによって、これ以外のイベントも発生することがあるからです。




そこで、続いて、それらを確認するため、少し操作手順を変えてやってみましょう。


レコードセレクタをクリックして切り替えると....

「frm顧客マスタ2」のレコードセレクタ部分をクリックすることによって、「frm顧客マスタ1」から「frm顧客マスタ2」への切り替えを行ってみます。
マウスの動き

イベント発生状況は次の図のようになります。
実行結果のイミディエイトウィンドウ

1〜6は、「frm顧客マスタ2」のレコードセレクタ上でのマウスの移動を表しています。今回はたまたま6回のイベントが発生していますが、レコードセレクタ上での移動量やスピードによって、その回数は変わります。

そのあと、レコードセレクタをクリックすることによって、"非アクティブ時"と"アクティブ時"イベントが続けて発生します。操作順の感覚からすると、先に"マウスボタンクリック時"イベントや"マウスボタン解放時"イベントが発生してもよさそうですが、実際には"非アクティブ時"と"アクティブ時"イベントの方が先という、おもしろい結果になっています。



詳細セクションをクリックして切り替えると....

フォームの"詳細"セクション(フォームの背景の部分)をクリックすることによっても、アクティブフォームを切り替えることができます。

まず、「frm顧客マスタ2」の詳細セクションのイベントをトレースできるよう、詳細セクションの各イベントのプロパティを次のように設定します。
詳細セクションのイベントプロパティ


それでは、この操作手順で、「frm顧客マスタ1」から「frm顧客マスタ2」への切り替えを行ってみましょう
マウスの動き

この結果のイベントの発生順序は、下図の通りです。
実行結果のイミディエイトウィンドウ

先ほどのレコードセレクタの場合と比べて、"マウスボタ移動時"イベントや"マウスボタンクリック時"イベントが発生しているオブジェクトが「詳細セクション」になっているだけで、同じ順序で同じイベントが発生していることが分かります。



テキストボックスをクリックして切り替えると....

最後に、「frm顧客マスタ1」がアクティブになっている状態で、「frm顧客マスタ2」の「氏名」欄にデータを入力しようと、そのテキストボックスが直接クリックされたという操作を仮定して、イベントをトレースしてみましょう。
マウスの動き

まず、テキストボックス「氏名」の各イベントプロパティを次のように設定しておきます。
テキストボックスのイベントプロパティ

その結果は、次のようになりました。
実行結果のイミディエイトウィンドウ

この結果から、マウスが詳細セクションの上を通過して、「氏名」テキストボックス上に移動、そのクリックによってアクティブフォームが切り替わっている様子がうかがえます。ここでも同様に、クリックすることによってアクティブフォームが切り替わるという感覚とは違って、テキストボックスのマウス関連イベントやフォーカス取得関連のイベントより先に、"非アクティブ時"イベントと"アクティブ時"イベントが発生していることが特徴的です。



イベントの利用例

何パターンか操作手順を変えて、イベントの発生をチェックしてみましたが、いずれにせよ、"アクティブ時"イベントおよび"非アクティブ時"イベントという2つのイベントが、ユーザーによるフォームの切り替え操作を検出することは間違いありません。フォームが切り替えられる際、必ずレコードセレクタや詳細セクションなどがクリックされるとは限りません。したがって、フォームが切り替えられたときに何らかの動作をさせたいときには、これら2つのイベントプロシージャを使ってプログラミングを行うようにすれば確実です。

ここでは、その利用例として、
  • フォームがアクティブでなくなったら、そのウィンドウを最小化する
  • フォームがアクティブになったら、そのウィンドウを最大化する
というコードを紹介します。

【frm顧客マスタ1の"非アクティブ時"イベントプロシージャ】

Private Sub Form_Deactivate()

  'フォームを最小化する
  DoCmd.Minimize

End Sub


【frm顧客マスタ2の"アクティブ時"イベントプロシージャ】

Private Sub Form_Activate()

  'フォームを最大化する
  DoCmd.Maximize

End Sub


これらのイベントプロシージャを作成したら、実際に画面を操作してみます。

ここではまず、画面左側の「frm顧客マスタ1」がアクティブな状態から、データベースウィンドウを選択します。データベースウィンドウをアクティブにすることによって、「frm顧客マスタ1」では"非アクティブ時"イベントが発生し、フォームが最小化されます。

次に、「frm顧客マスタ2」を選択してこれをアクティブにします。今度は「frm顧客マスタ2」の"アクティブ時"イベントが発生しますので、イベントプロシージャによってフォームは最大化されます。。

これらの操作によってAccessの画面は次のように変わります。
実行前の状態

frm顧客マスタ1が非アクティブになったとき frm顧客マスタ2がアクティブになったとき


| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved