RaiseEvent ステートメント

モジュール レベルで宣言されたイベントをクラス、フォーム、またはドキュメントで発生させます。

RaiseEvent eventname[( argumentlist )]

指定項目

  • eventname
    必ず指定します。発生させるイベントの名前を指定します。

  • argumentlist
    省略可能です。変数、配列、または式をコンマで区切った一覧です。argumentlist 引数は、かっこで囲む必要があります。引数がない場合、かっこは省略できます。

解説

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 イベントをシャドウします。OnClick メソッドを呼び出して、フォームの Click イベントを呼び出すことができます。

既定では、Visual Basic 内に定義されているイベントは、それぞれのイベント ハンドラーを接続が確立された順序で発生させます。イベントには ByRef パラメーターを設定できるので、後から接続したプロセスは、それ以前のイベント ハンドラーで変更されたパラメーターを受け取ることがあります。イベント ハンドラーの実行が終わると、そのイベントを発生させたサブルーチンに制御が戻ります。

[!メモ]

非共有イベントを宣言したクラスのコンストラクター内では、その非共有イベントを発生させないでください。そのようなイベントがランタイム エラーを引き起こさない場合でも、それらのイベントが対応するイベント ハンドラーにキャッチされない場合があります。コンストラクターからイベントを発生させる必要がある場合は、Shared 修飾子を使用して共有イベントを作成してください。

[!メモ]

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

使用例

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

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

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

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

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

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] というラベルのボタンをクリックしてください。1 つ目のテキスト ボックスが秒のカウントダウンを開始します。カウントダウンが終わると (10 秒が経過すると)、1 つ目のテキスト ボックスに "Done" と表示されます。

[!メモ]

My.Application.DoEvents メソッドは、フォームとまったく同じ方法でイベントを処理するわけではありません。フォームがイベントを直接処理するようにするには、マルチスレッドを使用します。詳細については、「スレッド処理 (C# および Visual Basic)」を参照してください。

参照

関連項目

Event ステートメント

AddHandler ステートメント

RemoveHandler ステートメント

Handles 句 (Visual Basic)

その他の技術情報

イベント (Visual Basic)