次の方法で共有


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 アクセサーを呼び出します。 カスタム イベントの詳細については、「 イベント ステートメント」を参照してください。

例 1

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

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

この例では、ボタン (Form1) とテキスト ボックス (Button1) を含むフォーム (TextBox1) も使用します。 ボタンをクリックすると、最初のテキスト ボックスに 10 秒から 0 秒のカウントダウンが表示されます。 完全時間 (10 秒) が経過すると、最初のテキスト ボックスに "完了" と表示されます。

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

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

こちらも参照ください