チュートリアル : イベントの宣言と発生
更新 : 2007 年 11 月
このチュートリアルでは、Widget というクラスのイベントを宣言および発生させる方法を説明します。ここでの手順が完了したら、関連トピックの「チュートリアル : イベントの処理」を参照してください。このトピックでは、Widget オブジェクトのイベントを使用して、アプリケーションのステータス情報を提供する方法を説明しています。
ウィジェット クラス
ここでは Widget クラスが既にあると仮定します。Widget クラスには、実行に時間がかかるメソッドが 1 つあるので、アプリケーションに完了のインジケータを用意することにします。
Widget オブジェクトに、完了した割合を示すダイアログ ボックスを表示させることもできますが、ここでは、Widget クラスを使用するすべてのプロジェクトでダイアログ ボックスを表示する処理を行います。オブジェクトの目的がフォームやダイアログ ボックスを制御することでない場合、オブジェクト設計の原則は、オブジェクトを使用するアプリケーションにユーザー インターフェイスを処理させることです。
Widget の目的は他のタスクを実行することです。したがって、PercentDone イベントを追加して、Widget のメソッドを呼び出すプロシージャにイベントの処理と更新状態の表示を実行させる方が適切です。PercentDone イベントは、タスクをキャンセルするしくみも提供できます。
このトピックのコード例を作成するには
新しい Visual Basic Windows Application プロジェクトを開き、Form1 の名前でフォームを作成します。
Form1 に、2 つのボタンと 1 つのラベルを追加します。
次の表のとおりにオブジェクトに名前を付けます。
オブジェクト
プロパティ
設定
Button1
Text
Start Task
Button2
Text
Cancel
Label
(Name), Text
lblPercentDone, 0
[プロジェクト] メニューの [クラスの追加] を選択し、プロジェクトに Widget.vb というクラスを追加します。
ウィジェット クラスのイベントを宣言するには
Event キーワードを使って Widget クラス内にイベントを宣言します。イベントは ByVal および ByRef 引数を受け取ることができます。Widget の PercentDone イベントの例を示します。
Public Event PercentDone(ByVal Percent As Single, _ ByRef Cancel As Boolean)
呼び出し元のオブジェクトが PercentDone イベントを受け取るとき、Percent 引数には完了したタスクの割合が含まれています。Cancel 引数を True に設定すると、イベントを発生させるメソッドをキャンセルできます。
メモ : |
---|
イベントの引数は、プロシージャの引数と同様に宣言できます。ただし、イベントに対して Optional 引数や ParamArray 引数は指定できず、イベントには戻り値がありません。 |
PercentDone イベントは、Widget クラスの LongTask メソッドによって発生します。LongTask は 2 つの引数を受け取ります。1 つはメソッドの動作時間を表し、もう 1 つは PercentDone イベントを発生させるために LongTask が一時停止するまでの最小の間隔を表します。
PercentDone イベントを発生させるには
このクラスによって使用される Timer プロパティへのアクセスを簡単にするために、クラス モジュールの宣言セクションの先頭で、Class Widget ステートメントの上に Imports ステートメントを追加します。
Imports Microsoft.VisualBasic.DateAndTime
Widget クラスに次のコードを追加します。
Public Sub LongTask(ByVal Duration As Single, _ ByVal MinimumInterval As Single) Dim Threshold As Single Dim Start As Single Dim blnCancel As Boolean ' The Timer property of the DateAndTime object returns the seconds ' and milliseconds that have passed since midnight. Start = CSng(Timer) Threshold = MinimumInterval Do While CSng(Timer) < (Start + Duration) ' In a real application, some unit of work would ' be done here each time through the loop. If CSng(Timer) > (Start + Threshold) Then RaiseEvent PercentDone( _ Threshold / Duration, blnCancel) ' Check to see if the operation was canceled. If blnCancel Then Exit Sub Threshold = Threshold + MinimumInterval End If Loop End Sub
アプリケーションで LongTask メソッドを呼び出すと、Widget クラスは PercentDone イベントを MinimumInterval 秒間隔で発生させます。イベントが返されると、LongTask は Cancel 引数が True に設定されたかどうかを確認します。
ここで、次の点に注意してください。簡略化のために、LongTask プロシージャでは、タスクにかかる時間があらかじめわかっているとします。実際には、このような場合はほとんどありません。タスクを均等なサイズのチャンクに分割することは難しい場合があり、ユーザーにとって最も重要なことは、処理が進行中であることを知らされるまでの時間である場合も多くあります。
このサンプルに別の欠点があります。Timer プロパティは、深夜 0 時からの経過時間を秒単位で返します。したがって、アプリケーションが 0 時直前に開始された場合、アプリケーションは正しく動作しなくなります。時間を慎重に測定するには、このような境界条件を考慮に入れるか、Now などのプロパティを使用して問題が発生するのを避けます。
これで Widget クラスはイベントを発生できるようになったので、次のチュートリアルに進むことができます。「チュートリアル : イベントの処理」は、WithEvents を使ってイベント ハンドラを PercentDone イベントに関連付ける方法を示します。