|
|
連載
改訂版 プロフェッショナルVB.NETプログラミング
Chapter 12 イベント
株式会社ピーデー
川俣 晶
2004/08/05 |
|
イベントはVisual Basicの定番の機能といえる。しかし、VB 6からVB.NETへの変化の中で、イベント機能は大きな変貌を遂げている。VB.NETのイベントは、あるクラスの内部で発生した出来事を外部に伝達する仕組みである。デリゲートと混同されることもあるが、デリゲートはデータ型の1つであり、イベントは型のメンバである。統合開発環境を使っていると完全に把握していなくてもイベント機能を使うことができるが、トラブルを未然に防ぎ、より確実に活用するためにも、イベントについて正しく把握しておこう。
本連載のChapter 07でWindowsアプリケーションの構造を解説したが、その中にはイベント機能に関する詳しい説明が含まれていない。これは、イベント機能がWindowsアプリケーション専用の機能ではないことによる。しかし、Windowsアプリケーションにとって、イベント機能が重要な役割を持つことは否定できない。ここではまず、単純なWindowsアプリケーションで解説を行わなかった、Handlesキーワードについての説明から始める。
1: Public Class Form1
2: Inherits System.Windows.Forms.Form
3:
4: …Windows フォーム デザイナで生成されたコード…
5:
6: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
7: MsgBox("Clicked!")
8: End Sub
9: End Class
|
|
リスト12-1 メッセージ・ボックスを表示するプログラム(リスト7-5の再掲、VB.NETでフォームにボタンを配置しておく必要あり)
|
まず、6行目に見えるHandlesキーワードについて説明しよう。このキーワードは、その後に続いて記述されたイベントを処理するメソッドであることを示している。実は、メソッド名のButton1_Clickという名前にはまったく意味がない。例えば、メソッド名を以下のように無関係な名前に変更しても、正常に動作する。
1: Private Sub UltraSuperSpecialMethod(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
2: MsgBox("Clicked!")
3: End Sub
|
|
リスト12-2 メソッド名を変更した、ボタンのイベントを処理するメソッド
|
どのイベントを受け取るかは、Handlesキーワードの後に続く記述に従っているということである。ここにはButton1.Clickと書かれているが、これはButton1というボタンのインスタンスのClickイベントであることを意味している。ボタンが複数あっても、Button1という名前のボタン以外は無関係である。また、Click以外のイベントが起きた場合も無関係である。
メソッドの名前に意味がないことにより、同じイベントを処理するメソッドを複数記述できることになってしまう。例えば、以下のようなプログラム・コードを記述できる。まず、以下のようにフォームにボタンを1個貼り付ける。
|
●図12-3 VB.NETでWindowsアプリケーションを新規作成し、フォームにボタンを1個貼り付ける |
そして、以下のようにコードを編集する。
1: Public Class Form1
2: Inherits System.Windows.Forms.Form
3:
4: …Windows フォーム デザイナで生成されたコード…
5:
6: Private Sub ClickHandler1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
7: MsgBox("Clicked ClickHandler1!")
8: End Sub
9:
10: Private Sub ClickHandler2(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
11: MsgBox("Clicked ClickHandler2!")
12: End Sub
13: End Class
|
|
リスト12-4 同じイベントを処理するメソッドを複数記述したプログラム
|
このプログラムには、ClickHandler1、ClickHandler2という2つのメソッドが見えるが、どちらも、Handlesキーワードにより、同じButton1コントロールのClickというイベントを指定している。このソース・コードはエラーにならず実行できる。
|
●図12-5 リスト12-4の実行結果 |
ここでボタンを押すと、以下の2つのメッセージ・ボックスが順番に出てくる。
|
|
●図12-6 リスト12-4の実行結果でボタンを押すと順次表示される2つのメッセージ・ボックスtes) |
このことから分かるとおり、VB.NETではイベント・ハンドラとなるメソッド(イベントを処理するメソッド)は、1つのインスタンスの1つのイベントに対して複数存在してもよく、それらは順番に呼び出される。この特徴は、単純に考えれば意味がないように思えるかもしれないが、継承を多用していると、異なるクラスから同じイベントを扱いたい場合が出てくることがある。そのような場合に意味が出てくるだろう。
1つのイベントから複数のイベント・ハンドラを呼び出せることを示したが、逆もできる。つまり、複数のイベントのどれが発生しても、1つのイベント・ハンドラを呼び出すようにすることができる。
まず、以下のようにフォームにボタンを3個貼り付ける。
|
●図12-7 VB.NETでWindowsアプリケーションを新規作成し、フォームにボタンを3個貼り付ける |
そして、以下のようにプログラム・コードを編集する。
1: Public Class Form1
2: Inherits System.Windows.Forms.Form
3:
4: …Windows フォーム デザイナで生成されたコード…
5:
6: Private Sub ClickHandler(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
7: MsgBox("Clicked!")
8: End Sub
9: End Class
|
|
リスト12-8 1つのイベント・ハンドラで3つボタンを処理するプログラム
|
これを実行すると以下のようになる。
|
●図12-9 リスト12-8の実行結果 |
ここでどのボタンを押しても、以下のメッセージ・ボックスが表示される。
|
●図12-10 リスト12-8の実行結果で、どのボタンを押しても表示されるメッセージ・ボックス |
ここで注目すべきことは、6行目のHandlesキーワードの後に複数のイベントが列挙されていることである。1つのイベント・ハンドラのメソッドには、複数のイベントを対応させることができる。
業務アプリInsider 記事ランキング
本日
月間