方法 : イベント ハンドラを記述する
更新 : 2007 年 11 月
イベント ハンドラの生成方法は、そのイベント ハンドラをイベントにどのように関連付けるかによって決定されます。標準の方法でイベント ハンドラを作成するには、Handles キーワードと WithEvents キーワードを使用しますが、Visual Basic でイベントを処理する場合は AddHandler ステートメントを使うというもう 1 つの方法も選択できます。AddHandler と RemoveHandler を使うと、特定のイベントに対するイベント処理を動的に開始および停止できます。どちらのキーワードを使用してもかまいませんが、同じイベントに WithEvents と AddHandler の両方を使用することはできません。
WithEvents を使用したイベントの処理
WithEvents キーワードを使用すると、イベント ハンドラの Handles 句で使用できるクラス レベルまたはモジュール レベルのオブジェクト変数を作成できます。
WithEvents と Handles 句を使用してイベントを処理するには
イベントを含む単純なクラスを作成します。
Class Class1 Public Event AnEvent(ByVal EventNumber As Integer) End Class
イベントを処理するクラスまたはモジュールで、次の例に示すように WithEvents キーワードを使用してイベントのソースのオブジェクト変数を宣言します。
Public WithEvents ClassInst As Class1
コード エディタで、左側の [クラス名] メニューから宣言した WithEvents 変数を選択します。
右側の [メソッド名] メニューから処理するイベントを選択します。コード エディタは Handles 句を持つ空のイベント ハンドラ プロシージャを作成します。
メモ : この手順は省略できます。作成するプロシージャがサブルーチンであり、処理されるイベントと一致する適切な引数リストおよび処理されるイベントを指定する Handles 句があれば、イベント ハンドラ プロシージャを手動で作成できます。
指定された引数を使用して、イベント処理コードをイベント ハンドラ プロシージャに追加します。次に例を示します。
Public Sub ClassInst_AnEvent(ByVal EventNumber As Integer) _ Handles ClassInst.AnEvent MsgBox("Received event number: " & CStr(EventNumber)) End Sub
AddHandler を使用したイベントの処理
AddHandler ステートメントを使用すると、イベントとイベント ハンドラ プロシージャを動的に接続できます。
AddHandler を使用してイベントを処理するには
イベントを処理するサブルーチンを、次の例のように作成します。
Public Sub EHandler(ByVal EventNumber As Integer) MsgBox("Received event number " & CStr(EventNumber)) End Sub
処理するイベントのソースであるクラスのオブジェクト変数を宣言します。WithEvents 変数とは異なり、このオブジェクト変数はプロシージャ内のローカル変数にできます。たとえば、次のようにします。
Public Sub TestAddHandler() Dim CI As New Class1 End Sub
AddHandler ステートメントを使用してイベント センダの名前を指定し、AddressOf ステートメントを使用してイベント ハンドラの名前を指定します。たとえば、TestAddHandler サブルーチンの末尾に、次のコードを追加します。
AddHandler CI.AnEvent, AddressOf EHandler
処理されるイベントに対して適切な引数をサポートしていれば、すべてのプロシージャがイベント ハンドラとして機能できます。
RemoveHandler を使用したイベントの処理の停止
RemoveHandler ステートメントを使用すると、イベント ハンドラ プロシージャからイベントの接続を動的に解除できます。
RemoveHandler を使用してイベントの処理を停止するには
RemoveHandler ステートメントを使用してイベント センダの名前を指定し、AddressOf ステートメントを使用してイベント ハンドラの名前を指定します。RemoveHandler ステートメントの構文は、イベント処理の開始に使用する AddHandler ステートメントと常に厳密に対応します。次に例を示します。
RemoveHandler CI.AnEvent, AddressOf EHandler
基本クラスから継承されたイベントの処理
派生クラスは基本クラスから特性を継承したクラスであり、HandlesMyBase ステートメントを使用して基本クラスが発生させたイベントを処理できます。
基本クラスから継承されたイベントを処理するには
イベント ハンドラ プロシージャの宣言の行に Handles MyBase.eventname ステートメントを追加して、派生クラスにイベント ハンドラを宣言します。eventname は処理する基本クラスのイベント名です。次に例を示します。
Public Class BaseClass Public Event BaseEvent(ByVal i As Integer) ' Place methods and properties here. End Class Public Class DerivedClass Inherits BaseClass Sub EventHandler(ByVal x As Integer) Handles MyBase.BaseEvent ' Place code to handle events from BaseClass here. End Sub End Class