#4 | コマンドボタンのイベント | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
イベントプロシージャをコーディングするにせよ、マクロを割り当てるにせよ、初心者が一番初めにトライしてみるのが、このコマンドボタンの"クリック時"イベントではないでしょうか。また、フォームを閉じる、別のフォームを開く、レポートを開くなど、1つのフォームに必ず1ケはあるといってもよいのがコマンドボタンコントロールであり、その"クリック時"イベントであるといってもよいでしょう。コマンドボタンには、"フォーカス取得時"イベントや"キークリック時"イベントなど、マウス操作以外のイベントもありますが、やはり何といっても、既定のイベント(注)である"クリック時"イベントがその代表格です。むしろ、このイベントしか使ったことがないという人も少なくないのではないでしょうか。 しかし、コマンドボタンのプロパティシートのイベントタブを見てみると、マウス操作に関連したイベントは全部で5つもあります。
"ダブルクリック時"イベントはすぐにイメージが湧くと思いますが、それ以外のイベントはどのように発生しているのでしょうか?。今回はその点にスポットを当てて、イベントをトレースしてみたいと思います。 ※注:既定のイベントとは、オブジェクトを選択して右ボタンをクリック、[イベントのビルド]、[コード ビルダ]を選択することによって作られる、そのオブジェクトを代表する(一番使われる)イベントのことです。"フォーム"では"Load/読み込み時"、"テキストボックス"コントロールでは"BeforeUpdate/更新前処理"イベントなどがそれに当たります。
それでは、まず初めに、最も一般的な操作として、フォーム上のあるコマンドボタンを1回だけクリックしてみましょう。 その結果は次の通りです。
最も頻繁に使われる"クリック時"イベントの発生前には、"マウスボタンクリック時"イベントと"マウスボタン解放時"イベントが発生していることが分かります。これは、マウスのボタンの押し下げと、ボタンを離すという操作をゆっくりと行うと分かるのですが、ボタンを押し下げたままの状態では、"マウスボタンクリック時"イベントだけが発生しています。そして、ボタンを離すと、"マウスボタン解放時"と"クリック時"イベントが連続して発生するのです。つまり、マウス操作において、『クリック=マウスボタンの押し下げと解放』と定義すれば納得できるでしょう。
Windowsでは一般に、「ボタンを押し下げて、そのままの状態でマウスカーソルをボタン上から外れた位置に移動して、指を離す」という操作を行うと、クリックしたときに起こるべき動作は実行されません。うっかり違うボタンを押しても、マウスのボタンを離す位置がそのボタン上になければ、クリックしたことにはならないのです。 このような操作を行った際の、イベントの発生状況は次のようになっています。 確かに、"マウスボタンクリック時"と"マウスボタン解放時"イベントだけで、"クリック時"イベントは発生していません。 このことから、同じような名前だからといって、もし、"マウスボタンクリック時"と"クリック時"イベントを混同してコーディングしてしまうと、一度押してしまったコマンドボタンの操作を、マウスの移動によってキャンセルすることができなくなってしまいます。逆に、マウスボタンの押し下げと同時にアクションを起こしたいときには、"マウスボタンクリック時"イベントを使えばよいということになります(あとで説明しますが、これ以外にも、VBAのイベントプロシージャにおいては、"マウスボタンクリック時"イベントを使った方がよい場合があります)。
ここで、1〜3まではシングルクリックのときとまったく同じです。特徴的なのは、そのあとのイベント発生順序です。マウスの操作から考えると、"マウスボタンクリック時"イベントと"マウスボタン解放時"イベントが、一定時間内に2回発生することによって「ダブルクリック」されたと判断され、"ダブルクリック時"イベントが発生してもよさそうなのですが、そういう結果にはなっていません。まず、1回目の"クリック時"イベントが発生し、その直後に"ダブルクリック時"イベントが、"マウスボタン解放時"イベントに先行する形で発生しているのです。さらにどういうわけか、最後に2回目のクリックによる"クリック時"イベントが発生していることが分かります。 この結果から、コーディングの際に十分注意しなければいけないポイントが浮かび上がってきます。それは、イベントとしては「クリック」と「ダブルクリック」は別扱いになってはいるものの、ダブルクリック操作を行うと、"クリック時"イベントも発生するということです。シングルクリックなら処理Aを実行し、ダブルクリックなら処理Bを実行するというプログラムを作ったつもりでも、ダブルクリックによって『A→B→A』という3つの処理が実行されてしまうことになります。 このことを、次のようなイベントプロシージャによって検証してみましょう。
コマンドボタンのダブルクリックを実行後、イミディエイトウィンドウを確認してみます。やはり、『A→B→A』という3つの処理が実行されています。 以上の結果から、"クリック時"イベントと"ダブルクリック時"イベントは併用できないという結論になります。ダブルクリック時の処理を行いたい場合には、シングルクリック時の処理は使わないようにしなければなりません。 ※注:仮に併用した場合でも、"クリック時"イベントプロシージャの処理に時間がかかると、"ダブルクリック時"イベントプロシージャが実行されないこともあります。
ここまでの説明で、コマンドボタンに対する、マウス操作によるイベントの発生状況は分かったと思いますが、イベントプロシージャのコーディング上で、もっと大きな違いはないのでしょうか?。ここで、各イベントプロシージャの宣言の違いを見てみることにしましょう。 プロパティシート上に記述された、TrackEvents()プロシージャの呼び出しをすべてクリアし、コードビルダを使って、モジュール上にイベントプロシージャを作成します。 その各宣言行を一覧にしたものが次の表です。コマンドボタンの名前は「cmdTest」としています。
この表のポイントについてまとめてみました。
この中で、特に、「3」のキーボード操作の検出を利用することによって、コマンドボタンに対する多様な操作に対応することができます。例えば、同じコマンドボタンに対する押し下げ操作でも、
これを応用すれば、より高機能なボタン操作の機能をアプリケーションに実装することができるでしょう。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Copyright © T'sWare All rights reserved |