這是示範如何使用事件的兩個主題中的第二個主題。 第一個主題 逐步解說:宣告和引發事件,示範如何宣告和引發事件。 本節使用該步驟解說中的窗體和類別,示範如何在事件發生時進行處理。
類別 Widget 範例會使用傳統的事件處理語句。 Visual Basic 提供其他處理事件的技術。 作為練習,您可以修改此範例來使用 AddHandler 和 Handles 語句。
處理 Widget 類別的 PercentDone 事件
將下列程式代碼放在
Form1中:Private WithEvents mWidget As Widget Private mblnCancel As BooleanWithEvents關鍵詞會指定變數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 。