Form1 は、Widget オブジェクトのイベントを処理するように設定されます。後は、Widget を見つけるだけです。
デザイン時に変数 WithEvents を宣言するときは、どのオブジェクトも関連付けられていません。WithEvents 変数は、他のオブジェクト変数と同じです。オブジェクトを作成し、WithEvents 変数を使用してオブジェクトへの参照を代入する必要があります。
オブジェクトを作成し、オブジェクトへの参照を代入するには
コード エディタで、左側のドロップダウン リストの [(Form1 イベント)] をクリックします。
右側のドロップダウン リストの Load イベントをクリックします。コード エディタ内に Form1_Load イベント プロシージャが表示されます。
Form1_Load イベント プロシージャに次のコードを追加して、Widget を作成します。
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 メソッドを呼び出すには
LongTask メソッドを呼び出す前に、完了したパーセントを表示するラベルを初期化する必要があります。また、メソッドをキャンセルするためのクラス レベルの Boolean フラグを False に設定する必要があります。
LongTask は、12.2 秒のタスク存続期間で呼び出されます。PercentDone イベントは、1/3 秒ごとに発生します。イベントが発生するたびに、mWidget_PercentDone イベント プロシージャが実行されます。
LongTask の実行が完了すると mblnCancel がテストされ、LongTask が正常に終了したかどうか、または mblnCancel が True に設定されたために実行が停止したかどうかが確認されます。完了したパーセントは、正常に終了したかどうかを確認する場合にだけ更新されます。
プログラムを実行するには
F5 キーを押してプロジェクトを実行モードにします。
[タスクの開始] をクリックします。PercentDone イベントが発生するたびに、タスクの完了したパーセント値でラベルが更新されます。
[キャンセル] をクリックして、タスクを停止します。[キャンセル] ボタンの外観は、クリックしてもすぐには変化しません。My.Application.DoEvents ステートメントによってイベント処理が許可されるまで、Click イベントは発生しません。
メモ : |
|---|
My.Application.DoEvents メソッドは、フォームとまったく同じ方法でイベントを処理するわけではありません。たとえばこのチュートリアルでは、[キャンセル] を 2 回クリックする必要があります。フォームがイベントを直接処理するようにするには、マルチスレッドを使用します。詳細については、「Visual Basic におけるマルチスレッド」を参照してください。 |
プログラムを実行するときに、F11 キーを押してコードを 1 行ずつ処理すると便利な場合があります。実行が LongTask に移り、PercentDone イベントが発生するたびに一時的に実行が Form1 に移るようすを明確に確認できます。
実行が Form1 のコードに戻っているときに、LongTask メソッドが再び呼び出された場合、どうなるか考えてください。最悪の場合、イベントが発生するたびに LongTask が呼び出されると、スタック オーバーフローが発生します。
新しい Widget への参照を mWidget 変数に代入すると、この mWidget 変数に異なる Widget オブジェクトのイベントを処理させることができます。実際、ボタンをクリックするたびに Button1_Click のコードを実行させることができます。
異なる Widget のイベントを処理するには
上記のコードは、ボタンがクリックされるごとに新しい Widget を作成します。LongTask メソッドが完了すると、すぐに Widget への参照が解放され、Widget は破棄されます。
WithEvents 変数には、一度に 1 つのオブジェクト参照しか保持できません。したがって、mWidget に別の Widget オブジェクトを代入すると、前の Widget オブジェクトのイベントは処理されなくなります。mWidget が、前の Widget への参照を含む唯一のオブジェクト変数である場合、オブジェクトは破棄されます。複数の Widget オブジェクトからのイベントを処理する場合は、AddHandler ステートメントを使用して、各オブジェクトからのイベントを個別に処理します。
メモ : |
|---|
WithEvents 変数は必要な数だけ宣言できますが、WithEvents 変数の配列はサポートされません。 |