Share via


逐步解說:宣告和引發事件 (Visual Basic)

本逐步解說示範如何宣告和引發名為 Widget 之類別的事件。 完成這些步驟之後,您可以閱讀隨附主題逐步解說:處理事件,瞭解如何使用來自 Widget 物件的事件,在應用程式中提供狀態資訊。

Widget 類別

假設目前有一個 Widget 類別。 Widget 類別具有一個方法,執行時間可能會很長,而且您希望應用程式能放置某種完成指示器。

當然,您可以讓 Widget 物件顯示完成百分比對話方塊,但之後在使用 Widget 類別的每個專案中,您都必須使用該對話方塊。 物件設計的一個重要準則是讓應用程式使用物件來處理使用者介面,除非物件的主要用途是管理表單或對話方塊。

Widget 的目的是執行其他工作,因此最好新增 PercentDone 事件,讓呼叫 Widget 方法的程序處理該事件並顯示狀態更新。 PercentDone 事件也可以提供取消工作的機制。

建置用於本主題的程式碼範例

  1. 開啟新的 Visual Basic Windows 應用程式專案,並建立名為 Form1 的表單。

  2. 將兩個按鈕和標籤新增至 Form1

  3. 依照下表所示的方式,命名物件。

    Object 屬性 設定
    Button1 Text 啟動工作
    Button2 Text 取消
    Label (Name)Text lblPercentDone, 0
  4. 在 [專案] 功能表上,選擇 [新增類別],將 Widget.vb 類別新增至專案。

宣告 Widget 類別的事件

  • 使用 Event 關鍵字在 Widget 類別中宣告事件。 請注意,事件可以有 ByValByRef 引數,如 WidgetPercentDone 事件所示:

    Public Event PercentDone(ByVal Percent As Single,
                             ByRef Cancel As Boolean)
    

呼叫物件收到 PercentDone 事件時,Percent 引數會包含已完成的工作百分比。 您可以將 Cancel 引數設為True ,以取消引發事件的方法。

注意

就像程序的引數一樣,您可以宣告事件引數,但有下列例外狀況:事件不能有 OptionalParamArray 引數,而且事件沒有傳回值。

事件 PercentDone 是由 Widget 類別的 LongTask 方法所引發。 LongTask 會採用兩個引數:方法假裝要執行工作的時間長度,以及 LongTask 暫停以引發 PercentDone 事件前的最小時間間隔。

引發 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 屬性會傳回自午夜算起經過的秒數,因此如果應用程式是在午夜之前啟動,就會陷入停滯狀態。 更仔細的測量時間方法會考慮這類界限條件,或使用 Now 之類的屬性來避免此情況。

現在已經讓 Widget 類別引發事件,您可以前往下一個逐步解說。 逐步解說:處理事件示範如何使用 WithEvents 將事件處理常式與 PercentDone 事件產生關聯。

另請參閱