このチュートリアルでは、 Widget
という名前のクラスのイベントを宣言して発生させる方法について説明します。 手順を完了したら、コンパニオン トピック 「チュートリアル: イベントの処理」を参照してください。このトピックでは、 Widget
オブジェクトのイベントを使用してアプリケーションの状態情報を提供する方法を示します。
Widget クラス
Widget
クラスがあるとします。
Widget
クラスには、実行に時間がかかる可能性があるメソッドがあり、アプリケーションで何らかの完了インジケーターを設定できるようにする必要があります。
もちろん、 Widget
オブジェクトに達成率のダイアログ ボックスを表示することもできますが、 Widget
クラスを使用したすべてのプロジェクトでそのダイアログ ボックスが表示され続けます。 オブジェクトデザインの良い原則は、オブジェクトを使用するアプリケーションがユーザー インターフェイスを処理できるようにすることです。ただし、オブジェクトの目的全体がフォームまたはダイアログ ボックスを管理する場合を除きます。
Widget
の目的は、他のタスクを実行するため、PercentDone
イベントを追加し、Widget
のメソッドを呼び出すプロシージャでそのイベントを処理し、状態の更新を表示することをお勧めします。
PercentDone
イベントは、タスクを取り消すメカニズムを提供することもできます。
このトピックのコード例をビルドするには
新しい Visual Basic Windows アプリケーション プロジェクトを開き、
Form1
という名前のフォームを作成します。Form1
する 2 つのボタンとラベルを追加します。次の表に示すように、オブジェクトに名前を付けます。
オブジェクト プロパティ 設定 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
に設定して、イベントを発生させたメソッドを取り消すことができます。
注
イベント引数は、プロシージャの引数を行うのと同じように宣言できます。ただし、イベントには Optional
または ParamArray
の引数を含めることはできません。イベントには戻り値がありません。
PercentDone
イベントは、Widget
クラスのLongTask
メソッドによって発生します。
LongTask
は 2 つの引数を受け取ります。メソッドが処理を行っているふりをする時間の長さと、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
クラスはMinimumInterval
秒ごとにPercentDone
イベントを発生させます。 イベントが返されると、 LongTask
は、 Cancel
引数が True
に設定されているかどうかを確認します。
ここでは、いくつかの免責事項が必要です。 わかりやすくするために、 LongTask
プロシージャは、タスクにかかる時間を事前に把握していることを前提としています。 これはほとんど当てはまることはありません。 タスクを偶数サイズのチャンクに分割するのは難しい場合があり、多くの場合、ユーザーにとって最も重要なのは、何かが発生していることを示す前に経過する時間です。
このサンプルで別の欠陥が見つかった可能性があります。
Timer
プロパティは、午前 0 時から経過した秒数を返します。したがって、アプリケーションが午前 0 時の直前に起動されると、アプリケーションがスタックします。 時間を測定するためのより慎重なアプローチでは、このような境界条件を考慮するか、 Now
などのプロパティを使用してそれらを完全に回避します。
Widget
クラスでイベントを発生できるようになったので、次のチュートリアルに進むことができます。
チュートリアル: イベントの処理 では、 WithEvents
を使用してイベント ハンドラーを PercentDone
イベントに関連付ける方法を示します。
こちらも参照ください
.NET