共用方式為


操作指南:宣告和引發事件(Visual Basic)

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

Widget 類別

假設暫時您擁有一個Widget類別。 您的 Widget 類別有一個方法,可能需要很長的時間才能執行,而且您希望應用程式能夠放置某種完成指示器。

當然,您可以讓 Widget 對象顯示百分比完成對話框,但之後,您會在您使用 Widget 類別的每個專案中,使用該對話方塊。 對象設計的良好準則是讓使用對象處理使用者介面的應用程式,除非物件的全部用途是管理表單或對話方塊。

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

若要建置本主題的程式代碼範例

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

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

  3. 將物件命名為如下表所示。

    物體 房產 設定
    Button1 Text 啟動工作
    Button2 Text 取消
    Label (Name)Text 完成百分比,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 是由 LongTask 類別的 Widget 方法所引發。 LongTask 會採用兩個自變數:方法假裝要執行工作的時間長度,以及暫停前 LongTask 的最小時間間隔,以引發 PercentDone 事件。

引發 PercentDone 事件

  1. 若要簡化對這個類別所使用屬性的Timer存取,請在類別模組的宣告區段頂端新增Imports語句,將其放置於Class Widget語句之上。

    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 會每隔 PercentDone 秒引發 MinimumInterval 事件一次。 當事件傳回時, LongTask 檢查自變數是否 Cancel 設定為 True

這裡需要一些免責聲明。 為了簡單起見,程式 LongTask 會假設您事先知道工作需要多久的時間。 這幾乎從來不是這樣。 將工作分成均勻大小的區塊可能會很困難,對用戶來說,最重要的事情通常只是等待某些情況正在發生的提示所需要的時間。

您可能在此範例中發現了另一個缺陷。 屬性 Timer 會傳回自午夜之後經過的秒數,因此,如果應用程式在午夜之前啟動,就會卡住。 更仔細的測量時間方法會考慮這類界限條件,或使用 之類的 Now屬性來避免它們。

既然類別 Widget 可以引發事件,您可以移至下一個操作說明。 逐步解說:處理事件 示範如何使用 WithEvents 將事件處理程式與 PercentDone 事件產生關聯。

另請參閱