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

首頁 > 編程 > .NET > 正文

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ù))


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 南丹县| 象州县| 正镶白旗| 嘉兴市| 剑河县| 泰兴市| 花莲市| 石家庄市| 康乐县| 广元市| 阿图什市| 东平县| 沾益县| 泰和县| 六安市| 恭城| 阿巴嘎旗| 克拉玛依市| 定西市| 和田市| 武穴市| 锡林浩特市| 沁阳市| 同江市| 旅游| 永嘉县| 嘉定区| 千阳县| 东城区| 玉山县| 资中县| 炎陵县| 彭州市| 荔浦县| 大关县| 义乌市| 霞浦县| 中西区| 龙海市| 山西省| 灵台县|