大李显然是明白我会提问:“我所说过事件驱动设计中 3要素你还记得吧?”
“当然就是指对象、事件和事件处理”我流利地回答道
“对象和事件处理我们已经分析过了要想彻底了解事件驱动来龙去脉我们必须了解事件构成”见到我又次茫然地摇头他就接着说“事件功能是由 3个互相联系元素提供:提供事件数据类、事件委托和引发事件类我说过事件就是个信号它告知应用有重要情况要发生那么我们可以想象下事件要发生就会含有独特信息比如事件发送源是什么会发生什么样事件提供事件数据类就是用于记录这些信息该类必须从 .EventArgs 派生出这个我们已经说过了;事件委托这其实我也说过了就好比是指向事件接收方个指针由于指定对象事件是独特所以它委托也是事先定义好就比如MouseDown事件它对应委托就是MouseEventHandler我们看下你在代码窗口选Label1对象MouseDown思路方法会自动生成这段空事件处理:
Friend WithEvents Label1 As .Windows.Forms.Label
Private Sub Label1_MouseDown(ByVal sender As Object, ByVal e As _
.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 _
.Windows.Forms.MouseEventArgs)
End Sub
隐含意思就是通过先前已经声明为全局变量事件委托MouseEventHandler来实现事件处理参数定义对于MouseDown事件而言为什么自动加上事件数据类参量是MouseEventArgs类就是委托作用了
第 3个要素是引发事件类该类必须提供事件声明和引发事件思路方法其中引发事件思路方法必须命名为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广阔天空大门继续努力我还得加油呀!
延伸阅读
最新评论