連載

プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――

第25回 イベントとイベント・ハンドラ

(株)ピーデー
川俣 晶
2002/11/16

Page1 Page2 Page3

イベントを処理する

 今回は、前回の冒頭でも少し触れた、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つのイベント・ハンドラのメソッドには、複数のイベントを対応させることができる。


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第25回 イベントとイベント・ハンドラ
  1.イベントを処理する
    2.イベントの発生源を識別する
    3.自家製のイベント
 
「プロフェッショナルVB.NETプログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間