次の方法で共有


チュートリアル: イベントの宣言と発生 (Visual Basic)

このチュートリアルでは、 Widgetという名前のクラスのイベントを宣言して発生させる方法について説明します。 手順を完了したら、コンパニオン トピック 「チュートリアル: イベントの処理」を参照してください。このトピックでは、 Widget オブジェクトのイベントを使用してアプリケーションの状態情報を提供する方法を示します。

Widget クラス

Widget クラスがあるとします。 Widget クラスには、実行に時間がかかる可能性があるメソッドがあり、アプリケーションで何らかの完了インジケーターを設定できるようにする必要があります。

もちろん、 Widget オブジェクトに達成率のダイアログ ボックスを表示することもできますが、 Widget クラスを使用したすべてのプロジェクトでそのダイアログ ボックスが表示され続けます。 オブジェクトデザインの良い原則は、オブジェクトを使用するアプリケーションがユーザー インターフェイスを処理できるようにすることです。ただし、オブジェクトの目的全体がフォームまたはダイアログ ボックスを管理する場合を除きます。

Widgetの目的は、他のタスクを実行するため、PercentDone イベントを追加し、Widgetのメソッドを呼び出すプロシージャでそのイベントを処理し、状態の更新を表示することをお勧めします。 PercentDone イベントは、タスクを取り消すメカニズムを提供することもできます。

このトピックのコード例をビルドするには

  1. 新しい Visual Basic Windows アプリケーション プロジェクトを開き、 Form1という名前のフォームを作成します。

  2. Form1する 2 つのボタンとラベルを追加します。

  3. 次の表に示すように、オブジェクトに名前を付けます。

    オブジェクト プロパティ 設定
    Button1 Text タスクの開始
    Button2 Text キャンセル
    Label (Name)Text lblPercentDone,0
  4. [ プロジェクト ] メニューの [ クラスの追加 ] を選択して、 Widget.vb という名前のクラスをプロジェクトに追加します。

Widget クラスのイベントを宣言するには

  • Event キーワードを使用して、Widget クラスでイベントを宣言します。 WidgetPercentDone イベントが示すように、イベントには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 イベントを発生するには

  1. このクラスで使用されるTimer プロパティへのアクセスを簡略化するには、クラス モジュールの宣言セクションの先頭 (Class Widget ステートメントの上) にImportsステートメントを追加します。

    Imports Microsoft.VisualBasic.DateAndTime
    
  2. 以下のコードを 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 イベントに関連付ける方法を示します。

こちらも参照ください