vb.net源码:vb.net的旅(十 4)—动态关联事件和处理程序

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

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

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

  “委托就是可用于其他对象思路方法对象和其他类区别委托类具有个签名并且它只能对和其签名匹配思路方法进行引用”大李继续说着

  ““噢委托也就是指针喽”我好象理解了

  “差不多委托可以等效于个类型安全指针或个回调但区别于指针visual basic.net 委托是基于 system.delegate 类引用类型它可以引用我们先前说过共享思路方法(详见共享成员篇)和例子思路方法

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

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

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

module module1
public chenry
        public event eventhr    ´ 声明个事件
        sub causesomeevent
            raiseevent eventhr   ´ 引发事件
        end sub
    end
 
    dim obj as chenry
    sub obj_eventhr  ´在handles的后声明事件
        msgbox("事件处理器捕捉到了事件.")   ´处理事件.
    end sub
    sub
        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

  你看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变量



  我到这步才算明白了个大概事件处理可以通过addhandler和removehandler思路方法在我们需要时候动态地建立或断开事件和事件处理关联关系可是对于大李刚说“事件委托mouseeventhandler”我还是不太理解



Tags:  vb.net源码

延伸阅读

最新评论

发表评论