ユーザー定義イベントを宣言します。
構文
[ <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 として宣言されたイベントでは、カスタム AddHandler 、RemoveHandler 、および 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 |
任意。
AddHandler 、RemoveHandler 、および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_Load
や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.
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
メソッドは、フォームと同じ方法でイベントを処理しません。 フォームでイベントを直接処理できるようにするには、マルチスレッドを使用できます。 詳細については、「 マネージド スレッド」を参照してください。
こちらも参照ください
.NET