Henry的VB.NET之旅(十二)—事件驅動

latitude發表於2004-02-05

       HenryVB.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程式是那麼的簡單。現在的參量Sendere是幹什麼用的?那個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後面寫了兩個事件的宣告,就可以在同一段程式碼中對兩個物件進行控制。另外,利用Sendere我們還可以更方便地構建與呼叫自己的事件處理程式。“大李邊寫邊說。

“是嗎?怎麼實現?”我不由被激發出了濃濃的興趣。

(未完待續)

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

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

QQ: 18349592

E-Mail: henry7685@hotmail.com

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

相關文章