Henry的VB.NET之旅(十五)—動態(tài)事件處理方法
2024-07-10 13:01:22
供稿:網(wǎng)友
henry的vb.net之旅(十五)—動態(tài)事件處理方法
韓睿
“大李哥,”我不免為自己問了如此多的問題而不好意思起來,“您剛才所說的事件的委托是怎么回事呀?”
大李顯然是明白我會提問的:“我所說過事件驅(qū)動設(shè)計(jì)中的三要素你還記得吧?”
“當(dāng)然,就是指對象、事件和事件處理程序。”我流利地回答道。
“對象和事件處理程序我們已經(jīng)分析過了。要想徹底了解事件驅(qū)動程序的來龍去脈,我們必須了解事件的構(gòu)成。”見到我又一次茫然地?fù)u頭,他就接著說,“事件功能是由三個互相聯(lián)系的元素提供的:提供事件數(shù)據(jù)的類、事件委托和引發(fā)事件的類。我說過,事件就是一個信號,它告知應(yīng)用程序有重要情況要發(fā)生。那么我們可以想象一下,事件要發(fā)生,就會含有獨(dú)特的信息,比如,事件發(fā)送源是什么,會發(fā)生什么樣的事件。提供事件數(shù)據(jù)的類就是用于記錄這些信息的。該類必須從 system.eventargs 派生出,這個我們已經(jīng)說過了;事件的委托,這其實(shí)我也說過了,就好比是指向事件接收方的一個指針,由于指定對象的事件是獨(dú)特的,所以它的委托也是事先定義好的,就比如mousedown事件,它對應(yīng)的委托就是mouseeventhandler。我們看一下你在代碼窗口選label1對象的mousedown方法,會自動生成這段空的事件處理程序:
friend withevents label1 as system.windows.forms.label
private sub label1_mousedown(byval sender as object, byval e as _
system.windows.forms.mouseeventargs) handles label1.mousedown
end sub
它其實(shí)就等同于:
addhandler label1.mousedown, addressof label1_mousedown
private sub label1_mousedown(byval sender as object, byval e as _
system.windows.forms.mouseeventargs)
end sub
隱含的意思,就是通過先前已經(jīng)聲明為全局變量的事件委托mouseeventhandler來實(shí)現(xiàn)事件處理程序參數(shù)的定義。對于mousedown事件而言,為什么自動加上的事件數(shù)據(jù)類參量是mouseeventargs類的,就是委托的作用了。
第三個要素是引發(fā)事件的類。該類必須提供事件的聲明和引發(fā)事件的方法。其中引發(fā)事件的方法必須命名為on加上事件名的形式,比如事件是eventhr,那么引發(fā)事件的方法就一定叫oneventhr。”
一邊說著,大李開始修改起剛才用于標(biāo)準(zhǔn)事件處理程序的代碼來:
module module1
'事件數(shù)據(jù)類
public class henryeventargs
inherits eventargs
end class
'聲明委托
public delegate sub henryeventhandler(byval sender as object, _
byval e as henryeventargs)
public class chenry
' 聲明一個事件
public event eventhr as henryeventhandler
protected overridable sub oneventhr(byval e as henryeventargs)
'調(diào)用委托
raiseevent eventhr(me, e)
end sub
public sub start()
dim e as henryeventargs
oneventhr(e)
end sub
end class
dim obj as new chenry()
sub obj_eventhr(byval sender as object, byval e as henryeventargs)
msgbox("事件處理器捕捉到了事件.") '處理事件.
end sub
sub main()
addhandler obj.eventhr, addressof obj_eventhr
obj.start()
end sub
end module
大李指著寫好的代碼對我說:“你看,這段代碼與先前的不同之處有不少。首先eventhr事件我定義為一個委托類型,不再是光禿禿的一個事件了。這樣的話,eventhr事件就具有了承載事件信息的能力,事件發(fā)送源是sender;事件數(shù)據(jù)是henryeventargs類的對象。其他的你應(yīng)該都能很快就明白了,對吧?”
“嗯,還有一個問題,為什么引發(fā)事件的方法oneventhr要用保護(hù)的方法呢?”我還是有些不解。
“這個問題問得好!”大李點(diǎn)了點(diǎn)頭,“這是為了讓派生類必須始終調(diào)用基類的oneventhr方法以確保注冊的委托接收到事件。你只要試一下,繼承chenry得到一個派生類進(jìn)行事件處理,就會明白了。”
哦,一個事件驅(qū)動程序設(shè)計(jì)方法的講述的確讓我大開眼界,打開了一扇了解vb.net的廣闊天空的大門,繼續(xù)努力,我還得加油呀!
(未完待續(xù))