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

原创 2004年02月05日 00:48:00

???? HenryVB.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. 语句来声明派生类中的事件处理程序。问一个基本的问题,你看objClass2类的一个实例对吧?但为什么它也具有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/

.NET keypress 事件之键盘输入控制

今天在写机房个人重构时,又再次遇到了之前的老问题,如何控制文本框内只输入数字,对此问题总结了下面的几种方法     记得在用VB6.0 编写机房收费系统的时候这个问题挺容易的,现在换成了.NET ...
  • yudandan10
  • yudandan10
  • 2013年07月23日 10:58
  • 4255

'VB.net 自定义事件使用方法

'VB.net 自定义事件使用方法 '1.先定义包含事件的类(如下) Public Class TestEvent     Public Event MyEvent(ByVal s As S...
  • latior
  • latior
  • 2016年06月22日 09:26
  • 2159

VB.NET之旅-事件驱动程序设计

事件驱动程序设计:使用者所操作的每一个动作都视为「事件」,事件会被操作系统所拦截,并传递给应用程序的进程 事件的处理 需要在事件中执行的程序代码,会放在事件处理函式(event handl...
  • u010073895
  • u010073895
  • 2014年06月21日 19:27
  • 1125

VB.net学习笔记(七)对象事件的定制

Public Delegate Sub WalkedEventHandler(ByVal distance As Int32) Private mWalkedHandlers As WalkedEv...
  • dzweather
  • dzweather
  • 2013年08月01日 23:23
  • 6794

COM组件设计与应用(十三)——事件和通知(VC6.0)

首页视频教程新闻文章代码在线杂志 会员登陆   注册   文章  代码          视频教程  更多...
  • tangyanzhi1111
  • tangyanzhi1111
  • 2013年07月10日 15:25
  • 1107

【原创】vb.net 动态控件 事件添加

【原创】vb.net 动态控件 事件添加 添加选项后: 为实现动态添加,所需代码如下(共三个函数): Private selectcond1 As String = "" '厂家 ...
  • linczone
  • linczone
  • 2015年05月22日 16:02
  • 1446

VB.NET是如何关闭窗体 .

http://blog.csdn.net/wl58796351/article/details/7221040   1、在VB.NET中取消窗体的关闭事件;2、如何取消窗体上关闭按钮功能;3、窗体...
  • seucbh
  • seucbh
  • 2013年09月03日 08:06
  • 1957

VB.NET 中多个类共用一个事件通道

项目中要将C#代码(多个类共用一个事件通道)转换成VB.NET ,觉得有一定的技术含量,以供参考. C#代码示例如下:   public delegate void showMsgEventHan...
  • action20
  • action20
  • 2013年12月20日 09:16
  • 1042

文件关联后vb.net 软件如何响应被关联文件的双击事件

Windows系统很早就加入了文件关联的功能,它大大增加了日常使用操作系统的便利性。所谓的文件关联就是指系统把指定扩展名的文件自动关联到相应的应用程序,比如.doc文件默认情况下就自动和Microso...
  • wang19850219
  • wang19850219
  • 2014年12月04日 15:44
  • 776

VB.net学习笔记(十二)继承中的构造、事件、共享方法、共享事件

Private mNames As Generic.Dictionary(Of NameType, String) Public Overloads Property Name(ByVal ...
  • dzweather
  • dzweather
  • 2013年08月13日 22:38
  • 5190
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Henry的VB.NET之旅(十三)—标准事件处理程序
举报原因:
原因补充:

(最多只允许输入30个字)