逐步解說:宣告和引發事件 (Visual Basic)
本逐步解說示範如何宣告和引發名為 Widget
之類別的事件。 完成這些步驟之後,您可以閱讀隨附主題逐步解說:處理事件,瞭解如何使用來自 Widget
物件的事件,在應用程式中提供狀態資訊。
Widget 類別
假設目前有一個 Widget
類別。 Widget
類別具有一個方法,執行時間可能會很長,而且您希望應用程式能放置某種完成指示器。
當然,您可以讓 Widget
物件顯示完成百分比對話方塊,但之後在使用 Widget
類別的每個專案中,您都必須使用該對話方塊。 物件設計的一個重要準則是讓應用程式使用物件來處理使用者介面,除非物件的主要用途是管理表單或對話方塊。
Widget
的目的是執行其他工作,因此最好新增 PercentDone
事件,讓呼叫 Widget
方法的程序處理該事件並顯示狀態更新。 PercentDone
事件也可以提供取消工作的機制。
建置用於本主題的程式碼範例
開啟新的 Visual Basic Windows 應用程式專案,並建立名為
Form1
的表單。將兩個按鈕和標籤新增至
Form1
。依照下表所示的方式,命名物件。
Object 屬性 設定 Button1
Text
啟動工作 Button2
Text
取消 Label
(Name)
、Text
lblPercentDone, 0 在 [專案] 功能表上,選擇 [新增類別],將
Widget.vb
類別新增至專案。
宣告 Widget 類別的事件
使用
Event
關鍵字在Widget
類別中宣告事件。 請注意,事件可以有ByVal
和ByRef
引數,如Widget
的PercentDone
事件所示:Public Event PercentDone(ByVal Percent As Single, ByRef Cancel As Boolean)
呼叫物件收到 PercentDone
事件時,Percent
引數會包含已完成的工作百分比。 您可以將 Cancel
引數設為True
,以取消引發事件的方法。
注意
就像程序的引數一樣,您可以宣告事件引數,但有下列例外狀況:事件不能有 Optional
或 ParamArray
引數,而且事件沒有傳回值。
事件 PercentDone
是由 Widget
類別的 LongTask
方法所引發。 LongTask
會採用兩個引數:方法假裝要執行工作的時間長度,以及 LongTask
暫停以引發 PercentDone
事件前的最小時間間隔。
引發 PercentDone 事件
若要簡化存取此類別所使用
Timer
屬性的流程,請在Class Widget
陳述式上方,將Imports
陳述式新增至類別模組的宣告區段頂端。Imports Microsoft.VisualBasic.DateAndTime
將下列程式碼新增至
Widget
類別:Public Sub LongTask(ByVal Duration As Single, ByVal MinimumInterval As Single) Dim Threshold As Single Dim Start As Single Dim blnCancel As Boolean ' The Timer property of the DateAndTime object returns the seconds ' and milliseconds that have passed since midnight. Start = CSng(Timer) Threshold = MinimumInterval Do While CSng(Timer) < (Start + Duration) ' In a real application, some unit of work would ' be done here each time through the loop. If CSng(Timer) > (Start + Threshold) Then RaiseEvent PercentDone( Threshold / Duration, blnCancel) ' Check to see if the operation was canceled. If blnCancel Then Exit Sub Threshold = Threshold + MinimumInterval End If Loop End Sub
的應用程式呼叫 LongTask
方法時,Widget
類別每隔 MinimumInterval
秒鐘就會引發 PercentDone
事件一次。 當事件傳回時,LongTask
會檢查 Cancel
引數是否設定為 True
。
這裡需提出一些免責聲明。 為了簡便性,LongTask
程序假設您事先知道工作需要多久的時間。 但實際上這幾乎不可能發生。 將工作分成大小均等的區塊相當很困難,而且對使用者來說最重要的,只有在收到事件發生指示前經過的時間長度。
您可能在此範例中發現另一個缺陷。 Timer
屬性會傳回自午夜算起經過的秒數,因此如果應用程式是在午夜之前啟動,就會陷入停滯狀態。 更仔細的測量時間方法會考慮這類界限條件,或使用 Now
之類的屬性來避免此情況。
現在已經讓 Widget
類別引發事件,您可以前往下一個逐步解說。 逐步解說:處理事件示範如何使用 WithEvents
將事件處理常式與 PercentDone
事件產生關聯。