|
|
連載
改訂版
プロフェッショナルVB.NETプログラミング
Chapter 12 イベント
株式会社ピーデー
川俣 晶
2004/08/05 |
|
|
1つのイベント・ハンドラで複数のイベントを受け取る場合、イベント・ハンドラ内で発生源のコントロールを識別したい場合がある。その際には、イベント・ハンドラのメソッドの第1引数(ByVal sender As System.Object)を利用できる。この引数には、イベントの発生源となったコントロールのインスタンスへの参照が入っているので、これを調べれば、発生源を区別することも容易である。また区別できるだけでなく、そのインスタンスを操作することもできる。リスト12-11は、前節のサンプル・プログラム(リスト12-8)に、そのような機能を追加したものである。
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: If sender Is Button1 Then
8: MsgBox("Button1 Clicked!")
9: ElseIf sender Is Button2 Then
10: MsgBox("Button2 Clicked!")
11: ElseIf sender Is Button3 Then
12: MsgBox("Button3 Clicked!")
13: End If
14: Dim btn As Button = sender
15: btn.Text = "Clicked!"
16: End Sub
17: End Class
|
|
リスト12-11 押されたボタンのインスタンスを操作するプログラム
|
これを実行すると、図12-12のようなウィンドウが表示される。
|
●図12-12 リスト12-11の実行結果 |
ここで最も左のボタンを押すと、以下のメッセージ・ボックスが表示される。
|
●図12-13 リスト12-11の実行結果で、Button1ボタンを押した場合に表示されるメッセージ・ボックス |
メッセージ・ボックスを閉じると、ボタン上の文字列が変化する(図12-14)。
|
●図12-14 メッセージ・ボックスを閉じると、押したボタン上の文字列が変化する |
このソースのポイントは2つある。1つは、7行目などで見られるように、Ifステートメントで発生源のインスタンスがどれかを判定すること。これは、引数senderに発生源のインスタンスへの参照が入っていると分れば難しいことではないだろう。もう1つは、14〜15行目に見られるように、引数senderを適切なデータ型(ここではButtonクラス)に変換してから、Textプロパティにアクセスしていることである。このコードは、どのボタンが押された場合でも、押されたボタンのTextプロパティを書き換えることになる。
実際にVB.NETでイベントを扱い始めると、おや? と思うことに出会う。例えば、VB 6のMouseMoveイベントにはX As Single、Y As Singleといった、マウスポインタの位置などの引数が存在するのに、VB.NETでMouseMoveイベントのハンドラを作成しても、XやYという引数が見当たらないのである。
例えば、VB 6でマウスポインタの位置を利用するプログラムは、以下のようになる。まず、フォーム上にラベルを2つ貼り付けたあとで、次のようなコードを入力する。
1: Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
2: Label1.Caption = X & "," & Y
3: Label2.Caption = Button
4: End Sub
|
|
リスト12-14 マウスの座標とボタンの状態を表示するVB 6のプログラム(VB 6でフォームに2つのラベルを貼り付けておく必要あり)
|
これを実行すると以下のようになる。
|
●図12-15 リスト12-14の実行結果 |
上はマウスポインタの座標値、下がボタンの状況を示す数値である(「1」は左ボタンのみが押されている状態)。
では、これとほぼ同等のプログラムをVB.NETで作成してみよう。同じように、フォーム上にラベルを2つ貼り付けてから、以下のようにコードを編集する。
1: Public Class Form1
2: Inherits System.Windows.Forms.Form
3:
4: …Windows フォーム デザイナで生成されたコード…
5:
6: Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
7: Label1.Text = e.X & "," & e.Y
8: Label2.Text = e.Button.ToString()
9: End Sub
10: End Class
|
|
リスト12-16 リスト12-14と同等のVB.NETのプログラム(VB.NETでフォームに2つのラベルを貼り付けておく必要あり)
|
これを実行すると以下のようになる。
|
●図12-17 リスト12-16の実行結果 |
上はマウスポインタの座標値、下がボタンの状況を示す値である。座標系のデフォルトが異なっているので、数値はVB 6と桁が1つ違っている。ボタン値は、文字列に変換された状態で出力されており、VB 6のように数値ではない。
さて、プログラム・コードを見てみよう。ここでのポイントは、6行目のForm1_MouseMoveメソッドの第2引数である。イベント・ハンドラのメソッドの第2引数は、System.EventArgsクラス、またはそれを継承したクラスのみを指定することができる(継承については、継承とポリモーフィズムを参照)。特に、付加情報のないClickイベントなどは、基本となるSystem.EventArgsクラスにしておけば問題はない。だが、付加情報がある場合は、付加情報を含むクラスをSystem.EventArgsクラスを継承して作成し、引数として渡すことができる。例えばMouseMoveイベントの場合、そのようにして用意されたSystem.Windows.Forms.MouseEventArgsクラスがそれにあたる。このクラスは、System.EventArgsクラスを継承していて、イベント・ハンドラの第2引数に使用できると同時に、マウスイベントに固有の情報を表現する能力を持っている。ここでは、マウスポインタの座標値であるX、Yや、マウスボタンの状態を保持するButtonなどが使われている。
このような例から見て分かるとおり、イベント・ハンドラのメソッドは、どんなタイプのイベントであろうと、常に引数の数は2つである。もし、何か付加的な値が必要とされる場合は、第2引数のクラスを継承して拡張し、その中に入れて受け渡すようになっている。VB 6に慣れていると、引数に必要な値が見あたらず、焦ってしまうことがあるかもしれないが、このような仕様に変化しているので、慌てないように注意していただきたい。
業務アプリInsider 記事ランキング
本日
月間