Henry的VB.NET之旅(十二)—事件驅動
Henry的VB.NET之旅(十二)—事件驅動<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
韓睿
“可視繼承原來這麼方便!”我心中默默地感嘆一聲。一會兒之後,我抬頭掃了一眼螢幕上的程式碼後,突然發現了一個新問題,按鈕的單擊事件程式現在已經變成了:
VB.NET程式 |
VB程式 |
Private Sub btnProtected_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProtected.Click MsgBox("派生的保護按鈕") End Sub
|
Private Sub Command1_Click() …… End Sub
|
而原來的VB程式是那麼的簡單。現在的參量Sender和e是幹什麼用的?那個Handles又是什麼東東?還好有老師,我立刻起身,厚著臉把大李請過來,把疑問一一說給他聽。
大李推了推眼鏡,反問我道:“你應該對Windows程式設計中的事件驅動程式設計很熟悉吧?”(注:此處的Windows是指Win9X及其以上的作業系統)
“是呀!”看來反問是大李授課的開篇詞了,但我也只好先往他的圈套裡跳,“事件驅動就是說應用程式的執行流程是由外界發生的事件所確定的。也就是接受到任務才工作的模式。事件就是一個訊號,它告知應用程式有重要情況要發生。實際上的執行情況是,各個應用程式把負責不同工作的物件在其執行期間送入Windows作業系統,讓這些物件等待Windows產生的事件,然後加以處理。”
“VB程式設計師一般也只需要象你這樣理解就行了。”大李的話真讓我觸動,“應該說是Windows先產生訊息,應用程式中的視窗程式window procedure能接收來自windows的訊息,並將其轉化為事件,這個我們以後再說。現在來看看事件驅動程式的組成,主要是有事件、物件和事件處理程式三個要素。物件就是完成任務的主體,比如你說的Button1;事件麼,就是物件要執行的任務,比如單擊,就是click事件;那麼事件處理程式就是Button1_Click這段程式了。”
“這個我知道呀!我只是想問一下Sender……”我疑惑地迴應道。
大李哥搖搖手,打斷了我的話。“如果你真正清楚事件驅動的話,就明白了。你看一下,Sender是什麼型別的變數?”
“object呀!”我無奈地問道著,“但是,……”我隱約感覺到了什麼。
大李微笑著說,“sender as object,就一語道破它的來源與用途。object是支援 .NET 框架類層次結構中的所有類,併為派生類提供低階別服務。這是 .NET 框架中所有類的最終超類;它是型別層次結構的根。一般來說,sender在形參中表示引發事件的源頭,就是我剛才所說的三要素中的‘物件’。如果在控制元件引發的事件中寫程式碼的話,一般都不需要再重新指派,因為它已經預設為是該控制元件了。當自己寫程式碼來呼叫某事件程式時,就要註明sender是何物了。”
“也就是說,sender是提供給在事件處理程式程式碼內部或外部進行呼叫的嗎?”我仍有點不明白。
“可以這樣說,你難道看不出VB.NET提供給我們的是更全面、更直接的控制嗎?再說e,表示的是事件資料,就是一個事件激發所需要的狀態資訊。在事件引發時不向事件處理程式傳遞狀態資訊的事件會將e設為Eventargs。如果事件處理程式需要狀態資訊,則應用程式必須從此類派生一個類來儲存資料。比如Mousedown事件,系統需要判斷mouse的位置、判斷是左中右哪個鍵點選了、判斷點選了幾下等等,因此該e就必需是System.Windows.Forms.MouseEventArgs類的例項。”大李繼續解說著。
“哦,也就是說e是和事件密切相關的嘍?”我開始用實際操作來證實一下,我在程式碼視窗的“類名”下拉選單中選擇了Button1,在其右邊的“方法名稱”下拉選單中選擇了MosueDown方法,出現的就是Button1.MouseDown事件處理程式程式碼段:
Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown End Sub |
果然,看到e的型別變為System.Windows.Forms.MouseEventArgs。我在程式碼段內寫下e,然後在其後打一個點,出現了一個智慧感知選單(如圖1所示):
與button1.click事件相比,button1.Mosuedown事件中的e的屬性和方法多出了五個描述事件特徵的屬性,見表1所述。
Button |
獲取曾按下的是哪個滑鼠按鈕。 |
Clicks |
獲取按下並釋放滑鼠按鈕的次數。 |
Delta |
獲取滑鼠輪已轉動的制動器數的有符號計數。制動器是滑鼠輪的一個凹口。 |
X |
獲取滑鼠單擊的 x 座標。 |
Y |
獲取滑鼠單擊的 y 座標。 |
表1 多出的e的屬性
“我明白了,那麼Handles關鍵字是不是就是用於宣告程式碼是要處理哪個事件的處理過程呢?”我終於開了點竅。
“是的,可不要小看Handles,好好利用它,你的程式會變得簡潔和靈活。”大李邊說邊給我寫了一段程式碼:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button1.Click, Button2.Click Select Case sender.name Case "Button1" MsgBox("你點選的是button1") Case "Button2" MsgBox("你點選的是button2") End Select End Sub
|
“在Handles後面寫了兩個事件的宣告,就可以在同一段程式碼中對兩個物件進行控制。另外,利用Sender和e我們還可以更方便地構建與呼叫自己的事件處理程式。“大李邊寫邊說。
“是嗎?怎麼實現?”我不由被激發出了濃濃的興趣。
(未完待續)
---------------------------------------------------------------
宣告:本文版權與解釋權歸韓睿所有,如需轉載,請保留完整的內容及此宣告。
QQ: 18349592
E-Mail: henry7685@hotmail.com
請訪問本人專欄:http://www.csdn.net/develop/author/netauthor/Latitude/
相關文章
- Henry的VB.NET之旅(十五)—動態事件處理方法事件
- Henry的VB.NET之旅(十四)—動態關聯事件與處理程式事件
- Henry的VB.NET之旅(十三)—標準事件處理程式事件
- Henry的VB.NET之旅(八)—介面
- Henry的VB.NET之旅(九)—介面繼承繼承
- Henry的VB.NET之旅(十)—何時用介面
- Henry的VB.NET之旅(十一)—可視繼承繼承
- 事件驅動的微服務-事件驅動設計事件微服務
- Henry手記-VB.net WinForm中的FORM初探(二) (轉)ORM
- RocketMQ 事件驅動:雲時代的事件驅動有啥不同?MQ事件
- Repository的事件驅動事件
- Redis 中的事件驅動模型Redis事件模型
- 我對事件驅動的理解事件
- Spring:事件驅動Spring事件
- 事件驅動程式設計事件程式設計
- “訊息驅動、事件驅動、流 ”基礎概念解析事件
- 事件驅動系統中不同型別的事件 - frankdejonge事件型別
- 事件驅動架構EDA中的元件事件架構元件
- 混合雲中的事件驅動架構事件架構
- Oracle事件驅動的排程作業Oracle事件
- Spring中的事件驅動模型(一)Spring事件模型
- 事件驅動及其設計模式事件設計模式
- 事件驅動架構設計事件架構
- 事件驅動,Do you know?事件
- 精簡化事件:事件驅動架構的精益力量事件架構
- Netty背後的事件驅動機制Netty事件
- 基於 Redis驅動的 Laravel 事件廣播RedisLaravel事件
- 一個事件驅動的圖片爬蟲事件爬蟲
- 事件驅動的元件框架Flight介紹事件元件框架
- 基於事件驅動的測試框架ETS事件框架
- 【譯】理解Node事件驅動架構事件架構
- 小馬哥Spring事件驅動模型Spring事件模型
- Zilla:一個事件驅動的API閘道器事件API
- 領域框架事件驅動的時序問題框架事件
- 基於事件驅動的Oracle作業排程事件Oracle
- 領域驅動設計(DDD)實踐之路(二):事件驅動與CQRS事件
- 基於spring實現事件驅動Spring事件
- AI 事件驅動場景 Serverless 實踐AI事件Server