次の方法で共有


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 任意。 イベントにアクセスできるコードを指定します。 次のいずれかを指定できます。

- Public — 宣言する要素にアクセスできる任意のコードがアクセスできます。
- 保護 - そのクラスまたは派生クラス内のコードのみがアクセスできます。
- フレンド- 同じアセンブリ内のコードだけがアクセスできます。
- Private— 要素内で宣言されているコードだけがアクセスできます。
- イベントのクラス、派生クラス、または同じアセンブリ内の保護されたフレンド専用コードは、それにアクセスできます。
- イベントのクラス内のプライベート保護専用コードまたは同じアセンブリ内の派生クラスは、そのクラスにアクセスできます。
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 ブロックを終了します。

注釈

イベントが宣言されたら、 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) も使用します。 ボタンをクリックすると、最初のテキスト ボックスに 10 秒から 0 秒のカウントダウンが表示されます。 完全時間 (10 秒) が経過すると、最初のテキスト ボックスに "完了" と表示されます。

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 キーを押して前の例を実行し、[ スタート] というラベルのボタンをクリックします。 最初のテキスト ボックスは秒のカウントダウンを開始します。 完全時間 (10 秒) が経過すると、最初のテキスト ボックスに "完了" と表示されます。

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

こちらも参照ください