Henry的VB.NET之旅(十三)—標準事件處理程式
???? Henry的VB.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. 語句來宣告派生類中的事件處理程式。問一個基本的問題,你看obj是Class2類的一個例項對吧?但為什麼它也具有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/相關文章
- 事件處理事件
- freeswitch的event事件處理事件
- 特徵預處理之歸一化&標準化特徵
- sqlldr標準輸出未處理導致批處理掛起問題SQL
- React事件處理React事件
- vue事件處理Vue事件
- JavaSwing 事件處理Java事件
- JavaScript事件處理JavaScript事件
- Flutter | 事件處理Flutter事件
- 手把手教你如何寫事件處理的程式碼事件
- W3C的事件處理和IE的事件處理有哪些區別?事件
- C++ 字串 cctype 標頭檔案標準庫處理函式C++字串函式
- 【scikit-learn基礎】--『預處理』之 標準化
- Java-GUI程式設計之事件處理JavaGUI程式設計事件
- redis的事件處理機制Redis事件
- react之事件處理React事件
- 事件分發之View事件處理事件View
- Event Handler 事件處理程式 2 —跨瀏覽器事件物件《高程3》事件瀏覽器物件
- React 中常用的事件處理方式React事件
- 基於python的事件處理模型Python事件模型
- SpringBoot第十三篇:日誌處理Spring Boot
- 事件分發和處理事件
- Laravel 事件&非同步處理Laravel事件非同步
- Python學習之旅(三十三)Python
- Netty中自定義事件處理程式和監聽器Netty事件
- [轉] Scala 中的非同步事件處理非同步事件
- Nginx 超時事件的處理機制Nginx事件
- nginx 是如何處理過期事件的?Nginx事件
- Android的事件處理——監聽介面方式Android事件
- 關於Android的幾種事件處理Android事件
- 簡單探討C#中GUI程式設計的標準事件問題C#GUI程式設計事件
- SSIS中使用事件處理程式的五個步驟(上)JE事件
- SSIS中使用事件處理程式的五個步驟(下)UJ事件
- python中時間處理標準庫DateTime加強版庫:pendulumPython
- tabbar凸起點選事件處理tabBar事件
- React 深入系列5:事件處理React事件
- 自定義事件相容處理物件事件物件
- Java——事件處理機制概要Java事件
- Flink - CEP(複雜事件處理)事件