#3 | アクティブフォームの切り替えをトレースする | |||||||||||||||||||||||
ここでは、2つのフォームを使って、それらの間でアクティブフォームが切り替わったとき、どのようなイベントがどのような順序で発生するかを調べてみます。 まず、その準備として、「frm顧客マスタ1」と「frm顧客マスタ2」という2つのフォームを用意し、両方とも開かれた状態にします。もちろん、それぞれのフォームの各イベントプロパティには、"TrackEvents()"の呼び出しが設定されています。また、今回はフォームの中味までは関係ありませんので、デザインはまったく同じものとしています。 上の図では、現在、左側のフォーム「frm顧客マスタ1」がアクティブになっています。この状態から、右側のフォーム「frm顧客マスタ2」のタイトルバーの部分をクリックして、アクティブフォームを切り替えてみます。 その際のイベントの発生結果を、VBEのイミディエイトウィンドウで確認してみましょう。
ご覧のように、非常に分かりやすい結果になっています。まず、それまでアクティブだった「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」がアクティブな状態から、データベースウィンドウを選択します。データベースウィンドウをアクティブにすることによって、「frm顧客マスタ1」では"非アクティブ時"イベントが発生し、フォームが最小化されます。 次に、「frm顧客マスタ2」を選択してこれをアクティブにします。今度は「frm顧客マスタ2」の"アクティブ時"イベントが発生しますので、イベントプロシージャによってフォームは最大化されます。。 これらの操作によってAccessの画面は次のように変わります。 |
||||||||||||||||||||||||
|
Copyright © T'sWare All rights reserved |