お勉強します。今回はイベントとデリゲート。しかしなんとなくわかる程度に(ぉ
「イベントって?会場はどこ?」だったり「デリゲートって繊細なことぢゃね?」って感じの私のためにがんばります。
本来デリゲートを理解してからイベントの理解なのかもしれませんが、やっぱり身近なのはイベントですよね?なのでイベントからお勉強していきます。
「イベントってたとえば何?」って聞かれると、Button クラスの Click イベントが頭に浮かびます。以下のようなコードはドコかしらで見かけたことがあります。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
End Sub
ボタンがクリックされたというイベントが発生した時に実行するコードを記述するというわけですね。
ではまず上記のコードの理解から・・・て、ノン!ノン!じゃにーさんもきっとこう言うと思います。
「ユー、イベントの流れ的にやっちゃいなよ。」
それもそうですね、発生した後のことからやるってのは順番がおかしいです。イベントってのがどっかにあってそれが発生して~って感じですもん。
というわけで、イベントの流れに沿っていきます。
ではでは、イベントの宣言から逝きます。イベントがないと話が進みませんもんね。ネタとして以下のようなクラスを用意しますた。
Option Compare Binary
Option Explicit On
Option Strict On
Imports System
Public Class WankumaMember
Private _displayName As String
Public Property DisplayName() As String
Get
Return Me._displayName
End Get
Set(ByVal value As String)
Me._displayName = value
End Set
End Property
End Class
わんくまはIDは固定ですが、ブログなどに表示する名前は任意ですよね。なので、DisplayName プロパティは変更可能にしています。
さて、このDisplayName プロパティが変更されたときにイベントを発生して「変更されたよ~。」って通知することを目指します。
イベントを宣言するには Event ステートメント を使用します。
イベントの宣言方法にはいくつかあります。デリゲートの時にこのあたりは再度書くことになりそうですが、今回は一番見た目がシンプルな形の以下の記述を使用します。DisplayName プロパティが変更されたときに発生させるイベントを DisplayNameChanged イベントとすると、たとえば以下のようになります。
Public Event DisplayNameChanged(ByVal sender As Object, ByVal e As EventArgs)
イベントの発生元を伝えるための sender と、イベント データを格納する e という引数のシグニチャを持ったDisplayNameChanged イベントです。ちなみにVisual Basicでは、イベントに戻り値、省略可能な引数、引数 ParamArray を指定できません。
ふぅ、これでイベントの宣言は終わりです。
あとはこのイベントを発生させられればOKですね。
イベントの発生には RaiseEvent ステートメントを使用します。今回は余計な事は考えないようにするためにDisplayName プロパティに対して値が設定されたら常に変更されたと考えることにし、イベントの発生もプロパティ内で行うことにします。RaiseEvent ステートメントを使用してイベントを発生させるように変更したDisplayName プロパティは以下のようになります。
Public Property DisplayName() As String
Get
Return Me._displayName
End Get
Set(ByVal value As String)
Me._displayName = value
RaiseEvent DisplayNameChanged(Me, New EventArgs)
End Set
End Property
DisplayNameChanged イベント のシグニチャに従い、sender には自身のインスタンスを、e にはデータを持たない 新しい EventArgs クラスを設定しています。
これらの記述を加えた WankumaMember クラスは以下のようになります。
Option Compare Binary
Option Explicit On
Option Strict On
Imports System
Public Class WankumaMember
Public Event DisplayNameChanged(ByVal sender As Object, ByVal e As EventArgs)
Private _displayName As String
Public Property DisplayName() As String
Get
Return _displayName
End Get
Set(ByVal value As String)
_displayName = value
RaiseEvent DisplayNameChanged(Me, New EventArgs)
End Set
End Property
End Class
さて、これで ごくごく簡単な DisplayNameChanged イベントの宣言と発生は終わりです。次回はこのイベントによる通知を受け取る方法についてお勉強する予定です。