转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> VB.NET程序 >> 正文
Henry的VB.NET之旅(十四)—动态关联事件与处理程序         ★★★★

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

作者:闵涛 文章来源:闵涛的学习笔记 点击数:706 更新时间:2009/4/23 19:01:38

    HenryVB.NET之旅(十四)动态关联事件与处理程序

                                    韩睿

 

“要解释新的事件处理程序的方法,我们需要先说几个重要的问题。”大李开始严肃起来,我也只得挪动一下身子,表现出正襟危坐的架势。

“我们首先讨论一下事件是怎么产生的。事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互,例如鼠标单击引起的,也可能是由某些其他的程序逻辑触发的。引发事件的对象叫做事件发送方(啊,听到这,Henry突然明白了事件处理程序中的第一个参量为什么叫Sender了,就是指事件发送的那个对象呀。捕获事件并对其作出响应的对象叫做事件接收方。在事件通讯中,事件发送方类不知道哪个对象或方法将接收到它引发的事件。所需要的是在源和接收方之间存在一个媒介,或类似指针的机制。.NET 框架定义了一个特殊的类型Delegate,也就是委托,该类型提供函数指针的功能。”

“啊,我早就听说过委托的,就是不知道它是什么意思咧!”我做出期盼状。

“委托就是可用于调用其他对象方法的对象。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。”大李继续说着。

““噢,委托也就是一个函数指针喽。”我好象理解了一点。

“差不多,委托可以等效于一个类型安全函数指针或一个回调。但不同于函数指针,Visual Basic.NET 委托是基于 System.Delegate 类的引用类型,它可以引用我们先前说过的共享方法(详见《共享成员》一篇)和实例方法。”

“明白了一点。”我一边点头一边说,“我们想要动态调用事件处理程序,是不是就要利用委托来声明是哪个程序用于处理事件呀?”

大李惊异地看着我,露出了几分赞许。

“委托是.NET中的一个重要的类型,我们以后还需要详细讨论。现在我们需要关注的就是如何来通过操作委托来实现将事件与事件处理程序动态联系起来。”大李接着就开始修改代码:

 

Module Module1

Public Class CHenry

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

        Sub CauseSomeEvent()

            RaiseEvent EventHR()   '''' 引发事件

        End Sub

    End Class

 

    Dim obj As New CHenry()

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

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

    End Sub

    Sub Main()

        AddHandler obj.EventHR, AddressOf Obj_EventHR

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

End Sub

End Module

 

“看到有什么不同吗?”大李转过身来问我。

“主要有两个不同,首先是obj的定义不再用WithEvents来标识了,因此事件处理程序obj_EventHR()也就不能通过Handles关键字来声明事件,也就是说EventHR事件与事件处理程序没有用WithEvent-Handles进行关联;其次,是使用了AddHandle和Addressof……”说到这,我也没有词了,只能语焉不详。

“呵呵,我来帮你接着说。”大李拍了拍我的肩膀,接着说“先说Addressof吧,AddressOf 运算符创建的是一个指向指定的过程的过程委托。我们刚才说过委托相当于一个函数指针,那么AddressOf就是委托的操作符,通过它能得到委托的引用。”

见到我稍稍明白了,大李又接着说:“光看AddHandle能够将obj.EventHR事件与Obj_EventHR事件处理程序关联起来的作法,你肯定不了解我所说的动态关联好处在哪里。因为我没提到另一个方法RemoveHandler。它的使用方法和AddHandle是一样的,比如:

RemoveHandler obj.EventHR, AddressOf Obj_EventHR

你看,AddHandlerRemoveHandler 在一起就可以提供比 Handles 子句更大的灵活性,只要我们善于利用它们,就可以动态地添加、移除和更改与某事件关联的事件处理程序。而且比 Handles 要强大的是,AddHandler 允许将多个事件处理程序与单个事件进行关联。”

大李停了一停,接着说:“你要注意的一点就是AddressOf后面跟着的委托签名应该与相应的事件数据类相一致,我们看一个例子。”

 

AddHandler TextBox.MouseDown,AddressOf TextBoxMouseDownHandler

‘错误的示例1:

Private Sub TextBoxMouseDownHandler( )

End Sub

错误的示例2

Private Sub TextBoxMouseDownHandler(ByVal sender As Object, ByVal e As EventArgs)

End Sub

‘正确的示例:

Private Sub TextBoxMouseDownHandler(ByVal sender As Object, ByVal e As MouseEventArgs)

End Sub

 

 “事件是一个文本框中的鼠标按下事件,我们不用自带的标准关联事件处理方法,而用AddHandler来实现,那么AddressOf之后相应的方法的参数声明,应该与MouseDown事件对应的事件的委托MouseEventhandler具有相同的签名,也就是参数声明上要保持一致,一个object变量,一个System.Windows.Forms.MouseEventArgs变量。”

我到这一步才算明白了个大概,事件处理程序可以通过AddHandler和RemoveHandler方法在我们需要的时候动态地建立或断开事件与事件处理程序的关联关系。可是,对于大李刚说的“事件的委托MouseEventhandler”,我还是不太理解。

 

(未完待续)

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

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

QQ: 18349592

E-Mail: henry7685@hotmail.com

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


[C语言系列]NET 中C#的switch语句的语法  [系统软件]托拽Explore中的文件到VB.net的窗口
[系统软件]Boost库在XP+Visual C++.net中的安装  [常用软件]新配色面板:Paint.Net3.0RC1官方下载
[常用软件]用内建的“Net Meeting”聊天  [VB.NET程序]Henry的VB.NET之旅(三)—共享成员
[VB.NET程序]Henry的VB.NET之旅(二)—构造与析构  [VB.NET程序]Henry的VB.NET之旅(一)—失踪的窗体
[VB.NET程序]在托盘上显示Balloon Tooltip(VB.NET)  [VB.NET程序]Henry手记-VB.NET中动态加载Treeview节点(二)
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台