イベント (Visual Basic)
一連のプロシージャが順番に実行されるのが Visual Studio プロジェクトであると思っているかもしれませんが、実際には、ほとんどのプログラムはイベントによって駆動されています。つまり、実行の流れを決定するのは、イベントと呼ばれる外部の事象です。
イベントは重要な出来事が発生したことをアプリケーションに伝えるシグナルです。 たとえば、ユーザーがフォームのコントロールをクリックすると、フォームは Click イベントを発生させてイベントを処理するプロシージャを呼び出すことができます。 イベントは、個別のタスクの通信も確立できます。 たとえば、アプリケーションが、並べ替えタスクをメイン アプリケーションとは別に実行するとします。 ユーザーが並べ替えを取り消した場合、アプリケーションは並べ替えプロセスに停止を指示するキャンセル イベントを送信できます。
イベントの用語と概念
ここでは、Visual Basic のイベントに関連して使用される用語と概念について説明します。
イベントの宣言
次の例に示すように、イベントはクラス、構造体、モジュール、およびインターフェイス内で Event キーワードを使用して宣言します。
Event AnEvent(ByVal EventNumber As Integer)
イベントの発生
イベントは、重要な出来事が発生したことを通知するメッセージと同じです。 メッセージのブロードキャストの動作は、イベントの発生と呼ばれます。 Visual Basic では、次の例に示すように RaiseEvent ステートメントを使用してイベントを発生させます。
RaiseEvent AnEvent(EventNumber)
イベントが発生する範囲は、イベントを宣言したクラス、モジュール、または構造体の内部に限られます。 たとえば、派生クラスで基本クラスから継承したイベントを発生させることはできません。
イベント センダー
イベントを発生させる機能を持つオブジェクトがイベント センダーです。イベント ソースとも呼ばれます。 フォーム、コントロール、およびユーザー定義オブジェクトは、イベント センダーの例です。
イベント ハンドラー
イベント ハンドラーは、対応するイベントが発生したときに呼び出されるプロシージャです。 シグネチャの一致する任意の有効なサブルーチンをイベント ハンドラーとして使用できます。 ただし、イベント ハンドラーはイベント ソースに値を返すことができないため、関数をイベント ハンドラーとして使用することはできません。
Visual Basic は、イベント ハンドラーに対して、イベント送信元の名前、アンダースコア、およびイベント名を組み合わせた標準名前付け規則を使用します。 たとえば、button1 という名前のボタンの Click イベントは Sub button1_Click という名前になります。
注意
独自のイベントのイベント ハンドラーを定義する場合は、この名前付け規則を使用することをお勧めしますが、名前付け規則の使用は必須ではありません。任意の有効なサブルーチン名を使用できます。
イベントとイベント ハンドラーの関連付け
イベント ハンドラーを使用できるようにするには、Handles ステートメントまたは AddHandler ステートメントを使用してイベント ハンドラーをイベントに関連付ける必要があります。
WithEvents と Handles 句
WithEvents ステートメントと Handles 句を使用すると、イベント ハンドラーの指定を宣言できます。 WithEvents キーワードで宣言されたオブジェクトが発生させたイベントは、次の例に示すように、そのイベントの Handles ステートメントを持つ任意のプロシージャで処理できます。
' Declare a WithEvents variable.
Dim WithEvents EClass As New EventClass
' Call the method that raises the object's events.
Sub TestEvents()
EClass.RaiseEvents()
End Sub
' Declare an event handler that handles multiple events.
Sub EClass_EventHandler() Handles EClass.XEvent, EClass.YEvent
MsgBox("Received Event.")
End Sub
Class EventClass
Public Event XEvent()
Public Event YEvent()
' RaiseEvents raises both events.
Sub RaiseEvents()
RaiseEvent XEvent()
RaiseEvent YEvent()
End Sub
End Class
多くの場合、イベント ハンドラーに最も適しているのは WithEvents ステートメントと Handles 句です。これは、それらが使用する宣言構文によってイベント処理のコーディング、読み取り、およびデバッグが簡単になるためです。 ただし、WithEvents 変数の使用には以下の制限があります。
WithEvents 変数を、オブジェクト変数として使用することはできません。 つまり、この変数をオブジェクト型 (Object) として宣言することはできません。変数を宣言するときは、クラス名を指定する必要があります。
共有イベントはクラスのインスタンスに関連付けられないため、WithEvents を使用して、共有イベントを宣言によって処理することはできません。 同様に、WithEvents または Handles を使用して、イベントを Structure から処理することもできません。 どちらの場合にも、AddHandler ステートメントを使ってそれらのイベントを処理するようにしてください。
WithEvents 変数の配列は作成できません。
WithEvents 変数では、1 つのイベント ハンドラーが 1 つ以上の種類のイベント、または 1 つ以上のイベント ハンドラーが同じ種類のイベントを処理することも可能です。
Handles 句はイベントをイベント ハンドラーに関連付ける標準的な方法ですが、関連付けができるのはコンパイル時だけです。
フォームやコントロールに関連付けられているイベントの場合、Visual Basic が空のイベント ハンドラーを自動的にスタブとして作成し、それをイベントに関連付けることがあります。 たとえば、デザイン モードでフォームのコマンド ボタンをダブルクリックすると、次のコードに示すように、Visual Basic はコマンド ボタンに対して空のイベント ハンドラーと WithEvents 変数を作成します。
Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub
AddHandler と RemoveHandler
AddHandler ステートメントは、イベント ハンドラーを指定できるという点で Handles 句と似ています。 ただし、AddHandler を RemoveHandler と一緒に使用すると、Handles 句よりも柔軟性が増し、イベントに関連付けられたイベント ハンドラーを動的に追加、削除、変更できます。 共有イベントまたは構造体からのイベントを処理する場合は、AddHandler を使用する必要があります。
AddHandler は 2 つの引数 (コントロールなどのイベント センダーから渡されるイベント名およびデリゲートを評価する式) を使用します。 AddressOf ステートメントは常にデリゲートへの参照を返すため、AddHandler を使用する場合はデリゲート クラスを明示的に指定する必要がありません。 オブジェクトが発生させたイベントにイベント ハンドラーを関連付ける方法を次の例に示します。
AddHandler Obj.XEvent, AddressOf Me.XEventHandler
イベント ハンドラーとイベントの接続を解除する RemoveHandler では、AddHandler と同じ構文を使用します。 次に例を示します。
RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler
次の例では、イベントにイベント ハンドラーが関連付けられた状態でイベントが発生しています。 このイベント ハンドラーによりイベントがキャッチされ、メッセージが表示されます。
その後、最初のイベント ハンドラーが削除され、イベントに別のイベント ハンドラーが関連付けられています。 もう一度イベントが発生すると、別のメッセージが表示されます。
最後に、2 つ目のイベント ハンドラーが削除され、3 回目のイベントが発生しています。 イベントにはもうイベント ハンドラーが関連付けられていないので、処理は実行されません。
Module Module1
Sub Main()
Dim c1 As New Class1
' Associate an event handler with an event.
AddHandler c1.AnEvent, AddressOf EventHandler1
' Call a method to raise the event.
c1.CauseTheEvent()
' Stop handling the event.
RemoveHandler c1.AnEvent, AddressOf EventHandler1
' Now associate a different event handler with the event.
AddHandler c1.AnEvent, AddressOf EventHandler2
' Call a method to raise the event.
c1.CauseTheEvent()
' Stop handling the event.
RemoveHandler c1.AnEvent, AddressOf EventHandler2
' This event will not be handled.
c1.CauseTheEvent()
End Sub
Sub EventHandler1()
' Handle the event.
MsgBox("EventHandler1 caught event.")
End Sub
Sub EventHandler2()
' Handle the event.
MsgBox("EventHandler2 caught event.")
End Sub
Public Class Class1
' Declare an event.
Public Event AnEvent()
Sub CauseTheEvent()
' Raise an event.
RaiseEvent AnEvent()
End Sub
End Class
End Module
基本クラスから継承されたイベントの処理
派生クラスは基本クラスから特性を継承したクラスであり、Handles MyBase ステートメントを使用して基本クラスが発生させたイベントを処理できます。
基本クラスから継承されたイベントを処理するには
イベント ハンドラー プロシージャの宣言の行に 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
関連項目
タイトル |
説明 |
---|---|
クラスのイベントを宣言して発生させる方法を操作手順に従って説明します。 |
|
イベント ハンドラー プロシージャの記述方法を示します。 |
|
イベント ハンドラーを非同期に呼び出すことができるカスタム イベントの定義方法を示します。 |
|
イベントを処理するときにだけメモリを消費するカスタム イベントの定義方法を示します。 |
|
継承コンポーネントのイベント ハンドラーで発生する一般的な問題について説明します。 |
|
.NET Framework のイベント モデルについて概説します。 |
|
Windows フォーム オブジェクトに関連付けられているイベントの処理方法について説明します。 |
|
Visual Basic のデリゲートの概要について説明します。 |