Henry的VB.NET之旅(十三)—標準事件處理程式

latitude發表於2004-02-05

???? HenryVB.NET之旅(十三)標準事件處理程式<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

??????????????????????????????????? 韓睿

?

“感興趣就好!”大李微微點點頭,然後問我道,“你知道程式是怎麼知道哪些物件可以引發何種事件,以及怎麼樣把事件和事件處理程式關聯起來?”

見到我迷茫的眼神,大李用滑鼠點選開啟被Region合起來的“Windows 窗體設計器生成的程式碼”,指著中間的一句自動生成的程式碼:

??? Friend WithEvents Button1 As System.Windows.Forms.Button

?

“當你在設計視窗往窗體上新增了一個按鈕後,會自動在程式碼中加入這句程式碼,Friend 關鍵字授予對一個或多個所宣告的程式設計元素的友元訪問許可權。那麼WithEvent是幹什麼的?”

我立刻在幫助中查詢,有了:

WithEvents 關鍵字指示被宣告的物件變數引用可以引發事件的類例項。

“明白了,”我也不能總傻聽著,“在宣告物件的時候用WithEvents來進行標識,再在事件處理程式中的過程宣告結尾處使用 Handles 關鍵字將就可以處理由使用 WithEvents 關鍵字宣告的物件變數所引發的事件了。”

“沒錯,你看來我寫一段程式碼,使用的就是WithEvent-Handles的方法來處理事件。類名為CHenry吧,它內含一個事件EventHR。”

?

Module Module1

???? Public Class CHenry

??????? Public Event EventHR()??? ' 宣告一個事件

??????? Sub CauseSomeEvent()

??????????? RaiseEvent EventHR()?? ' 引發事件

??????? End Sub

??? End Class

?

??? WithEvents Obj As New CHenry()?? '模組或類級別的宣告

??? Sub Obj_EventHR() Handles Obj.EventHR '在Handles之後宣告事件

??????? MsgBox("事件處理器捕捉到了事件.")?? '處理事件.

??? End Sub

??? Sub Main()

??????? Obj.CauseSomeEvent()?? '呼叫物件去引發事件

??? End Sub

End Module

?

“你要注意的是怎麼樣通過RaiseEvent來引發事件,另外一個很簡單的問題也需要注意的是,事件處理程式的命名一般是用‘物件名_事件名’的方式。”大李邊寫程式邊指點說。

“事件的宣告和引發是隻能在一個層次內,還是可以在派生類裡引發基類的事件?”我不由好奇地問。

“你開始學會思考了,”大李不知道是不是在嘲笑我,“VB.NET要求必須在宣告事件的範圍內引發事件。派生類不能引發從基類繼承的事件,但是可以處理基類引發的事件。我們可以來看一個示例。”大李馬上對剛寫的程式碼進行了修改:

?

Module Module1

???? Public Class CHenry

??????? Public Event EventHR()??? ' 宣告一個事件

??????? Sub CauseSomeEvent()

??????????? RaiseEvent EventHR()?? ' 引發事件

??????? End Sub

??? End Class

??? Public Class Class2  Chenry派生而來的類

??????? Inherits CHenry

??????? Sub Obj_EventHR() Handles MyBase.EventHR

??????????? MsgBox("事件處理器捕捉到了事件.")?? '處理事件.

??????? End Sub

??? End Class

?

??? WithEvents Obj As New Class2()?? '模組或類級別的宣告

??? Sub Main()

??????? Obj.CauseSomeEvent()?? '呼叫物件去引發事件

? ??End Sub

End Module

?

“還記得我跟你說過MyBase的意義了吧?(注:詳見《構造與析構》一篇)我們可以新增 Handles MyBase. 語句來宣告派生類中的事件處理程式。問一個基本的問題,你看objClass2類的一個例項對吧?但為什麼它也具有Chenry類才有的CauseSomeEvent方法?”大李說得我眼球都快掉下來了。

“當然是因為Class2是CHenry類的派生類,繼承了它的方法唄。”我神情極為沮喪。

“哈哈,別急呀,在VB.NET中我們最常碰到的就是物件導向的問題。不斷回顧有好處,溫故而知新!”大李最後的微笑對我倒不啻為一句忠告。要學好VB.NET,我還真得好好複習一下物件導向的內容。

大李話題一轉,淡淡地跟我說:“WithEvents 語句和 Handles 子句提供了標準的陳述性指定事件處理程式的方法。也就是如何把物件的事件和某一個事件處理程式進行關聯。WithEvents 所宣告物件引發的事件可以由任何過程用命名此事件的 Handles 子句來處理。換句話說,有Handles子句標識的事件處理程式也只能處理由WithEvents宣告的物件。雖然 Handles 子句是關聯事件與事件處理程式的標準方法,它僅限於在編譯時關聯事件與事件處理程式。還有一種方法可以允許在執行時動態地將事件與一個或更多的事件處理程式連線或者斷開,而並不要求使用 WithEvents 來宣告物件變數。”

“是嗎?”我一下子從沉思中驚醒過來,好奇心又一次襲來。

?

(未完待續)

---------------------------------------------------------------

宣告:本文版權與解釋權歸韓睿所有,如需轉載,請保留完整的內容及此宣告。

QQ: 18349592

E-Mail: henry7685@hotmail.com

???? 請訪問本人專欄:http://www.csdn.net/develop/author/netauthor/Latitude/

相關文章