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

标准|程序

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 来声明对象变量。”

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

(未完待续)

时间: 2024-08-31 20:34:31

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

Henry的VB.NET之旅(十四)—动态关联事件与处理程序

程序|动态 Henry的VB.NET之旅(十四)-动态关联事件与处理程序 韩睿 "要解释新的事件处理程序的方法,我们需要先说几个重要的问题."大李开始严肃起来,我也只得挪动一下身子,表现出正襟危坐的架势. "我们首先讨论一下事件是怎么产生的.事件是对象发送的消息,以发信号通知操作的发生.操作可能是由用户交互,例如鼠标单击引起的,也可能是由某些其他的程序逻辑触发的.引发事件的对象叫做事件发送方(啊,听到这,Henry突然明白了事件处理程序中的第一个参量为什么叫Sender了,就

Henry的VB.NET之旅(十五)—动态事件处理方法

动态 Henry的VB.NET之旅(十五)-动态事件处理方法 韩睿 "大李哥,"我不免为自己问了如此多的问题而不好意思起来,"您刚才所说的事件的委托是怎么回事呀?" 大李显然是明白我会提问的:"我所说过事件驱动设计中的三要素你还记得吧?" "当然,就是指对象.事件和事件处理程序."我流利地回答道. "对象和事件处理程序我们已经分析过了.要想彻底了解事件驱动程序的来龙去脉,我们必须了解事件的构成."见到我又一

Henry的VB.NET之旅(十一)—可视继承

继承 Henry的VB.NET之旅(十一)-可视继承 韩睿 闭关修练了一晚上VB.NET的继承程序的我,早上进入公司时自信满满.白经理看到我,问了一句:"学习得怎么样?对VB.NET是不是已经可以上手了?"我点了点头:"应该可以做点事了吧.""好的,"白经理拍了拍我肩膀说,"再跟大李好好学习几天,会有机会的." 得到领导的指示,我冲了杯咖啡,恭敬地走向大李,放在他的桌上.大李嘴角一翘,笑着说:"别这么客气,来,坐.让

Henry的VB.NET之旅(十二)—事件驱动

Henry的VB.NET之旅(十二)-事件驱动 韩睿 "可视继承原来这么方便!"我心中默默地感叹一声.一会儿之后,我抬头扫了一眼屏幕上的代码后,突然发现了一个新问题,按钮的单击事件程序现在已经变成了: VB.NET程序 VB程序 Private Sub btnProtected_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProtected.Click MsgBox("

VB.NET的Override事件处理程序

程序 VB.NET的Override事件处理程序 介绍 在类或控件的继承中,子类或子控件封装了父类的所有函数,其中包括事件处理程序.本文将着重讨论在 Visual Basic .NET 应用程序设计中如何正确对待事件处理程序的继承. 读者要求 本文假定读者熟悉面向对象程序设计和类的继承性.若您尚未熟悉它们,请参阅<组件的多态性> ("Polymorphism in Components"). 继承事件处理程序 当组件被继承时,它的所有成员都被封装到子类中.事件处理程序是响应

VB调用的OCX控件返回标准事件的读取方式

问题描述 我在开发一个软件电话的客户端,需要调用供应商提供的OCX空件.但当我尝试处理其提供的标准事时,在VB.net内却遇到困难.其提供的指引为:------------------------------------------------3.8.7错误事件(OnError)中文错误事件原型voidOnError(longErrorCode,BSTRErrorStr);说明发生错误时触发:触发TSERVER重连错误事件后软电话会重新登录.参数ErrorCode错误码见错误码说明ErrorSt

Cocos2D:塔防游戏制作之旅(十三)

让我们看一下Waves.plist文件,你将注意到它包含了3个数组.每一个数组表示一波攻击,也就是一组敌人一起到达闹事.第一个数组包含6个字典.每一个字典定义1个敌人. 在本次教程中,字典只存储敌人应该出现的时间,但是该字典也可以用来定义敌人的类型或者其他任何区分敌人的特殊属性. loadWave方法检查下一波攻击应该何时出现,基于攻击波的信息创建对应的敌人,并且将它们调度出现到屏幕上. 方法enemyGotKilled检查有多少敌人存在于屏幕上,如果一个都没有,则送出下一个攻击波.在后来,该方

vb的属性、方法和事件(六)

设置Tab键顺序 例如,假设您建立了两个名称为Text1和Text2的TextBox,然后又建立了一个名称为Commandl的CommandButton.应用程序启动时,Text1具有焦点.按TAB键将使焦点按控件建立的顺序在控件间移动,如图 3.20 所示.设置TabIndex属性将改变一个控件的tab键顺序. 控件的TabIndex属性决定了它在tab键顺序中的位置.按照缺省规定,第一个建立的控件其TabIndex 值为 0,第二个的 TabIndex 值为 1,以此类推.当改变了一个控件的

vb的属性、方法和事件(五)

Images应用程序中的事件 Image应用程序对事件的响应如下:1.每一个 Image控件的 Click 事件使 Shape 控件的 Left 属性与它自己的 Left 属性相同,并将图形移到 Image的顶端.2.调用 PictureBox 的 Cls 方法清除 StatusBar 的当前标题.3.调用 PictureBox 的 Print 方法在 StatusBar 上打印新标题.Image控件 Click 事件的代码如下:Private Sub imgHeart_Click()shpCa