国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

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

2024-07-10 13:01:22
字體:
來源:轉載
供稿:網友
henry的vb.net之旅(十二)—事件驅動

韓睿



“可視繼承原來這么方便!”我心中默默地感嘆一聲。一會兒之后,我抬頭掃了一眼屏幕上的代碼后,突然發現了一個新問題,按鈕的單擊事件程序現在已經變成了:

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我們還可以更方便地構建與調用自己的事件處理程序。“大李邊寫邊說。

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

(未完待續)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 兴安盟| 临朐县| 雅安市| 富蕴县| 麻江县| 明光市| 肥西县| 建水县| 东乌珠穆沁旗| 平乡县| 湟中县| 皮山县| 通山县| 壤塘县| 和政县| 那曲县| 桂阳县| 莱州市| 景泰县| 祁连县| 剑河县| 离岛区| 铅山县| 靖西县| 昭苏县| 三门峡市| 勐海县| 易门县| 白沙| 竹北市| 岚皋县| 施秉县| 登封市| 汉沽区| 彭水| 呼图壁县| 谷城县| 靖州| 潜江市| 樟树市| 桂东县|