這是示範如何使用事件的兩個主題中的第二個主題。 第一個主題 逐步解說:宣告和引發事件,示範如何宣告和引發事件。 本節使用該步驟解說中的窗體和類別,示範如何在事件發生時進行處理。
類別 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
允許事件處理發生,事件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
引發事件時,標籤都會以任務完成百分比更新。按兩下 [ 取消] 按鈕以停止工作。 請注意,當您按兩下 [取消] 按鈕時,不會立即變更 [ 取消 ] 按鈕的外觀。 當
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.
此程式代碼會在每次按下按鈕時建立新的 Widget
。
LongTask
方法一完成,就會釋放Widget
的參考,然後Widget
會被銷毀。
WithEvents
變數一次只能包含一個對象參考,因此如果您將不同的Widget
物件指派給 mWidget
,將不會再處理先前Widget
物件的事件。 如果 mWidget
是唯一包含對舊 Widget
之參考的物件變數,則會終結物件。 如果您想要處理來自數個 Widget
物件的事件,請使用 AddHandler
語句個別處理每個物件的事件。
備註
您可以視需要宣告多個 WithEvents
變數,但不支援變數陣列 WithEvents
。