チュートリアル: イベントの宣言と発生 (Visual Basic)
このチュートリアルでは、Widget
という名前のクラスのイベントを宣言し、発生させる方法について説明します。 この手順を完了したら、本トピックの対になっている「チュートリアル: イベントの処理」も読むことをお勧めします。こちらでは、Widget
オブジェクトのイベントを使用して、アプリケーションの状態に関する情報を示す方法について説明しています。
Widget クラス
このチュートリアルでは、Widget
クラスがあるものと仮定します。 Widget
クラスには、実行に時間のかかる可能性のあるメソッドが含まれているので、なんらかの完了率インジケーターをアプリケーションに表示することにします。
もちろん、完了率を示すダイアログ ボックスを Widget
オブジェクトに表示してもかまいません。ただし、そうすると Widget
クラスを使用するあらゆるプロジェクトで、このダイアログ ボックスが表示されることになります。 オブジェクト設計の原則は、オブジェクトの目的がフォームまたはダイアログ ボックスの管理だけである場合を除き、ユーザー インターフェイスの処理はオブジェクトを使用するアプリケーションに任せることです。
Widget
の目的は別のタスクの実行ですので、PercentDone
イベントを追加し、Widget
のメソッドを呼び出すプロシージャにこのイベントを処理させて、最新の状態を表示させる方が適切です。 PercentDone
イベントによって、タスクを取り消すメカニズムも提供できます。
このトピックのコード例をビルドするには
新しい Visual Basic Windows アプリケーション プロジェクトを開き、
Form1
という名前のフォームを作成します。Form1
にボタン 2 つとラベル 1 つを追加します。次の表のように、各オブジェクトに名前を付けます。
オブジェクト プロパティ 設定 Button1
Text
タスクの開始 Button2
Text
キャンセル Label
(Name)
、Text
lblPercentDone、0 [プロジェクト] メニューの [クラスの追加] を選択して、
Widget.vb
という名前のクラスをプロジェクトに追加します。
Widget クラスのイベントを宣言するには
Event
キーワードを使用して、Widget
クラス内でイベントを宣言します。 次のWidget
のPercentDone
イベントに示されているように、イベントにはByVal
引数とByRef
引数を設定できます。Public Event PercentDone(ByVal Percent As Single, ByRef Cancel As Boolean)
呼び出し元オブジェクトが PercentDone
イベントを受け取るとき、Percent
引数には完了したタスクの割合が含まれています。 Cancel
引数を True
に設定すると、イベントを発生させたメソッドを取り消すことができます。
Note
イベントの引数は、プロシージャの引数と同様に宣言できますが、次のような例外があります。イベントに対して Optional
引数または ParamArray
引数を指定することはできません。また、イベントは値を返しません。
PercentDone
イベントは、Widget
クラスの LongTask
メソッドで発生します。 LongTask
は、メソッドの仮の実行時間と、PercentDone
イベントの発生まで LongTask
が一時停止する最短期間の 2 つを引数に取ります。
PercentDone イベントを発生させるには
このクラスで使用する
Timer
プロパティにアクセスしやすくするため、Imports
ステートメントを、クラス モジュールの宣言セクション先頭、Class Widget
ステートメントの上に追加します。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
メソッドが呼び出されると、MinimumInterval
秒ごとに Widget
クラスで PercentDone
イベントが発生します。 イベントが返されると、Cancel
引数が True
に設定されているかどうかが LongTask
により確認されます。
ここで、いくつかの注意事項があります。 簡略化のため、LongTask
プロシージャでは、タスクの実行所要時間があらかじめわかっているものと仮定しています。 このようなケースはほとんどありません。 タスクを均一サイズのチャンクに分割することは困難であり、また多くの場合、ユーザーにとって重要なことは、何かが起きたことを把握できるまでの時間の長さだけです。
お気付きのとおり、このサンプルには別の欠陥もあります。 Timer
プロパティが返すのは、午前 0 時からの経過時間 (秒) です。そのため、アプリケーションは、午前 0 時の直前に開始された場合停止してしまいます。 より適切に時間を測定する方法としては、このような境界条件を考慮するか、Now
などのプロパティを使用してこうした条件を完全に回避することが考えられます。
これで、Widget
クラスでイベントを発生させられるようになり、次のチュートリアルに進む用意が整いました。 チュートリアル: イベントの処理」で、WithEvents
を使用してイベント ハンドラーを PercentDone
イベントに関連付ける方法について学びましょう。
関連項目
.NET