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

动态

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

韩睿

“大李哥,”我不免为自己问了如此多的问题而不好意思起来,“您刚才所说的事件的委托是怎么回事呀?”

大李显然是明白我会提问的:“我所说过事件驱动设计中的三要素你还记得吧?”

“当然,就是指对象、事件和事件处理程序。”我流利地回答道。

“对象和事件处理程序我们已经分析过了。要想彻底了解事件驱动程序的来龙去脉,我们必须了解事件的构成。”见到我又一次茫然地摇头,他就接着说,“事件功能是由三个互相联系的元素提供的:提供事件数据的类、事件委托和引发事件的类。我说过,事件就是一个信号,它告知应用程序有重要情况要发生。那么我们可以想象一下,事件要发生,就会含有独特的信息,比如,事件发送源是什么,会发生什么样的事件。提供事件数据的类就是用于记录这些信息的。该类必须从 System.EventArgs 派生出,这个我们已经说过了;事件的委托,这其实我也说过了,就好比是指向事件接收方的一个指针,由于指定对象的事件是独特的,所以它的委托也是事先定义好的,就比如MouseDown事件,它对应的委托就是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

它其实就等同于:

AddHandler Label1.MouseDown, AddressOf Label1_MouseDown

Private Sub Label1_MouseDown(ByVal sender As Object, ByVal e As _

System.Windows.Forms.MouseEventArgs)

End Sub

隐含的意思,就是通过先前已经声明为全局变量的事件委托MouseEventHandler来实现事件处理程序参数的定义。对于MouseDown事件而言,为什么自动加上的事件数据类参量是MouseEventArgs类的,就是委托的作用了。

第三个要素是引发事件的类。该类必须提供事件的声明和引发事件的方法。其中引发事件的方法必须命名为On加上事件名的形式,比如事件是EventHR,那么引发事件的方法就一定叫OnEventHR。”

一边说着,大李开始修改起刚才用于标准事件处理程序的代码来:

Module Module1

'事件数据类

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)

'调用委托

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事件就具有了承载事件信息的能力,事件发送源是Sender;事件数据是HenryEventArgs类的对象。其他的你应该都能很快就明白了,对吧?”

“嗯,还有一个问题,为什么引发事件的方法OnEventHR要用保护的方法呢?”我还是有些不解。

“这个问题问得好!”大李点了点头,“这是为了让派生类必须始终调用基类的OnEventHR方法以确保注册的委托接收到事件。你只要试一下,继承CHenry得到一个派生类进行事件处理,就会明白了。”

哦,一个事件驱动程序设计方法的讲述的确让我大开眼界,打开了一扇了解VB.NET的广阔天空的大门,继续努力,我还得加油呀!

(未完待续)

时间: 2024-10-26 05:29:14

Henry的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("

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

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

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

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

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

标准|程序 Henry的VB.NET之旅(十三)-标准事件处理程序 韩睿 "感兴趣就好!"大李微微点点头,然后问我道,"你知道程序是怎么知道哪些对象可以引发何种事件,以及怎么样把事件和事件处理程序关联起来?" 见到我迷茫的眼神,大李用鼠标点击打开被Region合起来的"Windows 窗体设计器生成的代码",指着中间的一句自动生成的代码: Friend WithEvents Button1 As System.Windows.Forms.Butt

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

Yes,貌似添加了好多的代码啊 ;] ,在你添加更多代码时,你可能注意到一些Xcode中的一些警告.首先你先忽略这些警告,我们先添加少量最终缺失的部分,然后再来解释上面代码做了什么! 在Enemy.m中修改如下: // Add the following at the beginning of initWithTheGame: (within the "if" condition) attackedBy = [[NSMutableArray alloc] initWithCapacit

JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!

JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了,而且收到的好评也不错,于是就一直坚持了下来,非常感谢各位小伙伴哦! JAVA之旅合集 JAVA之旅(一)--基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算 JAVA之旅(二)--if,switch,for,while,do while,语句嵌套,流程

JAVA之旅(十五)——多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止

JAVA之旅(十五)--多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止 我们接着多线程讲 一.生产者和消费者 什么是生产者和消费者?我们解释过来应该是生产一个,消费一个,的意思,具体我们通过例子来说 package com.lgl.hellojava; //公共的 类 类名 public class HelloJJAVA { public static void main(String[] args) { /** * 生产者和消费者

JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine

JAVA之旅(二十五)--文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine 我们继续IO上个篇幅讲 一.文本复制 读写都说了,我们来看下其他的操作,我们首先来看复制 复制原理:其实就是将C盘下的文件数据存储到D盘的一个文件中 实现的步骤: 1.在D盘创建一个文件,用于存储文件中的数据 2.定义读取流和文件关联 3.通过不断的读写完成数据的存储 关闭资源 package com.lgl.hel

Visual Basic 二十五周年,微软是否应该开源?

1991年5月20日,比尔盖茨在Windows World 上发布了Visual Basic.微软官方博客上周庆祝了VB二十五周年.自新CEO上任之后,微软的企业文化被认为发生了很大改变,开始积极拥抱开源.因此在二十五周年之际,粉丝再次在官网呼吁微软开源VB,以前的多次呼吁都遭到了微软的拒绝.但最新的呼吁看起来结局也一样,用户在官网发表的帖子被合并到了旧的帖子. 文章转载自 开源中国社区[http://www.oschina.net]