次の方法で共有


イベント (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句に似ています。 ただし、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 のデリゲートの概要について説明します。