イベント (Visual Basic)Events (Visual Basic)

Visual Studio プロジェクトは、シーケンス内で実行される一連の手順として視覚化することができますが、実際には、ほとんどのプログラムはイベントドリブンであるということです。つまり、実行フローは、イベントと呼ばれる外部オカレンスによって決定されます。While you might visualize a Visual Studio project as a series of procedures that execute in a sequence, in reality, most programs are event driven—meaning the flow of execution is determined by external occurrences called events.

イベントは、何らかの重要な出来事が発生したことをアプリケーションに通知するシグナルです。An event is a signal that informs an application that something important has occurred. たとえば、ユーザーがフォーム上のコントロールをクリックすると、フォームは、Click イベントを発生させて、そのイベントを処理するプロシージャを呼び出すことができます。For example, when a user clicks a control on a form, the form can raise a Click event and call a procedure that handles the event. イベントは、複数のタスク間の通信を可能にすることもできます。Events also allow separate tasks to communicate. たとえば、メインのアプリケーションとは別のアプリケーションで並べ替えタスクを実行するとします。Say, for example, that your application performs a sort task separately from the main application. ユーザーが並べ替えを取り消した場合、アプリケーションは並べ替え処理の停止を指示するキャンセル イベントを送信できます。If a user cancels the sort, your application can send a cancel event instructing the sort process to stop.

イベントの用語と概念Event Terms and Concepts

ここでは、Visual Basic のイベントで使用される用語と概念について説明します。This section describes the terms and concepts used with events in Visual Basic.

イベントの宣言Declaring Events

イベントは、次の例に示すように、Event キーワードを使用して、クラス、構造体、モジュール、およびインターフェイス内で宣言します。You declare events within classes, structures, modules, and interfaces using the Event keyword, as in the following example:

Event AnEvent(ByVal EventNumber As Integer)

イベントの発生Raising Events

イベントは、重要な出来事が発生したことを通知するメッセージに似ています。An event is like a message announcing that something important has occurred. メッセージをブロードキャストする動作は、"イベントの発生" と呼ばれます。The act of broadcasting the message is called raising the event. Visual Basic では、次の例にRaiseEvent示すように、ステートメントを使用してイベントを発生させます。In Visual Basic, you raise events with the RaiseEvent statement, as in the following example:

RaiseEvent AnEvent(EventNumber)

イベントは、イベントを宣言しているクラス、モジュール、または構造体のスコープ内で発生させる必要があります。Events must be raised within the scope of the class, module, or structure where they are declared. たとえば、基本クラスから継承された派生クラスでイベントを発生させることはできません。For example, a derived class cannot raise events inherited from a base class.

イベントの送信元Event Senders

イベントを発生させる機能を持つオブジェクトが "イベントの送信元" になります。これは "イベント ソース" とも呼ばれます。Any object capable of raising an event is an event sender, also known as an event source. イベントの送信元の例として、フォーム、コントロール、およびユーザー定義オブジェクトがあります。Forms, controls, and user-defined objects are examples of event senders.

イベント ハンドラーEvent Handlers

"イベント ハンドラー" は、対応するイベントが発生したときに呼び出されるプロシージャです。Event handlers are procedures that are called when a corresponding event occurs. イベント ハンドラーと一致するシグネチャを持つ任意の有効なサブルーチンを使用できます。You can use any valid subroutine with a matching signature as an event handler. ただし、関数はイベント ソースに値を返すことができないため、イベント ハンドラーとして使用することはできません。You cannot use a function as an event handler, however, because it cannot return a value to the event source.

Visual Basic は、イベントの送信元の名前、アンダースコア、およびイベントの名前を組み合わせたイベントハンドラーに、標準的な名前付け規則を使用します。Visual Basic uses a standard naming convention for event handlers that combines the name of the event sender, an underscore, and the name of the event. たとえば、button1 という名前のボタンの Click イベントには、Sub button1_Click という名前が付けられます。For example, the Click event of a button named button1 would be named Sub button1_Click.

注意

独自のイベントに対するイベント ハンドラーを定義するときは、この名前付け規則を使用することをお勧めしますが、使用は必須ではありません。任意の有効なサブルーチン名を付けることができます。We recommend that you use this naming convention when defining event handlers for your own events, but it is not required; you can use any valid subroutine name.

イベントとイベント ハンドラーの関連付けAssociating Events with Event Handlers

イベント ハンドラーを使用する前に、Handles ステートメントまたは AddHandler ステートメントを使用して、イベントをイベント ハンドラーに関連付けておく必要があります。Before an event handler becomes usable, you must first associate it with an event by using either the Handles or AddHandler statement.

WithEvents と Handles 句WithEvents and the Handles Clause

WithEvents ステートメントと Handles 句を使用して、指定するイベント ハンドラーを宣言できます。The WithEvents statement and Handles clause provide a declarative way of specifying event handlers. WithEvents キーワードを使用して宣言されたオブジェクトによって発生したイベントは、次の例に示すように、そのイベント用の Handles ステートメントがある任意のプロシージャで処理できます。An event raised by an object declared with the WithEvents keyword can be handled by any procedure with a Handles statement for that event, as shown in the following example:

' 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 句を使用することです。これは、宣言型の構文により簡単にコーディング、読み取り、デバッグを実行できるためです。The WithEvents statement and the Handles clause are often the best choice for event handlers because the declarative syntax they use makes event handling easier to code, read and debug. ただし、WithEvents 変数には、次の使用制限があることに注意してください。However, be aware of the following limitations on the use of WithEvents variables:

  • WithEvents 変数をオブジェクト変数として使用することはできません。You cannot use a WithEvents variable as an object variable. つまり、Object として宣言することはできません。変数を宣言するときは、クラス名を指定する必要があります。That is, you cannot declare it as Object—you must specify the class name when you declare the variable.

  • 共有イベントはクラスインスタンスに関連付けられていないWithEventsため、を使用して共有イベントを宣言によって処理することはできません。Because shared events are not tied to class instances, you cannot use WithEvents to declaratively handle shared events. 同様に、WithEvents またはHandles を使用して Structure からイベントを処理することはできません。Similarly, you cannot use WithEvents or Handles to handle events from a Structure. どちらの場合も、AddHandler ステートメント使用して、これらのイベントを処理することができます。In both cases, you can use the AddHandler statement to handle those events.

  • WithEvents 変数の配列を作成することはできません。You cannot create arrays of WithEvents variables.

WithEvents 変数を使用して、1 つのイベント ハンドラーで 1 つまたは複数の種類のイベントを、または 1 つまたは複数のイベント ハンドラーで同じ種類のイベントを処理することができます。WithEvents variables allow a single event handler to handle one or more kind of event, or one or more event handlers to handle the same kind of event.

Handles 句は、イベントをイベント ハンドラーに関連付けるための標準的な方法ですが、イベントをイベント ハンドラーに関連付ける動作はコンパイル時に限定されます。Although the Handles clause is the standard way of associating an event with an event handler, it is limited to associating events with event handlers at compile time.

フォームやコントロールに関連付けられたイベントなど、場合によっては、Visual Basic 自動的に空のイベントハンドラーをスタブアウトし、イベントに関連付けます。In some cases, such as with events associated with forms or controls, Visual Basic automatically stubs out an empty event handler and associates it with an event. たとえば、デザインモードでフォームのコマンドボタンをダブルクリックすると、次のコードに示すように、Visual Basic によっWithEventsて、空のイベントハンドラーとコマンドボタンの変数が作成されます。For example, when you double-click a command button on a form in design mode, Visual Basic creates an empty event handler and a WithEvents variable for the command button, as in the following code:

Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub

AddHandler と RemoveHandlerAddHandler and RemoveHandler

AddHandler ステートメントは、イベント ハンドラーを指定できるという点で Handles 句に似ています。The AddHandler statement is similar to the Handles clause in that both allow you to specify an event handler. ただし、AddHandlerRemoveHandler と一緒に使用すると、Handles 句よりも柔軟性が増し、イベントに関連付けられたイベント ハンドラーを動的に追加、削除、変更することができます。However, AddHandler, used with RemoveHandler, provides greater flexibility than the Handles clause, allowing you to dynamically add, remove, and change the event handler associated with an event. 共有イベントまたは構造体からのイベントを処理する場合は、AddHandler を使用する必要があります。If you want to handle shared events or events from a structure, you must use AddHandler.

AddHandler は 2 つの引数 (コントロールなどのイベントの送信元から渡されるイベント名と、デリゲートを評価する式) を使用します。AddHandler takes two arguments: the name of an event from an event sender such as a control, and an expression that evaluates to a delegate. AddHandler を使用する場合はデリゲート クラスを明示的に指定する必要がありません。これは、AddressOf ステートメントが常にデリゲートへの参照を返すためです。You do not need to explicitly specify the delegate class when using AddHandler, since the AddressOf statement always returns a reference to the delegate. 次の例では、オブジェクトによって発生するイベントにイベント ハンドラーを関連付けます。The following example associates an event handler with an event raised by an object:

AddHandler Obj.XEvent, AddressOf Me.XEventHandler

イベントとイベント ハンドラーと関連付けを解除する RemoveHandler は、AddHandler と同じ構文を使用します。RemoveHandler, which disconnects an event from an event handler, uses the same syntax as AddHandler. 例:For example:

RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler

次の例では、イベントにイベント ハンドラーが関連付けられた後、イベントが発生します。In the following example, an event handler is associated with an event, and the event is raised. イベント ハンドラーがイベントをキャッチし、メッセージを表示します。The event handler catches the event and displays a message.

次に、最初のイベント ハンドラーが削除され、別のイベント ハンドラーがイベントに関連付けられます。Then the first event handler is removed and a different event handler is associated with the event. もう一度イベントが発生し、別のメッセージが表示されます。When the event is raised again, a different message is displayed.

最後に、2 つ目のイベント ハンドラーが削除され、3 回目のイベントが発生します。Finally, the second event handler is removed and the event is raised for a third time. イベントに関連付けられているイベント ハンドラーがないため、何も実行されません。Because there is no longer an event handler associated with the event, no action is taken.

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

基本クラスから継承されたイベントの処理Handling Events Inherited from a Base Class

"派生クラス" は基本クラスから特性を継承したクラスであり、基本クラスによって発生したイベントを Handles MyBase ステートメントを使用して処理できます。Derived classes—classes that inherit characteristics from a base class—can handle events raised by their base class using the Handles MyBase statement.

基本クラスのイベントを処理するにはTo handle events from a base class

  • イベント ハンドラー プロシージャの宣言行に Handles MyBase.eventname ステートメントを追加して、派生クラスのイベント ハンドラーを宣言します。eventname は処理する基本クラスのイベント名です。Declare an event handler in the derived class by adding a Handles MyBase.eventname statement to the declaration line of your event-handler procedure, where eventname is the name of the event in the base class you are handling. 例:For example:

    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
    
タイトルTitle 説明Description
チュートリアル: イベントの宣言と発生Walkthrough: Declaring and Raising Events クラスのイベントを宣言して発生させる方法を手順を追って説明します。Provides a step-by-step description of how to declare and raise events for a class.
チュートリアル: イベントの処理Walkthrough: Handling Events イベント ハンドラー プロシージャの記述方法を示します。Demonstrates how to write an event-handler procedure.
方法: カスタムイベントを宣言してブロックを回避するHow to: Declare Custom Events To Avoid Blocking イベント ハンドラーを非同期に呼び出すことができるカスタム イベントの定義方法を示します。Demonstrates how to define a custom event that allows its event handlers to be called asynchronously.
方法: カスタム イベントを宣言してメモリを節約するHow to: Declare Custom Events To Conserve Memory イベントを処理するときにのみ、メモリを使用するカスタム イベントを定義する方法を示します。Demonstrates how to define a custom event that uses memory only when the event is handled.
Visual Basic での継承されたイベント ハンドラーのトラブルシューティングTroubleshooting Inherited Event Handlers in Visual Basic 継承されたコンポーネントのイベント ハンドラーで生じる一般的な問題を一覧表示します。Lists common issues that arise with event handlers in inherited components.
イベントEvents .NET Framework のイベント モデルについて概説します。Provides an overview of the event model in the .NET Framework.
Windows フォーム内でのイベント ハンドラーの作成Creating Event Handlers in Windows Forms Windows フォーム オブジェクトに関連付けられているイベントの処理方法について説明します。Describes how to work with events associated with Windows Forms objects.
デリゲートDelegates Visual Basic でのデリゲートの概要を示します。Provides an overview of delegates in Visual Basic.