分享
 
 
 

Henry的VB.NET之旅(十三)—标准事件处理程序

王朝vb·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Henry的VB.NET之旅(十三)—标准事件处理程序

韩睿

“感兴趣就好!”大李微微点点头,然后问我道,“你知道程序是怎么知道哪些对象可以引发何种事件,以及怎么样把事件和事件处理程序关联起来?”

见到我迷茫的眼神,大李用鼠标点击打开被Region合起来的“Windows 窗体设计器生成的代码”,指着中间的一句自动生成的代码:

Friend WithEvents Button1 As System.Windows.Forms.Button

“当你在设计窗口往窗体上添加了一个按钮后,会自动在代码中加入这句代码,Friend 关键字授予对一个或多个所声明的编程元素的友元访问权限。那么WithEvent是干什么的?”

我立刻在帮助中查找,有了:

WithEvents 关键字指示被声明的对象变量引用可以引发事件的类实例。

“明白了,”我也不能总傻听着,“在声明对象的时候用WithEvents来进行标识,再在事件处理程序中的过程声明结尾处使用 Handles 关键字将就可以处理由使用 WithEvents 关键字声明的对象变量所引发的事件了。”

“没错,你看来我写一段代码,使用的就是WithEvent-Handles的方法来处理事件。类名为CHenry吧,它内含一个事件EventHR。”

Module Module1

Public Class CHenry

Public Event EventHR() ' 声明一个事件

Sub CauseSomeEvent()

RaiseEvent EventHR() ' 引发事件

End Sub

End Class

WithEvents Obj As New CHenry() '模块或类级别的声明

Sub Obj_EventHR() Handles Obj.EventHR '在Handles之后声明事件

MsgBox("事件处理器捕捉到了事件.") '处理事件.

End Sub

Sub Main()

Obj.CauseSomeEvent() '调用对象去引发事件

End Sub

End Module

“你要注意的是怎么样通过RaiseEvent来引发事件,另外一个很简单的问题也需要注意的是,事件处理程序的命名一般是用‘对象名_事件名’的方式。”大李边写程序边指点说。

“事件的声明和引发是只能在一个层次内,还是可以在派生类里引发基类的事件?”我不由好奇地问。

“你开始学会思考了,”大李不知道是不是在嘲笑我,“VB.NET要求必须在声明事件的范围内引发事件。派生类不能引发从基类继承的事件,但是可以处理基类引发的事件。我们可以来看一个示例。”大李马上对刚写的代码进行了修改:

Module Module1

Public Class CHenry

Public Event EventHR() ' 声明一个事件

Sub CauseSomeEvent()

RaiseEvent EventHR() ' 引发事件

End Sub

End Class

Public Class Class2‘从Chenry派生而来的类

Inherits CHenry

Sub Obj_EventHR() Handles MyBase.EventHR

MsgBox("事件处理器捕捉到了事件.") '处理事件.

End Sub

End Class

WithEvents Obj As New Class2() '模块或类级别的声明

Sub Main()

Obj.CauseSomeEvent() '调用对象去引发事件

End Sub

End Module

“还记得我跟你说过MyBase的意义了吧?(注:详见《构造与析构》一篇)我们可以添加 Handles MyBase.<event name> 语句来声明派生类中的事件处理程序。问一个基本的问题,你看obj是Class2类的一个实例对吧?但为什么它也具有Chenry类才有的CauseSomeEvent方法?”大李说得我眼球都快掉下来了。

“当然是因为Class2是CHenry类的派生类,继承了它的方法呗。”我神情极为沮丧。

“哈哈,别急呀,在VB.NET中我们最常碰到的就是面向对象的问题。不断回顾有好处,温故而知新!”大李最后的微笑对我倒不啻为一句忠告。要学好VB.NET,我还真得好好复习一下面向对象的内容。

大李话题一转,淡淡地跟我说:“WithEvents 语句和 Handles 子句提供了标准的陈述性指定事件处理程序的方法。也就是如何把对象的事件和某一个事件处理程序进行关联。WithEvents 所声明对象引发的事件可以由任何过程用命名此事件的 Handles 子句来处理。换句话说,有Handles子句标识的事件处理程序也只能处理由WithEvents声明的对象。虽然 Handles 子句是关联事件与事件处理程序的标准方法,它仅限于在编译时关联事件与事件处理程序。还有一种方法可以允许在运行时动态地将事件与一个或更多的事件处理程序连接或者断开,而并不要求使用 WithEvents 来声明对象变量。”

“是吗?”我一下子从沉思中惊醒过来,好奇心又一次袭来。

(未完待续)

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

声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。

QQ: 18349592

E-Mail: henry7685@hotmail.com

请访问本人专栏:http://www.csdn.net/develop/author/netauthor/Latitude/

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有