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  

指定項目

パーツ 説明
attrlist 任意。 このイベントに適用される属性の一覧です。 複数の属性を指定するときは、コンマで区切ります。 属性リストは山かっこ ("" および ">") で囲む必要があります。
accessmodifier 任意。 どのようなコードからイベントにアクセスできるのかを指定します。 次のいずれかの値を指定します。

- - - この列挙体を宣言している要素にアクセス可能なすべてのコードからアクセスできます。
- - - そのクラスまたは派生クラス内のコードからのみアクセスできます。
- - - 同じアセンブリ内のコードからのみアクセスできます。
- - - この列挙体を宣言している要素内のコードからのみアクセスできます。
- - - イベントのクラス、派生クラス、または同じアセンブリ内のコードからのみ、それにアクセスできます。
- - - 同じアセンブリ内のイベントのクラスまたは派生クラス内のコードからのみ、それにアクセスできます。
Shared 任意。 このイベントがクラスまたは構造体の特定のインスタンスに関連付けられないことを指定します。
Shadows 任意。 このイベントが、基本クラスにある、同じ名前を持つプログラミング要素、またはオーバーロードされる要素のセットを宣言し直して隠ぺいすることを示します。 宣言された要素は、他の任意の種類の要素でシャドウできます。

シャドウされた要素は、その要素をシャドウする派生クラスからは使用できません。ただし、シャドウする要素がアクセスできない要素の場合は例外です。 たとえば、Private 要素が基本クラスの要素をシャドウすると、Private 要素へのアクセス許可を持たないコードは、代わりに基本クラスにアクセスします。
eventname 必須です。 イベントの名前です。変数の標準的な名前付け規則に従って名前を付けます。
parameterlist 任意。 このイベントのパラメーターを表すローカル変数のリストです。 パラメーター リストはかっこで囲む必要があります。
Implements 任意。 このイベントがインターフェイスのイベントを実装することを示します。
implementslist Implements を指定する場合は、必ず指定します。 実装される Sub プロシージャのリストです。 複数のプロシージャを指定するときは、コンマで区切ります。

implementedprocedure [ , implementedprocedure ... ]

implementedprocedure の構文と指定項目は次のとおりです。

interface.definedname

- interface - 必須。 このプロシージャの包含クラスまたは包含構造体が実装しているインターフェイスの名前です。
- Definedname - 必須。 interface の中でプロシージャを定義するために使用する名前。 これは、name (定義されているプロシージャを実装するためにこのプロシージャが使用している名前) と同じである必要はありません。
Custom 必須です。 Custom として宣言されたイベントでは、AddHandlerRemoveHandler、および RaiseEvent の各カスタム アクセサーを定義する必要があります。
delegatename 任意。 イベント ハンドラーの署名を指定するデリゲートの名前。
AddHandler 必須です。 AddHandler アクセサーを宣言します。ここでは、イベント ハンドラーが追加されたとき実行するステートメントを、AddHandler ステートメントを使って明示的に指定するか、Handles 句を使って暗黙的に指定します。
End AddHandler 必須です。 AddHandler ブロックを終了します。
value 必須です。 パラメーター名です。
RemoveHandler 必須です。 RemoveHandler アクセサーを宣言します。ここでは、イベント ハンドラーが削除されたときに実行するステートメントを、RemoveHandler ステートメントを使って指定します。
End RemoveHandler 必須です。 RemoveHandler ブロックを終了します。
RaiseEvent 必須です。 RaiseEvent アクセサーを宣言します。ここでは、イベントが発生したときに実行するステートメントを、RaiseEvent ステートメントを使って指定します。 通常は、AddHandler アクセサーと RemoveHandler アクセサーによって管理されるデリゲートのリストが呼び出されます。
End RaiseEvent 必須です。 RaiseEvent ブロックを終了します。
delegatesignature 必須です。 delegatename デリゲートに必要なパラメーターと一致するパラメーターのリストです。 パラメーター リストはかっこで囲む必要があります。
statements 任意。 AddHandlerRemoveHandler、および RaiseEvent の各メソッドの本体が含まれるステートメントです。
End Event 必須です。 Event ブロックを終了します。

Remarks

宣言したイベントは、RaiseEvent ステートメントを使って発生させます。 通常、イベントの宣言と発生は、次のように行われます。

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 引数を指定することはできません。 イベントは値を返しません。

イベントを処理するためには、Handles ステートメントまたは AddHandler ステートメントを使用して、イベントをイベント ハンドラー サブルーチンに関連付ける必要があります。 サブルーチンとイベントの署名が一致する必要があります。 共有イベントを処理するには、AddHandler ステートメントを使う必要があります。

Event は、モジュール レベルでのみ使用できます。 つまり、イベントの宣言コンテキストは、クラス、構造体、モジュール、またはインターフェイスである必要があり、ソース ファイル、名前空間、プロシージャ、ブロックでは宣言できません。 詳細については、「宣言コンテキストと既定のアクセス レベル」を参照してください。

ほとんどの状況で、このトピックの「構文」のセクションにある最初の構文を使ってイベントを宣言できますが、 一部のシナリオでは、イベントの動作をより詳細に制御することが必要になります。 このトピックの「構文」セクションの最後には、Custom キーワードを使用した構文があります。これを使用すると、カスタム イベントを定義してイベントを詳細に制御できます。 カスタム イベントでは、コードでイベント ハンドラーを追加または削除するときに、つまりコードでイベントを生成するときに、何が起こるかを正確に指定します。 たとえば、「方法:カスタム イベントを宣言してメモリを節約する」および「方法:カスタム イベントを宣言してブロックを回避する」を参照してください。

次の例では、イベントを使用して 10 秒から 0 秒までカウント ダウンします。 このコードは、イベント関連のいくつかのメソッド、プロパティ、およびステートメントの例を示しています。 RaiseEvent ステートメントの使用例も含まれています。

イベントを発生させるクラスをイベント ソース、イベントを処理するメソッドをイベント ハンドラーと呼びます。 イベント ソースでは、生成されるイベントに対して複数のイベント ハンドラーを設定できます。 クラスでイベントが発生すると、そのイベントは、オブジェクトのインスタンスに対するイベントを処理するために選択されたすべてのクラスで発生します。

また、この例では、ボタン (Button1) とテキスト ボックス (TextBox1) を含んだフォーム (Form1) も使用しています。 ボタンをクリックすると、1 つ目のテキスト ボックスに 10 秒から 0 秒までのカウントダウンが表示されます。 カウントダウンが終わると (10 秒が経過すると)、1 つ目のテキスト ボックスに "Done" と表示されます。

Form1 のコードでは、フォームの初期状態と終了状態を指定しています。 イベント発生時に実行されるコードも含まれています。

この例を使用するには、新しい Windows フォーム プロジェクトを開きます。 次に、Button1 という名前のボタンと TextBox1 という名前のテキスト ボックスを、Form1 という名前のメイン フォームに追加します。 続いてフォームを右クリックし、 [コードの表示] をクリックしてコード エディターを開きます。

Form1 クラスの宣言セクションに、WithEvents 変数を追加します。

Private WithEvents mText As TimerState

Form1 のコードに次のコードを追加します。 Form_LoadButton_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.
    My.Application.DoEvents()
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
        Loop
        RaiseEvent Finished()
    End Sub
End Class

F5 キーを押して上の例を実行し、 [Start] というラベルのボタンをクリックします。 最初のテキスト ボックスで、秒のカウント ダウンが開始されます。 カウントダウンが終わると (10 秒が経過すると)、1 つ目のテキスト ボックスに "Done" と表示されます。

注意

My.Application.DoEvents メソッドがイベントを処理する方法は、フォームと同じではありません。 フォームでイベントを直接処理するには、マルチスレッドを使用します。 詳細については、「マネージド スレッド処理」を参照してください。

関連項目