連載

改訂版 プロフェッショナルVB.NETプログラミング

Chapter 12 イベント

株式会社ピーデー 川俣 晶
2004/08/05
Page1 Page2 Page3


 本記事は、(株)技術評論社が発行する書籍『VB6プログラマーのための入門 Visual Basic .NET 独習講座』の一部分を許可を得て転載したものです。同書籍に関する詳しい情報については、本記事の最後に掲載しています。

 イベントは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つのイベントから複数のイベント・ハンドラを呼び出せることを示したが、逆もできる。つまり、複数のイベントのどれが発生しても、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つのイベント・ハンドラのメソッドには、複数のイベントを対応させることができる。


 INDEX
  [連載] 改訂版 プロフェッショナルVB.NETプログラミング
  Chapter 12 イベント
  1.イベントを処理する/複数のイベント・ハンドラ/複数のイベントを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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH