本逐步指南示範如何宣告和引發名為 Widget
之類別的事件。 完成這些步驟後,您可能會想閱讀附隨的主題 逐步解說:處理事件,這其中顯示如何使用 Widget
物件提供應用程式狀態資訊的事件。
Widget 類別
假設暫時您擁有一個Widget
類別。 您的 Widget
類別有一個方法,可能需要很長的時間才能執行,而且您希望應用程式能夠放置某種完成指示器。
當然,您可以讓 Widget
對象顯示百分比完成對話框,但之後,您會在您使用 Widget
類別的每個專案中,使用該對話方塊。 對象設計的良好準則是讓使用對象處理使用者介面的應用程式,除非物件的全部用途是管理表單或對話方塊。
Widget
的目的是執行其他任務,因此最好新增一個 PercentDone
事件,並讓呼叫 Widget
方法的程序處理該事件並顯示狀態更新。 事件 PercentDone
也可以提供取消工作的機制。
若要建置本主題的程式代碼範例
開啟新的 Visual Basic Windows 應用程式專案,並建立名為
Form1
的表單。將兩個按鈕與標籤新增至
Form1
。將物件命名為如下表所示。
物體 房產 設定 Button1
Text
啟動工作 Button2
Text
取消 Label
(Name)
、Text
完成百分比,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
是由 LongTask
類別的 Widget
方法所引發。
LongTask
會採用兩個自變數:方法假裝要執行工作的時間長度,以及暫停前 LongTask
的最小時間間隔,以引發 PercentDone
事件。
引發 PercentDone 事件
若要簡化對這個類別所使用屬性的
Timer
存取,請在類別模組的宣告區段頂端新增Imports
語句,將其放置於Class Widget
語句之上。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
會每隔 PercentDone
秒引發 MinimumInterval
事件一次。 當事件傳回時, LongTask
檢查自變數是否 Cancel
設定為 True
。
這裡需要一些免責聲明。 為了簡單起見,程式 LongTask
會假設您事先知道工作需要多久的時間。 這幾乎從來不是這樣。 將工作分成均勻大小的區塊可能會很困難,對用戶來說,最重要的事情通常只是等待某些情況正在發生的提示所需要的時間。
您可能在此範例中發現了另一個缺陷。 屬性 Timer
會傳回自午夜之後經過的秒數,因此,如果應用程式在午夜之前啟動,就會卡住。 更仔細的測量時間方法會考慮這類界限條件,或使用 之類的 Now
屬性來避免它們。
既然類別 Widget
可以引發事件,您可以移至下一個操作說明。
逐步解說:處理事件 示範如何使用 WithEvents
將事件處理程式與 PercentDone
事件產生關聯。