共用方式為


逐步說明:處理事件 (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允許事件處理發生,事件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. 按兩下 [ 取消] 按鈕以停止工作。 請注意,當您按兩下 [取消] 按鈕時,不會立即變更 [ 取消 ] 按鈕的外觀。 當Click語句允許事件處理時,My.Application.DoEvents事件才能發生。

    備註

    My.Application.DoEvents方法不會以與表單完全相同的方式處理事件。 例如,在此逐步解說中,您必須按兩下 [ 取消 ] 按鈕兩次。 若要允許表單直接處理事件,您可以使用多線程。 如需詳細資訊,請參閱 Managed Threading

您可能會發現它具有學習性,使用 F11 執行程式,並逐行執行程式碼。 您可以清楚地看到執行如何進入LongTask,然後在每次引發Form1事件時短暫地重新進入PercentDone

如果在程式的Form1中執行時,再次呼叫LongTask方法,會發生什麼事? 在最糟的情況下,如果在每次事件引發時呼叫 LongTask,就可能會發生堆栈溢出。

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

處理不同小工具的事件

  • 將下列程式代碼行新增至 Button1_Click 程式,緊接在讀取 mWidget.LongTask(12.2, 0.33)的行前面:

    mWidget = New Widget
    ' Create a new Widget object.
    

此程式代碼會在每次按下按鈕時建立新的 WidgetLongTask方法一完成,就會釋放Widget的參考,然後Widget會被銷毀。

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

備註

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

另請參閱