Event ステートメントEvent Statement

ユーザー定義イベントを宣言します。Declares a user-defined event.


[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname[(parameterlist)] _  
[ Implements implementslist ]  
' -or-  
[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname As delegatename _  
[ Implements implementslist ]  
' -or-  
 [ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Custom Event eventname As delegatename _  
[ Implements implementslist ]  
   [ <attrlist> ] AddHandler(ByVal value As delegatename)  
      [ statements ]  
   End AddHandler  
   [ <attrlist> ] RemoveHandler(ByVal value As delegatename)  
      [ statements ]  
   End RemoveHandler  
   [ <attrlist> ] RaiseEvent(delegatesignature)  
      [ statements ]  
   End RaiseEvent  
End Event  


パーツPart 説明Description
attrlist 任意。Optional. このイベントに適用される属性の一覧です。List of attributes that apply to this event. 複数の属性を指定するときは、コンマで区切ります。Multiple attributes are separated by commas. 属性リストは山かっこ ("<" および ">") で囲む必要があります。You must enclose the Attribute List in angle brackets ("<" and ">").
accessmodifier 任意。Optional. どのようなコードからイベントにアクセスできるのかを指定します。Specifies what code can access the event. 次のいずれかの値を指定します。Can be one of the following:

- Public - それを宣言している要素にアクセス可能なすべてのコードから、それにアクセスできます。- Public—any code that can access the element that declares it can access it.
- Protected - そのクラスまたは派生クラス内のコードからのみ、それにアクセスできます。- Protected—only code within its class or a derived class can access it.
- Friend - 同じアセンブリ内のコードからのみ、それにアクセスできます。- Friend—only code in the same assembly can access it.
- Private - それを宣言している要素内のコードからのみ、それにアクセスできます。- Private—only code in the element that declares it can access it.
- Protected Friend - イベントのクラス、派生クラス、または同じアセンブリ内のコードからのみ、それにアクセスできます。- Protected Friend-only code in the event's class, a derived class, or the same assembly can access it.
- Private Protected - 同じアセンブリ内のイベントのクラスまたは派生クラス内のコードからのみ、それにアクセスできます。- Private Protected-only code in the event's class or a derived class in the same assembly can access it.
Shared 任意。Optional. このイベントがクラスまたは構造体の特定のインスタンスに関連付けられないことを指定します。Specifies that this event is not associated with a specific instance of a class or structure.
Shadows 任意。Optional. このイベントが、基本クラスにある、同じ名前を持つプログラミング要素、またはオーバーロードされる要素のセットを宣言し直して隠ぺいすることを示します。Indicates that this event redeclares and hides an identically named programming element, or set of overloaded elements, in a base class. 宣言された要素は、他の任意の種類の要素でシャドウできます。You can shadow any kind of declared element with any other kind.

シャドウされた要素は、その要素をシャドウする派生クラスからは使用できません。ただし、シャドウする要素がアクセスできない要素の場合は例外です。A shadowed element is unavailable from within the derived class that shadows it, except from where the shadowing element is inaccessible. たとえば、Private 要素が基本クラスの要素をシャドウすると、Private 要素へのアクセス許可を持たないコードは、代わりに基本クラスにアクセスします。For example, if a Private element shadows a base-class element, code that does not have permission to access the Private element accesses the base-class element instead.
eventname 必須です。Required. イベントの名前です。変数の標準的な名前付け規則に従って名前を付けます。Name of the event; follows standard variable naming conventions.
parameterlist 任意。Optional. このイベントのパラメーターを表すローカル変数のリストです。List of local variables that represent the parameters of this event. パラメーター リストはかっこで囲む必要があります。You must enclose the Parameter List in parentheses.
Implements 任意。Optional. このイベントがインターフェイスのイベントを実装することを示します。Indicates that this event implements an event of an interface.
implementslist Implements を指定する場合は、必ず指定します。Required if Implements is supplied. 実装される Sub プロシージャのリストです。List of Sub procedures being implemented. 複数のプロシージャを指定するときは、コンマで区切ります。Multiple procedures are separated by commas:

implementedprocedure [ , implementedprocedure ... ]implementedprocedure [ , implementedprocedure ... ]

implementedprocedure の構文と指定項目は次のとおりです。Each implementedprocedure has the following syntax and parts:


- interface - 必須。- interface - Required. このプロシージャの包含クラスまたは包含構造体が実装しているインターフェイスの名前です。Name of an interface that this procedure's containing class or structure is implementing.
- Definedname - 必須。- Definedname - Required. interface の中でプロシージャを定義するために使用する名前。Name by which the procedure is defined in interface. これは、name (定義されているプロシージャを実装するためにこのプロシージャが使用している名前) と同じである必要はありません。This does not have to be the same as name, the name that this procedure is using to implement the defined procedure.
Custom 必須です。Required. Custom として宣言されたイベントでは、AddHandlerRemoveHandler、および RaiseEvent の各カスタム アクセサーを定義する必要があります。Events declared as Custom must define custom AddHandler, RemoveHandler, and RaiseEvent accessors.
delegatename 任意。Optional. イベント ハンドラーの署名を指定するデリゲートの名前。The name of a delegate that specifies the event-handler signature.
AddHandler 必須です。Required. AddHandler アクセサーを宣言します。ここでは、イベント ハンドラーが追加されたとき実行するステートメントを、AddHandler ステートメントを使って明示的に指定するか、Handles 句を使って暗黙的に指定します。Declares an AddHandler accessor, which specifies the statements to execute when an event handler is added, either explicitly by using the AddHandler statement or implicitly by using the Handles clause.
End AddHandler 必須です。Required. AddHandler ブロックを終了します。Terminates the AddHandler block.
value 必須です。Required. パラメーター名です。Parameter name.
RemoveHandler 必須です。Required. RemoveHandler アクセサーを宣言します。ここでは、イベント ハンドラーが削除されたときに実行するステートメントを、RemoveHandler ステートメントを使って指定します。Declares a RemoveHandler accessor, which specifies the statements to execute when an event handler is removed using the RemoveHandler statement.
End RemoveHandler 必須です。Required. RemoveHandler ブロックを終了します。Terminates the RemoveHandler block.
RaiseEvent 必須です。Required. RaiseEvent アクセサーを宣言します。ここでは、イベントが発生したときに実行するステートメントを、RaiseEvent ステートメントを使って指定します。Declares a RaiseEvent accessor, which specifies the statements to execute when the event is raised using the RaiseEvent statement. 通常は、AddHandler アクセサーと RemoveHandler アクセサーによって管理されるデリゲートのリストが呼び出されます。Typically, this invokes a list of delegates maintained by the AddHandler and RemoveHandler accessors.
End RaiseEvent 必須です。Required. RaiseEvent ブロックを終了します。Terminates the RaiseEvent block.
delegatesignature 必須です。Required. delegatename デリゲートに必要なパラメーターと一致するパラメーターのリストです。List of parameters that matches the parameters required by the delegatename delegate. パラメーター リストはかっこで囲む必要があります。You must enclose the Parameter List in parentheses.
statements 任意。Optional. AddHandlerRemoveHandler、および RaiseEvent の各メソッドの本体が含まれるステートメントです。Statements that contain the bodies of the AddHandler, RemoveHandler, and RaiseEvent methods.
End Event 必須です。Required. Event ブロックを終了します。Terminates the Event block.


宣言したイベントは、RaiseEvent ステートメントを使って発生させます。Once the event has been declared, use the RaiseEvent statement to raise the event. 通常、イベントの宣言と発生は、次のように行われます。A typical event might be declared and raised as shown in the following fragments:

Public Class EventSource
    ' Declare an event.
    Public Event LogonCompleted(ByVal UserName As String)
    Sub CauseEvent()
        ' Raise an event on successful logon.
        RaiseEvent LogonCompleted("AustinSteele")
    End Sub
End Class


イベントの引数は、プロシージャの引数と同様に宣言できます。ただし、イベントに対して名前付き引数、ParamArray 引数、または Optional 引数を指定することはできません。You can declare event arguments just as you do arguments of procedures, with the following exceptions: events cannot have named arguments, ParamArray arguments, or Optional arguments. イベントは値を返しません。Events do not have return values.

イベントを処理するためには、Handles ステートメントまたは AddHandler ステートメントを使用して、イベントをイベント ハンドラー サブルーチンに関連付ける必要があります。To handle an event, you must associate it with an event handler subroutine using either the Handles or AddHandler statement. サブルーチンとイベントの署名が一致する必要があります。The signatures of the subroutine and the event must match. 共有イベントを処理するには、AddHandler ステートメントを使う必要があります。To handle a shared event, you must use the AddHandler statement.

Event は、モジュール レベルでのみ使用できます。You can use Event only at module level. つまり、イベントの宣言コンテキストは、クラス、構造体、モジュール、またはインターフェイスである必要があり、ソース ファイル、名前空間、プロシージャ、ブロックでは宣言できません。This means the declaration context for an event must be a class, structure, module, or interface, and cannot be a source file, namespace, procedure, or block. 詳細については、「宣言コンテキストと既定のアクセス レベル」を参照してください。For more information, see Declaration Contexts and Default Access Levels.

ほとんどの状況で、このトピックの「構文」のセクションにある最初の構文を使ってイベントを宣言できますが、In most circumstances, you can use the first syntax in the Syntax section of this topic for declaring events. 一部のシナリオでは、イベントの動作をより詳細に制御することが必要になります。However, some scenarios require that you have more control over the detailed behavior of the event. このトピックの「構文」セクションの最後には、Custom キーワードを使用した構文があります。これを使用すると、カスタム イベントを定義してイベントを詳細に制御できます。The last syntax in the Syntax section of this topic, which uses the Custom keyword, provides that control by enabling you to define custom events. カスタム イベントでは、コードでイベント ハンドラーを追加または削除するときに、つまりコードでイベントを生成するときに、何が起こるかを正確に指定します。In a custom event, you specify exactly what occurs when code adds or removes an event handler to or from the event, or when code raises the event. たとえば、「方法:カスタム イベントを宣言してメモリを節約する」および「方法:カスタム イベントを宣言してブロックを回避する」を参照してください。For examples, see How to: Declare Custom Events To Conserve Memory and How to: Declare Custom Events To Avoid Blocking.


次の例では、イベントを使用して 10 秒から 0 秒までカウント ダウンします。The following example uses events to count down seconds from 10 to 0. このコードは、イベント関連のいくつかのメソッド、プロパティ、およびステートメントの例を示しています。The code illustrates several of the event-related methods, properties, and statements. RaiseEvent ステートメントの使用例も含まれています。This includes the RaiseEvent statement.

イベントを発生させるクラスをイベント ソース、イベントを処理するメソッドをイベント ハンドラーと呼びます。The class that raises an event is the event source, and the methods that process the event are the event handlers. イベント ソースでは、生成されるイベントに対して複数のイベント ハンドラーを設定できます。An event source can have multiple handlers for the events it generates. クラスでイベントが発生すると、そのイベントは、オブジェクトのインスタンスに対するイベントを処理するために選択されたすべてのクラスで発生します。When the class raises the event, that event is raised on every class that has elected to handle events for that instance of the object.

また、この例では、ボタン (Button1) とテキスト ボックス (TextBox1) を含んだフォーム (Form1) も使用しています。The example also uses a form (Form1) with a button (Button1) and a text box (TextBox1). ボタンをクリックすると、1 つ目のテキスト ボックスに 10 秒から 0 秒までのカウントダウンが表示されます。When you click the button, the first text box displays a countdown from 10 to 0 seconds. カウントダウンが終わると (10 秒が経過すると)、1 つ目のテキスト ボックスに "Done" と表示されます。When the full time (10 seconds) has elapsed, the first text box displays "Done".

Form1 のコードでは、フォームの初期状態と終了状態を指定しています。The code for Form1 specifies the initial and terminal states of the form. イベント発生時に実行されるコードも含まれています。It also contains the code executed when events are raised.

この例を使用するには、新しい Windows フォーム プロジェクトを開きます。To use this example, open a new Windows Forms project. 次に、Button1 という名前のボタンと TextBox1 という名前のテキスト ボックスを、Form1 という名前のメイン フォームに追加します。Then add a button named Button1 and a text box named TextBox1 to the main form, named Form1. 続いてフォームを右クリックし、 [コードの表示] をクリックしてコード エディターを開きます。Then right-click the form and click View Code to open the code editor.

Form1 クラスの宣言セクションに、WithEvents 変数を追加します。Add a WithEvents variable to the declarations section of the Form1 class:

Private WithEvents mText As TimerState

Form1 のコードに次のコードを追加します。Add the following code to the code for Form1. Form_LoadButton_Click など、重複して存在する可能性のあるプロシージャを置き換えます。Replace any duplicate procedures that may exist, such as Form_Load or Button_Click.

Private Sub Form1_Load() Handles MyBase.Load
    Button1.Text = "Start"
    mText = New TimerState
End Sub
Private Sub Button1_Click() Handles Button1.Click
    mText.StartCountdown(10.0, 0.1)
End Sub

Private Sub mText_ChangeText() Handles mText.Finished
    TextBox1.Text = "Done"
End Sub

Private Sub mText_UpdateTime(ByVal Countdown As Double
  ) Handles mText.UpdateTime

    TextBox1.Text = Format(Countdown, "##0.0")
    ' Use DoEvents to allow the display to refresh.
End Sub

Class TimerState
    Public Event UpdateTime(ByVal Countdown As Double)
    Public Event Finished()
    Public Sub StartCountdown(ByVal Duration As Double,
                              ByVal Increment As Double)
        Dim Start As Double = DateAndTime.Timer
        Dim ElapsedTime As Double = 0

        Dim SoFar As Double = 0
        Do While ElapsedTime < Duration
            If ElapsedTime > SoFar + Increment Then
                SoFar += Increment
                RaiseEvent UpdateTime(Duration - SoFar)
            End If
            ElapsedTime = DateAndTime.Timer - Start
        RaiseEvent Finished()
    End Sub
End Class

F5 キーを押して上の例を実行し、 [Start] というラベルのボタンをクリックします。Press F5 to run the previous example, and click the button labeled Start. 最初のテキスト ボックスで、秒のカウント ダウンが開始されます。The first text box starts to count down the seconds. カウントダウンが終わると (10 秒が経過すると)、1 つ目のテキスト ボックスに "Done" と表示されます。When the full time (10 seconds) has elapsed, the first text box displays "Done".


My.Application.DoEvents メソッドがイベントを処理する方法は、フォームと同じではありません。The My.Application.DoEvents method does not process events in the same way the form does. フォームでイベントを直接処理するには、マルチスレッドを使用します。To enable the form to handle the events directly, you can use multithreading. 詳細については、「マネージド スレッド処理」を参照してください。For more information, see Managed Threading.

関連項目See also