Visual Basic でなんとなくイベントとデリゲート その1。 - イベントの宣言と発生 -
さて、前回は簡単なイベントの宣言と発生方法をお勉強しました。
前回の文章がなんだかしっくりこないなぁと思っていたら、どうも全体的にボケが少ないですね。気をつけないといけません。
※ まずは基本的なところから大雑把に進めてます。
前回はイベントの宣言と発生について書きました。今回はイベント ハンドラです。イベント ハンドラとはイベントに関連付けられ、イベントが発生したときに呼び出されるプロシージャです。イベントのシグネチャと一致する任意の有効なプロシージャをイベント ハンドラとして使用できます。
Visual Basic ではイベントハンドラとして2つの記述方法があります。まずは一つ目。WithEvent ステートメント と Handles 句を使用する方法です。先にコードを挙げますね。こんな感じ↓。
Option Compare Binary
Option Explicit On
Option Strict On
Imports System
Public Class EventSample1
Private WithEvents member As New WankumaMember
Private Sub member_DisplayNameChanged(ByVal sender As Object, ByVal e As EventArgs) Handles member.DisplayNameChanged
End Sub
End Class
WithEvent ステートメントを使用して宣言した変数が発生させるイベントに対するイベント ハンドラの指定を、Handles 句を使用して宣言できます。
ただし、Handles 句によるイベントハンドラの指定はコンパイル時にのみ関連付けが可能です。つまり、実行時にHandles 句を使用してイベントにイベントハンドラを関連付けることはできません。
また、共有(Shared)イベントやStructure のイベントを処理することはできません。
・・・あ、あれ?
ぼ、ぼけるとこがない!!orz
くじけずに2つ目。AddHandler ステートメントを使用する方法です。
Option Compare Binary
Option Explicit On
Option Strict On
Imports System
Public Class EventSample2
Private member As New WankumaMember
Public Sub New()
AddHandler member.DisplayNameChanged, AddressOf Me.member_DisplayNameChanged
End Sub
Private Sub member_DisplayNameChanged(ByVal sender As Object, ByVal e As System.EventArgs)
End Sub
End Class
こんな感じです。今回は、AddHandler ステートメントで、イベント ハンドラを関連付けたいイベントと、AddressOf キーワードを使用してイベント ハンドラとするプロシージャを指定しています。
AddHandler ステートメントを使用すると、イベントに対するイベント ハンドラの指定を実行時に動的に行うことができます。
・・・あ、あれ?
や、やっぱり ぼけるとこがない!!orz
なお、イベント ハンドラの関連付けを削除する場合、RemoveHandler ステートメントを使用します。
RemoveHandler member.DisplayNameChanged, AddressOf Me.member_DisplayNameChanged
Handles 句を使用して関連付けたイベントもAddHandler ステートメントを使用して関連付けたイベントも削除可能です。
・・・ぼける・・・とこ・・・な・・・い。
次回はどっかんどっかんいきますから!(こんくらいで勘弁してやるわぁ~!!
次回もう少しだけイベントについて補足的に(命名など)書いておいて、その次くらいで一旦デリゲートの話にいく予定です。