|
|
連載
プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――
第25回 イベントとイベント・ハンドラ
(株)ピーデー
川俣 晶
2002/11/16
|
イベントを処理する
今回は、前回の冒頭でも少し触れた、VB.NET(Visual Basic .NET)におけるイベントと、イベント処理を行うメソッドについて解説しよう。もう一度、前回で作成した以下のVB.NETのサンプル・プログラム2に戻ろう。
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
|
|
メッセージ・ボックスを表示する、VB.NETのサンプル・プログラム2の再掲(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
|
|
メソッド名を変更した、ボタンのイベントを処理するメソッド |
どのイベントを受け取るかは、Handlesキーワードの後に続く記述に従っているということである。ここにはButton1.Clickと書かれているが、これはButton1というボタンのインスタンスのClickイベントであることを意味している。ボタンが複数あっても、Button1という名前のボタン以外は無関係である。また、Click以外のイベントが起きた場合も無関係である。
複数のイベント・ハンドラ
メソッドの名前に意味がないことにより、同じイベントを処理するメソッドを複数記述できることになってしまう。例えば、以下のようなプログラム・コードを記述できる。まず、以下のようにフォームにボタンを1個貼り付ける。
|
VB.NETでWindowsアプリケーションを新規作成し、フォームにボタンを1個貼り付ける(コードはサンプル・プログラム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
|
|
同じイベントを処理するメソッドを複数記述したサンプル・プログラム1 |
このプログラムには、ClickHandler1、ClickHandler2という2つのメソッドが見えるが、どちらも、Handlesキーワードにより、同じButton1コントロールのClickというイベントを指定している。このソース・コードはエラーにならず実行できる。
|
サンプル・プログラム1の実行結果 |
ここでボタンを押すと、以下の2つのメッセージ・ボックスが順番に出てくる。
|
|
サンプル・プログラム1の実行結果でボタンを押すと順次表示される2つのメッセージ・ボックス |
このことから分かるとおり、VB.NETではイベント・ハンドラとなるメソッド(イベントを処理するメソッド)は、1つのインスタンスの1つのイベントに対して複数存在してもよく、それらは順番に呼び出される。この特徴は、単純に考えれば意味がないように思えるかもしれない。だが、継承を多用していると、異なるクラスから同じイベントを扱いたい場合が出てくることがある。そのような場合に意味が出てくるだろう。
複数のイベントを1つのイベント・ハンドラで処理する
1つのイベントから複数のイベント・ハンドラを呼び出せることを示したが、逆もできる。つまり、複数のイベントのどれが発生しても、1つのイベント・ハンドラを呼び出すようにすることができる。
まず、以下のようにフォームにボタンを3個貼り付ける。
|
VB.NETでWindowsアプリケーションを新規作成し、フォームにボタンを3個貼り付ける(コードはサンプル・プログラム2) |
そして、以下のようにプログラム・コードを編集する。
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
|
|
1つのイベント・ハンドラで3つボタンを処理するサンプル・プログラム2 |
これを実行すると以下のようになる。
|
サンプル・プログラム2の実行結果 |
ここでどのボタンを押しても、以下のメッセージ・ボックスが表示される。
|
サンプル・プログラム2の実行結果で、どのボタンを押しても表示されるメッセージ・ボックス |
ここで注目すべきことは、6行目のHandlesキーワードの後に複数のイベントが列挙されていることである。1つのイベント・ハンドラのメソッドには、複数のイベントを対応させることができる。
Insider.NET 記事ランキング
本日
月間