RaiseEvent ステートメント

クラス、フォーム、またはドキュメント内のモジュール レベルで宣言されたイベントをトリガーします。

構文

RaiseEvent eventname[( argumentlist )]  

指定項目

eventname
必須です。 トリガーするイベントの名前です。

argumentlist
任意。 変数、配列、または式のコンマ区切りのリストです。 argumentlist 引数はかっこで囲む必要があります。 引数がない場合は、かっこを省略する必要があります。

Remarks

必須の eventname は、モジュール内で宣言されたイベントの名前です。 Visual Basic 変数の名前付け規則に従います。

イベントが発生するモジュール内でそれが宣言されていない場合は、エラーが発生します。 次のコード フラグメントは、イベントの宣言と、イベントが発生するプロシージャを示しています。

' Declare an event at module level.
Event LogonCompleted(ByVal UserName As String)

Sub Logon(ByVal UserName As String)
    ' Raise the event.
    RaiseEvent LogonCompleted(UserName)
End Sub

モジュール内で明示的に宣言されていないイベントを、RaiseEvent を使用して発生させることはできません。 たとえば、すべてのフォームが System.Windows.Forms.Form から Click イベントを継承している場合、それを派生フォーム内の RaiseEvent を使用して発生させることはできません。 フォーム モジュール内で Click イベントを宣言すると、それによってフォーム独自の Click イベントはシャドウされます。 それでも、そのフォームの Click イベントは、OnClick メソッドを呼び出すことで呼び出すことができます。

既定では、Visual Basic で定義されたイベントはそのイベント ハンドラーを、接続が確立された順に発生させます。 イベントには ByRef パラメーターを含めることができるため、遅れて接続するプロセスでは、先行するイベント ハンドラーによって変更されたパラメーターを受け取る場合があります。 イベント ハンドラーが実行されると、イベントを発生させたサブルーチンに制御が返されます。

Note

非共有イベントは、それらが宣言されているクラスのコンストラクター内で発生させないでください。 このようなイベントが実行時エラーの原因となることはありませんが、関連付けられたイベント ハンドラーでキャッチされない場合があります。 コンストラクターからイベントを発生させる必要がある場合は、Shared 修飾子を使用して共有イベントを作成します。

Note

イベントの既定の動作を変更するには、カスタム イベントを定義します。 カスタム イベントの場合は、RaiseEvent ステートメントによってイベントの RaiseEvent アクセサーが呼び出されます。 カスタム イベントの詳細については、「Event ステートメント」を参照してください。

例 1

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

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

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

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

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

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

Private WithEvents mText As TimerState

例 2

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" と表示されます。

Note

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

関連項目