Share via


逐步解說:處理事件 (Visual Basic)

這是兩個示範如何處理事件主題中的第二個主題。 第一個主題,逐步解說:宣告和引發事件,示範如何宣告和引發事件。 本節會使用該逐步解說中的表單和類別,示範如何在事件發生時處理事件。

Widget 類別範例會使用傳統的事件處理陳述式。 Visual Basic 提供處理事件的其他技巧。 您可以修改此範例以使用 AddHandlerHandles 陳述式作為練習。

處理 Widget 類別的 PercentDone 事件

  1. 將下列程式碼放在 Form1 中:

    Private WithEvents mWidget As Widget
    Private mblnCancel As Boolean
    

    WithEvents 關鍵字會指定變數 mWidget 用來處理物件的事件。 您可以藉由提供要從中建立物件的類別名稱來指定物件種類。

    變數 mWidget 會在 Form1 中宣告,因為 WithEvents 變數必須是類別層級。 無論您放置變數的類別類型為何,都適用此原則。

    變數 mblnCancel 用於取消 LongTask 方法。

撰寫程式碼來處理事件

一旦您使用 WithEvents 來宣告變數,變數名稱就會出現在類別的程式碼編輯器左側下拉式清單中。 當您選取 mWidget 時,Widget 類別的事件會出現在右側下拉式清單中。 選取事件會顯示對應的事件程序,其中包含前置詞 mWidget 和底線。 與 WithEvents 變數相關聯的所有事件程序都會指定變數名稱做為前置詞。

處理事件

  1. 從 [程式碼編輯器] 中的左側下拉式清單中選取 mWidget

  2. 從右側下拉式清單中選取 PercentDone 事件。 [程式碼編輯器] 會開啟 mWidget_PercentDone 事件程序。

    注意

    程式碼編輯器對於插入新的事件處理常式很有用,但並非必要。 在本逐步解說中,您可更直接將事件處理常式複製到程式碼。

  3. 將下列程式碼加入至 mWidget_PercentDone 事件處理常式:

    Private Sub mWidget_PercentDone(
        ByVal Percent As Single,
        ByRef Cancel As Boolean
    ) Handles mWidget.PercentDone
        lblPercentDone.Text = CInt(100 * Percent) & "%"
        My.Application.DoEvents()
        If mblnCancel Then Cancel = True
    End Sub
    

    每當引發 PercentDone 事件時,事件程序會在 Label 控制項中顯示完成百分比。 DoEvents 方法允許重新繪製標籤,同時也讓使用者有機會按一下 [取消] 按鈕。

  4. 針對 Button2_Click 事件處理常式新增下列程式碼:

    Private Sub Button2_Click(
        ByVal sender As Object,
        ByVal e As System.EventArgs
    ) Handles Button2.Click
        mblnCancel = True
    End Sub
    

如果使用者在 LongTask 執行時按一下 [取消] 按鈕,一旦 DoEvents 陳述式允許事件處理,就會執行 Button2_Click 事件。 類別層級變數 mblnCancel 設定為 True,然後mWidget_PercentDone 事件會進行測試,並將 ByRef Cancel 引數設定為 True

將 WithEvents 變數連接到物件

現在,已設定 Form1 以處理 Widget 物件的事件。 剩下要做的事,就是尋找某處的 Widget

當您在設計階段宣告變數 WithEvents 時,沒有任何物件與其相關聯。 WithEvents 變數就像任何其他物件變數一樣。 您必須使用 WithEvents 變數,建立物件並為其指派參考。

建立物件並為其指派參考

  1. 從 [程式碼編輯器] 的左側下拉式清單中選取 [(Form1 事件)]

  2. 從右側下拉式清單中選取 Load 事件。 [程式碼編輯器] 會開啟 Form1_Load 事件程序。

  3. Form1_Load 事件程序新增下列程式碼,以建立 Widget

    Private Sub Form1_Load(
        ByVal sender As System.Object,
        ByVal e As System.EventArgs
    ) Handles MyBase.Load
        mWidget = New Widget
    End Sub
    

當此程式碼執行時,Visual Basic 會建立 Widget 物件,並將其事件連接到與 mWidget 相關聯的事件程序。 從那時起,每當 Widget 引發其 PercentDone 事件時,將會執行 mWidget_PercentDone 事件程序。

呼叫 LongTask 方法

  • 將下列程式碼加入至 Button1_Click 事件處理常式:

    Private Sub Button1_Click(
        ByVal sender As Object,
        ByVal e As System.EventArgs
    ) Handles Button1.Click
        mblnCancel = False
        lblPercentDone.Text = "0%"
        lblPercentDone.Refresh()
        mWidget.LongTask(12.2, 0.33)
        If Not mblnCancel Then lblPercentDone.Text = CStr(100) & "%"
    End Sub
    

呼叫 LongTask 方法之前,必須初始化顯示完成百分比的標籤,而且取消方法的類別層級 Boolean 旗標必須設定為 False

LongTask 會以 12.2 秒的工作持續時間呼叫。 PercentDone 事件會每隔三分之一秒引發一次。 每次引發事件時,都會執行 mWidget_PercentDone 事件程序。

LongTask 完成時,將會測試 mblnCancel 以查看 LongTask 是否正常結束,或是否因為 mblnCancel 設為 True 而停止。 只有在先前的案例中,才會更新完成百分比。

執行程式

  1. 按 F5 將專案設置為執行模式。

  2. 按一下 [開始工作] 按鈕。 每次引發 PercentDone 事件時,會將標籤更新為已完成工作的百分比。

  3. 按一下 [取消] 按鈕以停止工作。 請注意,當您按一下 [取消] 按鈕時,[取消] 按鈕的外觀不會立即變更。 直到 My.Application.DoEvents 陳述式允許事件處理之後,才會發生 Click 事件。

    注意

    My.Application.DoEvents 方法不會使用與表單相同的方式來處理事件。 例如,在此逐步解說中,您必須按一下 [取消] 按鈕兩次。 若要直接讓表單處理事件,您可以使用多執行緒。 如需詳細資訊,請參閱受控執行緒

您可能會發現使用 F11 執行程式,並逐行瀏覽程式碼很有幫助。 您可以清楚了解執行如何輸入 LongTask,然後在每次引發 PercentDone 事件時,短暫地重新輸入 Form1

如果執行回到 Form1 的程式碼,再次呼叫 LongTask 方法會發生什麼事? 在最壞的情況下,如果每次引發事件時呼叫 LongTask,可能會發生堆疊溢位。

您可以將新的 Widget 參考指派給 mWidget,讓變數 mWidget 處理不同 Widget 物件的事件。 事實上,您可以在每次按一下按鈕時,讓 Button1_Click 中的程式碼執行此動作。

處理不同小工具的事件

  • 請將下列程式碼新增至 Button1_Click 程序,緊接在 mWidget.LongTask(12.2, 0.33) 這行前面:

    mWidget = New Widget
    ' Create a new Widget object.
    

上述程式碼會在每次按一下按鈕時,建立新的 Widget。 一旦 LongTask 方法完成,就會釋出對 Widget 的參考,並終結 Widget

WithEvents 變數一次只能包含一個物件參考,因此,如果您將不同的 Widget 物件指派給 mWidget,將不會再處理先前 Widget 物件的事件。 如果 mWidget 是唯一包含舊 Widget 參考的物件變數,則會終結物件。 如果您想要處理來自數個 Widget 物件的事件,請使用 AddHandler 陳述式來個別處理每個物件的事件。

注意

您可以視需要宣告多個 WithEvents 變數,但不支援 WithEvents 變數的陣列。

另請參閱