シーケンスで実行される一連のプロシージャとして 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
句に似ています。 ただし、RemoveHandler
で使用されるAddHandler
は、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
関連セクション
タイトル | 説明 |
---|---|
チュートリアル: イベントの宣言と発生 | クラスのイベントを宣言および発生させる方法の詳細な説明を提供します。 |
チュートリアル: イベントの処理 | イベント ハンドラー プロシージャを記述する方法を示します。 |
方法: ブロックを回避するためにカスタム イベントを宣言する | イベント ハンドラーを非同期的に呼び出すことを許可するカスタム イベントを定義する方法を示します。 |
方法: カスタム イベントを宣言してメモリを節約する | イベントが処理されたときにのみメモリを使用するカスタム イベントを定義する方法を示します。 |
Visual Basic での継承されたイベント ハンドラーのトラブルシューティング | 継承されたコンポーネントのイベント ハンドラーで発生する一般的な問題の一覧を示します。 |
イベント | .NET Framework のイベント モデルの概要について説明します。 |
Windows フォームでのイベント ハンドラーの作成 | Windows フォーム オブジェクトに関連付けられているイベントを操作する方法について説明します。 |
代表者 | Visual Basic のデリゲートの概要について説明します。 |
.NET