首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
wangchinaking (57)
yjz0065 (113)
coofucoo (105)
Drate (69)
lphpc (30)
smallnest (61)
iiprogram (64)
downmoon (32)
danny_xcz (49)
btbtd (81)
CSDN - 文档中心 - .NET 阅读:9197   评论: 22    参与评论
标题   Henry的VB.NET之旅(十五)—动态事件处理方法     选择自 Latitude 的 Blog
关键字   Henry,VB.NET
出处  

        HenryVB.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的广阔天空的大门,继续努力,我还得加油呀!

(未完待续)

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

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

QQ: 18349592

E-Mail: henry7685@hotmail.com

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


相关文章
对该文的评论
CSDN 网友 ( 2006-04-10)
我服了
CSDN 网友 ( 2006-04-10)
期待下篇! 支持你! 
不过希望能再把每个知识点讲解的再深入点。 文章深度过于简单了。谢谢你!
cowboytan ( 2005-01-10)
是呀,,有关于类似C#的资料吗
CSDN 网友 ( 2004-10-31)
能发表关于C#的吗
xlla ( 2004-06-18)
请教:如果将
msgbox("事件处理器捕捉到了事件")
替换成
dim f as form1 = new form1
f.show
这个窗口便无法正常显示,准确的说这个窗口就无法建立自己的消息循环,无法相应用户事件。
困惑中,忘指点