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 - それを宣言している要素にアクセス可能なすべてのコードから、それにアクセスできます。 - Protected - そのクラスまたは派生クラス内のコードからのみ、それにアクセスできます。 - Friend - 同じアセンブリ内のコードからのみ、それにアクセスできます。 - Private - それを宣言している要素内のコードからのみ、それにアクセスできます。 - Protected Friend - イベントのクラス、派生クラス、または同じアセンブリ内のコードからのみ、それにアクセスできます。 - Private Protected - 同じアセンブリ内のイベントのクラスまたは派生クラス内のコードからのみ、それにアクセスできます。 |
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 ブロックを終了します。 |
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_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 キーを押して上の例を実行し、 [Start] というラベルのボタンをクリックします。 最初のテキスト ボックスで、秒のカウント ダウンが開始されます。 カウントダウンが終わると (10 秒が経過すると)、1 つ目のテキスト ボックスに "Done" と表示されます。
注意
My.Application.DoEvents
メソッドがイベントを処理する方法は、フォームと同じではありません。 フォームでイベントを直接処理するには、マルチスレッドを使用します。 詳細については、「マネージド スレッド処理」を参照してください。
関連項目
.NET