これは、イベントを操作する方法を示す 2 つのトピックの 2 番目です。 最初のトピック 「チュートリアル: イベントの宣言と発生」では、イベントを宣言および発生させる方法を示します。 このセクションでは、そのチュートリアルのフォームとクラスを使用して、イベントが発生したときに処理する方法を示します。
Widget
クラスの例では、従来のイベント処理ステートメントを使用します。 Visual Basic には、イベントを操作するための他の手法が用意されています。 演習として、この例を変更して、 AddHandler
ステートメントと Handles
ステートメントを使用できます。
Widget クラスの PercentDone イベントを処理するには
次のコードを
Form1
に配置します。Private WithEvents mWidget As Widget Private mblnCancel As Boolean
WithEvents
キーワードは、変数mWidget
を使用してオブジェクトのイベントを処理することを指定します。 オブジェクトの種類を指定するには、オブジェクトの作成元となるクラスの名前を指定します。変数
mWidget
は、WithEvents
変数がクラス レベルである必要があるため、Form1
で宣言されます。 これは、配置するクラスの種類に関係なく当てはまります。変数
mblnCancel
は、LongTask
メソッドを取り消すために使用されます。
イベントを処理するコードの記述
WithEvents
を使用して変数を宣言するとすぐに、クラスのコード エディターの左側のドロップダウン リストに変数名が表示されます。
mWidget
を選択すると、Widget
クラスのイベントが右側のドロップダウン リストに表示されます。 イベントを選択すると、対応するイベント プロシージャが、プレフィックス mWidget
とアンダースコアと共に表示されます。
WithEvents
変数に関連付けられているすべてのイベント プロシージャには、プレフィックスとして変数名が指定されます。
イベントを処理するには
コード エディターの左側のドロップダウン リストから
mWidget
を選択します。右側のドロップダウン リストから
PercentDone
イベントを選択します。 コード エディターで、mWidget_PercentDone
イベント プロシージャが開きます。注
コード エディターは、新しいイベント ハンドラーを挿入するのに便利ですが、必須ではありません。 このチュートリアルでは、イベント ハンドラーをコードに直接コピーする方が直接的です。
mWidget_PercentDone
イベント ハンドラーに次のコードを追加します。Private Sub mWidget_PercentDone( ByVal Percent As Single, ByRef Cancel As Boolean ) Handles mWidget.PercentDone lblPercentDone.Text = CInt(100 * Percent) & "%" My.Application.DoEvents() If mblnCancel Then Cancel = True End Sub
PercentDone
イベントが発生するたびに、イベント プロシージャはLabel
コントロールに達成率を表示します。DoEvents
メソッドを使用すると、ラベルを再描画できます。また、ユーザーは [キャンセル] ボタンをクリックできます。Button2_Click
イベント ハンドラーの次のコードを追加します。Private Sub Button2_Click( ByVal sender As Object, ByVal e As System.EventArgs ) Handles Button2.Click mblnCancel = True End Sub
LongTask
の実行中にユーザーが [キャンセル] ボタンをクリックした場合、Button2_Click
イベントは、DoEvents
ステートメントでイベント処理の実行が許可されるとすぐに実行されます。 クラス レベルの変数 mblnCancel
は True
に設定され、 mWidget_PercentDone
イベントはそれをテストし、 ByRef Cancel
引数を True
に設定します。
WithEvents 変数をオブジェクトに接続する
Form1
は、 Widget
オブジェクトのイベントを処理するように設定されました。 残っているのは、どこかで Widget
を見つけることです。
デザイン時に変数 WithEvents
を宣言すると、オブジェクトは関連付けされません。
WithEvents
変数は、他のオブジェクト変数と同じです。 オブジェクトを作成し、 WithEvents
変数を使用してオブジェクトへの参照を割り当てる必要があります。
オブジェクトを作成して参照を割り当てるには
コード エディターの左側のドロップダウン リストから (Form1 イベント) を選択します。
右側のドロップダウン リストから
Load
イベントを選択します。 コード エディターで、Form1_Load
イベント プロシージャが開きます。Widget
を作成するには、Form1_Load
イベント プロシージャの次のコードを追加します。Private Sub Form1_Load( ByVal sender As System.Object, ByVal e As System.EventArgs ) Handles MyBase.Load mWidget = New Widget End Sub
このコードを実行すると、Visual Basic によって Widget
オブジェクトが作成され、そのイベントが mWidget
に関連付けられているイベント プロシージャに接続されます。 その時点から、 Widget
がその PercentDone
イベントを発生させるたびに、 mWidget_PercentDone
イベント プロシージャが実行されます。
LongTask メソッドを呼び出すには
Button1_Click
イベント ハンドラーに次のコードを追加します。Private Sub Button1_Click( ByVal sender As Object, ByVal e As System.EventArgs ) Handles Button1.Click mblnCancel = False lblPercentDone.Text = "0%" lblPercentDone.Refresh() mWidget.LongTask(12.2, 0.33) If Not mblnCancel Then lblPercentDone.Text = CStr(100) & "%" End Sub
LongTask
メソッドを呼び出す前に、達成率を表示するラベルを初期化し、メソッドを取り消すクラス レベルのBoolean
フラグをFalse
に設定する必要があります。
LongTask
は、12.2 秒のタスク期間で呼び出されます。
PercentDone
イベントは、1 秒の 3 分の 1 に 1 回発生します。 イベントが発生するたびに、 mWidget_PercentDone
イベント プロシージャが実行されます。
LongTask
が完了すると、mblnCancel
がテストされ、LongTask
が正常に終了したかどうか、またはmblnCancel
がTrue
に設定されたために停止したかどうかを確認します。 達成率は、前者のケースでのみ更新されます。
プログラムを実行するには
F5 キーを押して、プロジェクトを実行モードにします。
[ タスクの開始 ] ボタンをクリックします。
PercentDone
イベントが発生するたびに、完了したタスクの割合でラベルが更新されます。[ キャンセル ] ボタンをクリックしてタスクを停止します。 クリックしても、[ キャンセル ] ボタンの外観がすぐに変更されないことに注意してください。
Click
イベントは、My.Application.DoEvents
ステートメントでイベント処理が許可されるまで発生できません。注
My.Application.DoEvents
メソッドは、フォームとまったく同じ方法でイベントを処理しません。 たとえば、このチュートリアルでは、[ キャンセル ] ボタンを 2 回クリックする必要があります。 フォームでイベントを直接処理できるようにするには、マルチスレッドを使用できます。 詳細については、「 マネージド スレッド」を参照してください。
F11 でプログラムを実行し、一度に 1 行ずつコードをステップ実行することが有益な場合があります。 実行がLongTask
に入り、PercentDone
イベントが発生するたびにForm1
を簡単に再入力する方法を明確に確認できます。
Form1
のコードで実行が戻っている間に、LongTask
メソッドが再び呼び出された場合はどうなるでしょうか。 最悪の場合、イベントが発生するたびに LongTask
が呼び出された場合、スタック オーバーフローが発生する可能性があります。
新しいWidget
への参照をmWidget
に割り当てることで、変数mWidget
が別のWidget
オブジェクトのイベントを処理するようにすることができます。 実際には、ボタンをクリックするたびにこれを行う Button1_Click
でコードを作成できます。
別のウィジェットのイベントを処理するには
mWidget.LongTask(12.2, 0.33)
を読み取る行のすぐ前に、Button1_Click
プロシージャに次のコード行を追加します。mWidget = New Widget ' Create a new Widget object.
上記のコードでは、ボタンがクリックされるたびに新しい Widget
が作成されます。
LongTask
メソッドが完了するとすぐに、Widget
への参照が解放され、Widget
が破棄されます。
WithEvents
変数に含めることができるオブジェクト参照は一度に 1 つだけであるため、別のWidget
オブジェクトをmWidget
に割り当てると、前のWidget
オブジェクトのイベントは処理されなくなります。
mWidget
が古いWidget
への参照を含む唯一のオブジェクト変数である場合、オブジェクトは破棄されます。 複数の Widget
オブジェクトからのイベントを処理する場合は、 AddHandler
ステートメントを使用して各オブジェクトからのイベントを個別に処理します。
注
WithEvents
変数は必要な数まで宣言できますが、WithEvents
変数の配列はサポートされていません。
こちらも参照ください
.NET