人生如梦,你我皆过客,来去匆匆......  
喜欢新鲜的事务,开创属于自己的事业,拥有美好的生活......

在Visual Basic等语言中,事件是经过特别封装的Delegate变量,它可以确保事件机制的进行,却又不允许从对象的外部引发事件或者获取不是自己绑定的事件处理的信息。所有这些,都是通过“事件过程”来做到的。当你书写一个事件的定义时:

Public Event MyEvent As EventHandler

实际上是书写了一个私有的委托变量和两个公共方法——add_MyEvent方法和remove_MyEvent方法。

Private _MyEvent As EventHandler
Public Sub add_MyEvent(value As EventHandler)
    _MyEvent = CType(Delegate.Combine(_MyEvent, value), _
        EventHandler)
End Sub
Public Sub
remove_MyEvent(value As EventHandler)
    _MyEvent = CType(Delegate.Remove(_MyEvent, value), _
        EventHandler)
End Sub

当你调用下列语法为事件绑定处理过程时:

AddHandler obj.MyEvent, AddressOf MyProc

实际是调用了obj.add_MyEvent方法:

obj.add_MyEvent(AddressOf MyProc)

通过这种方法,私有的委托变量被完全封装起来,因此从对象外部直接访问它是不可能的。这种自动的事件过程为我们提供了很大的方便,但不能满足一些高级的要求。比如我们想维护一个自定义的委托列表,供所有子类的事件使用,就没有办法使用自动生成的事件过程,而必须要用新的自定义事件过程。自定义事件过程就是手工实现事件的add_EventName方法和remove_EventName方法。其语法是

modifiers Custom Event EventName As HandlerName
    AddHandler(value As HandlerName)
        statements
    End AddHandler

    RemoveHandler(value As HandlerName)
        statements
    End RemoveHandler

    RaiseEvent(arglist)
        statements
    End RaiseEvent
End Event

书写自定义的事件过程,必须实现AddHandler、RemoveHandler和RaiseEvent三个访问器。其中AddHandler、RemoveHandler访问器的内容将成为add_EventName()方法和remove_EventName()方法的内容,而RaiseEvent访问器则是成为一个私有方法,用于引发事件。RaiseEvent访问器的参数必须是事件委托类型所定义的参数,其一般内容为判断委托类型是否为Nothing以及执行委托。使用自定义的事件过程将不会产生默认的委托变量,这一部分完全由用户来完成。下面用一个例子展示如何将自定义的委托变量封装成事件:

Protected MyDel As EventHandler '自定义的委托变量

Public Custom Event MyEvent As EventHandler

    AddHandler(value As EventHandler)
        '为自定义委托绑定处理过程

        MyDel = CType(Delegate.Combine( _
           MyDel, value), EventHandler)
    End AddHandler

    RemoveHandler
(value As EventHandler)
        '解除自定义委托的处理过程
        MyDel = CType(Delegate.Remove( _
            MyDel, value), EventHandler)
    End RemoveHandler

    RaiseEvent
(sender As Object, e As EventArgs)
        '引发事件
        If MyDel IsNot Nothing Then
            MyDel(sender, e)
        End If
    End RaiseEvent

End Event

以上例子只是重复了默认事件过程,实际上,自定义事件过程可以增加任何代码,在绑定事件和解除绑定时执行任何自定义内容,比如计算绑定计数,计算引发次数的计数等等。通过自定义事件过程,我们可以创建出更加灵活的事件。

posted on 2006-02-27 11:10  过客匆匆  阅读(333)  评论(0)    收藏  举报