逐步解說:處理事件 (Visual Basic)
這是兩個示範如何處理事件主題中的第二個主題。 第一個主題,逐步解說:宣告和引發事件,示範如何宣告和引發事件。 本節會使用該逐步解說中的表單和類別,示範如何在事件發生時處理事件。
Widget
類別範例會使用傳統的事件處理陳述式。 Visual Basic 提供處理事件的其他技巧。 您可以修改此範例以使用 AddHandler
和 Handles
陳述式作為練習。
處理 Widget 類別的 PercentDone 事件
將下列程式碼放在
Form1
中:Private WithEvents mWidget As Widget Private mblnCancel As Boolean
WithEvents
關鍵字會指定變數mWidget
用來處理物件的事件。 您可以藉由提供要從中建立物件的類別名稱來指定物件種類。變數
mWidget
會在Form1
中宣告,因為WithEvents
變數必須是類別層級。 無論您放置變數的類別類型為何,都適用此原則。變數
mblnCancel
用於取消LongTask
方法。
撰寫程式碼來處理事件
一旦您使用 WithEvents
來宣告變數,變數名稱就會出現在類別的程式碼編輯器左側下拉式清單中。 當您選取 mWidget
時,Widget
類別的事件會出現在右側下拉式清單中。 選取事件會顯示對應的事件程序,其中包含前置詞 mWidget
和底線。 與 WithEvents
變數相關聯的所有事件程序都會指定變數名稱做為前置詞。
處理事件
從 [程式碼編輯器] 中的左側下拉式清單中選取
mWidget
。從右側下拉式清單中選取
PercentDone
事件。 [程式碼編輯器] 會開啟mWidget_PercentDone
事件程序。注意
程式碼編輯器對於插入新的事件處理常式很有用,但並非必要。 在本逐步解說中,您可更直接將事件處理常式複製到程式碼。
將下列程式碼加入至
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
方法允許重新繪製標籤,同時也讓使用者有機會按一下 [取消] 按鈕。針對
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
變數,建立物件並為其指派參考。
建立物件並為其指派參考
從 [程式碼編輯器] 的左側下拉式清單中選取 [(Form1 事件)]。
從右側下拉式清單中選取
Load
事件。 [程式碼編輯器] 會開啟Form1_Load
事件程序。為
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
而停止。 只有在先前的案例中,才會更新完成百分比。
執行程式
按 F5 將專案設置為執行模式。
按一下 [開始工作] 按鈕。 每次引發
PercentDone
事件時,會將標籤更新為已完成工作的百分比。按一下 [取消] 按鈕以停止工作。 請注意,當您按一下 [取消] 按鈕時,[取消] 按鈕的外觀不會立即變更。 直到
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
變數的陣列。