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

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

??? 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进行关联;其次,是使用了AddHandleAddressof……”说到这,我也没有词了,只能语焉不详。

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

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

RemoveHandler obj.EventHR, AddressOf Obj_EventHR

你看,AddHandler RemoveHandler 在一起就可以提供比 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变量。”

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

?

(未完待续)

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

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

QQ: 18349592

E-Mail: henry7685@hotmail.com

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

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

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

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

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

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

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

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
  • 6806

VB.NET是如何关闭窗体 .

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

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

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

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

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

VB.NET动态加载C#或VB.NET生成的DLL文件调用动画教程[黑白智慧写](动态调用DLL).txt

 _________________下载原码:____________________________ -注意:全包括二部分,一定要下载完后,直接解压, 在解前不要修改压缩文件名,否不能正常...
  • action20
  • action20
  • 2014年01月25日 18:53
  • 1027

【VB.NET】实现动态托盘图标

前言 NotifyIcon 代码实现 需要的控件 定义类 说明 属性设置 方法类 对于窗体主要控件的编写 对于NotifyIcon的编写 对于Timer的编写 总结 前言有时候觉得也想给自己做的小软件...
  • SugaryoTT
  • SugaryoTT
  • 2016年02月21日 16:00
  • 1777
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Henry的VB.NET之旅(十四)—动态关联事件与处理程序
举报原因:
原因补充:

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