Visual Basic 6.0 入門講座 |
第4回 イベントを逃すな
執筆:2000年3月2日
前回少し説明したように、VBでは「ユーザー(使う人)から入力があると、それに応答する」という形式でプログラミングをします。この形式を「イベントドリブン」と言うのでした。今回は、このVBのイベントドリブンの形式で具体的にはどのようにプログラミングしたらよいのかを説明します。
1.イベントとは
具体的な話にはいる前に少し基本的なことを確認しておきます。「ユーザーからの入力」というと、マウスがクリックされた、キーボードが押されたなど考えやすい物ばかり浮かびそうですが実はこういった物ばかりではありません。
たとえば、「時間がたった」、「フォームが最小化された」、「インターネットに接続した」、「電源が残り少しになった(ノートパソコンの場合)」、「あたらしい装置をパソコンに接続した」などなど。通常は 「これって入力?」 と言うような物までを「入力」としてとらえます。
しかし、「入力」というと紛らわしいので(かどうかは知りませんが)、これらのことをまとめてVBでは「イベント」と呼んでいるわけです。
さらに、今回は説明しませんが自分で新しいイベントを作ることもできます。たとえば、ゲームを作るときには「敵から攻撃された」というイベントが必要になるかも知れません。このように「イベント」を我々が普段使う意味での「入力」ととらえてしまうと全体像が見えにくくなってしまいます。
また、イベントは「受け取る物」が決まっています。たとえば、コマンドボタンを「クリックした」と言うイベントは、そのままコマンドボタンが受け取ります。他の物にどういうイベントが起こったかということは知ることはできません(高度な裏技はあります)。
2.コマンドボタンがクリックされた
それでは、コマンドボタンがクリックされたら、「こんにちは」と表示するプログラムを作ってみましょう。フォームにコマンドボタンを配置してください。そしてコマンドボタンをダブルクリックすると次のようなコードが自動的に現れますね。
Private Sub Command1_Click()
End Sub
これが、イベントを捕まえる仕掛けです。1行目の Private Sub Command1_Click() は「コマンドボタンがクリックされたら ここから実行する。」と言う目印です。もっと細かく見てみると、Private Subは決まり文句なので今は無視してください。その後に続く、Command1_Click()。これが「コマンドボタンをクリック」つまり「Command1クリックイベント」を表しています。
だから、何の説明がなくてもプログラムに Private Sub Command1_Click() を見つけたら「あぁ、この部分は コマンドボタン(Command1)のクリックイベントに応答するところだな。」と分かります。
このイベントが発生した時に何をすればよいかはここから、End Subまでの間に書きます。今回は「こんにちは」と表示させたいのですから、次のようにすれば完成です。
Private Sub Command1_Click()
MsgBox "こんにちは"
End Sub
3.その他のイベントでは?
イベントに応答するときは必ず、
Private Sub 受け取る物の名前_イベントの名前()
End Sub
の形になります。このPrivate Sub 〜 End Subにはさまれた部分をイベントプロシージャと呼びます。イベントの名前の後ろにある かっこ の中に何が入るかはイベントによって異なります。コマンドボタンクリックの例では何も入りませんでした。それでも かっこ は必ずつける決まりになっています。
さて、受け取る物の名前は、ほとんどの場合 自分で配置したコントロールの名前です。コマンドボタンを配置すると自動的に「Command1」という名前がつきますね。もちろん名前は自分で付けることもできます。名前をつけるには、そのコントロールを1回だけクリックしてプロパティウィンドウのオブジェクト名という項目を変更するだけで結構です。(この段で解説している操作の方法が分からない人は 入門講座2 を見てください)。
次にイベントの名前ですが、これはVBで決められていて自分で勝手に変えることはできません。
クリックイベントの場合は Click で、ダブルクリックの場合は DblClick です。下の方で代表的なイベントを表にまとめてあるのでそちらを見てください。
ここまで、解説すれば「フォームがクリックされたら 『私はフォームです』 と表示させる」プログラムは書けますね。フォームがクリックされるのだから、イベントの名前は Click です。フォームの名前は常に Form です。(フォームだけはなぜか自分で名前を変えても、イベントの時は Form という名前になる)。
ですから、このプログラムは次のようになります。実際に試してみてください。
Private Sub Form_Click()
MsgBox "私はフォームです"
End Sub
これで、どんなイベントでもイベント名とかっこの中さえ分かれば自分でプログラムできます。
4.親切なVB
ところで、Private Sub Form_Click() とかじゃ書くのが面倒です。それにどんなイベントがあるのかもいまいちわかりずらい。いちいち調べているのは大変です。そこで親切なVBはこの部分を自動的に作ってくれる機能を2つ持っています。
1つはすでに説明しています。最初にコマンドボタンをダブルクリックすると自動的にPrivate Sub Command1_Click() というコードが生成されたでしょう。この機能の注意すべき点はいつでもクリックイベントが生成されるわけではないと言うことです。
たとえば、新しくプログラムするときにフォームをダブルクリックすると Private Sub Form_Load() という物が生成されます。(これは ロードイベント という物です。後の方で解説しています。)。上の例のように すでに自分で Private Sub Form_Click() と記述している場合はこの部分が表示されます。
その他、テキストボックスをダブルクリックすると チェンジイベントが生成されるなど、コントロールによって生成されるイベントは異なります。
生成されるイベントは 「そのコントロールにすでに何かプログラムされているときはそのイベント。まだ何もプログラムしていないときは そのコントロールで一番使うであろうと思われるイベント」となります。
確かに、コマンドボタンは普通はクリックして使う物ですからクリックイベントが一番必要でしょう。しかし、フォームをクリックするという使い方はそれほど多くないのでフォームの場合はより重要と思われるロードイベントが生成されるのです。
2つ目の機能はVBのコード編集画面で使います。下の画像を見てください。
この画像では オブジェクトボックスのところに Command1 と表示されています。この部分には現在カーソルがあるコントロールの名前が表示されています。(General)と表示されているときはカーソルがどのコントロールのところにもない(宣言セクションにある)ことを示しています。
プロシージャボックスのところには現在編集中のイベントなどが表示されます。ためしに、Private Sub Command1_Click() のところにカーソルを移動させてみるとこの画像のようにCommand1とClickが表示されるのが確認できます。
では、その状態で プロシージャボックスの右にある下向きの矢印をクリックしてみてください。なにやらたくさん表示されたでしょう。実はこれ全部イベントの名前です。
ためしにこの中から、KeyPress(読み方:KeyPress = キープレス)と言う物を選んでみてください。そうすると、自動的に次のようなコードが生成されます。
Private Sub Command1_KeyPress(KeyAscii As Integer)
End Sub
このKeyPressイベントはそのコントロールにフォーカス(注1)があるときにキーボードを押すと発生するイベントです。注1:フォーカスとは注目されている状態のことです。コマンドボタンにフォーカスがあるときはコマンドボタンの内側を点線の四角形がかこむので分かります。
かっこのなかに KeyAscii As Integer というのがありますが、まぁ今日の説明は個々のイベントを紹介(詳解)する物ではないので説明は省略します。
次のようにプログラムしてみてください。
Private Sub Command1_KeyPress(KeyAscii As Integer)
MsgBox "あなたはキーコード " & KeyAscii & " のキーを押しました。"
MsgBox "このキーコードが意味する物は " & Chr$(KeyAscii) & " です。"
End Sub
完成したら実行してみます。まず、コマンドボタンを1回クリックしてフォーカスを与えてから(といっても、最初からフォーカスを持っているとは思いますが)、キーボードのキーを何か押してみてください。KeyPressイベントが発生して記述したコードが実行されます。
なお、Shiftキーや、Tabキーなどには反応しません。
さて、これだけいろいろと自動的にやってくれるのですから、自分がすることと言えば、「どういうイベントがあって、どういう使い方ができるのか」覚えるだけと言うことになりますね。
5.代表的なイベント
すべてのイベントがすべてのコントロールでサポートされている(使用可能)わけではありません。たとえば、フォームはDblClickイベント(ダブルクリック)を受け取りますが、コマンドボタンは受け取れません。その点に注意して、下の代表的なイベントをまとめた表を見てください。
イベント | 読み方 | 意味 |
Click | クリック | マウスの左ボタンがクリックされた |
DblClick | ダブルクリック | マウスの左ボタンがダブルクリックされた |
Change | チェンジ | テキストなどの内容が変化した |
Load | ロード | フォームが準備された(開始) |
Resize | リサイズ | フォームのサイズが変化した |
UnLoad | アンロード | フォームが不要とされた(終了) |
GotFocus | ゴットフォーカス | フォーカスを得た |
Timer | タイマー | 時間が経った |
KeyPress | キープレス | キーボードが押された |
このうち重要かつ注意が必要な Loadイベント と UnLoadイベントについて少し説明します。
Loadイベントは通常の設定にしておけばプログラムが開始されたときに必ず1度実行されます。そのため、プログラムの中で一番最初にやっておきたい処理はこのイベントのところ(イベントプロシージャ)に記述することになります。
UnLoadイベントはその逆でプログラムが終了するときに発生します。そのため終了させる前に最低限やっておきたい処理を記述します。たとえば、ワープロソフトなどを終了させようとしたら「保存してから、終了しますか?」と聞かれることがありますが、ああいった処理が可能になります。
イベントの数は実にたくさんあるので総数は分かりません。私も1度も使ったことのないイベントもたくさんあります。VBのプログラムは最初に書いたように「イベントドリブン」つまり、イベントを元にプログラムしていく形式なのですから、代表的なイベントを1つずつ自分の物にしていくのがよいでしょう。
それでは、今回はここまでです。