当前位置:首页 > 多媒体相关

探索VB系列中的事件处理的奥秘



热门问答:
  • c#与邮件 [详细内容]
  • 请问如何往response中添加一个Object对象? [详细内容]
  • 有没有Linux下的Jbuilder????? [详细内容]
  • 请问在ASP.NET中使用MAPI怎样才能避免弹出对话框?急急急!!!!!!! [详细内容]
  • 关于绑定后的数据导航问题! [详细内容]

  • 推荐阅读
      · 仿原厂dku-5数据线在3125上不好用的原因
        摘要:本人自从买了3125以后,数据线一直没搞定,这些日子也查阅了不少相关资料,今天无意中在“华艺手机网”上看到一篇文章《nokiadku-5数据线选购指南》(http://www.hy668.com/hy/artic......
      · 深度报道:pc破局揭竿而起 大路朝天各走一边
        摘要:计算机产品与流通  连续几年的同质化竞争,早让pc厂商身心疲惫。究竟该如何走出迷雾,人们都期待着指路明灯。在此背景下,终于有两种力量揭竿而起,为整个行业的破局指出了两条不同的方向。  规模化  国内pc老大联想通过收缩、降价、收购三步走,通过规模化达成成本优势,运用价格战略,在上半年推出2999元乡镇电脑,矛头直指向三四级市场,挑起价格战。尽管明知价格战下不可能有太多维持企业健康发展的利润空间,但是在求生的......

    正文
      事件是你的代码兵器库中的主要部分,无论你用visual basic? 6.0,visual basic .net 2002,visual basic .net 2003,还是visual basic 2005。窗体和控件引发事件,同时你的代码处理这些事件。你用visual basic写的最初应用程序大多会是在一个窗体上放置一个按钮,处理这个click事件,并在运行时你点击这个按钮会显示某些文本在提示框中。还有什么比这更容易?

      但是你又真正了解事件多少呢?在你向某个类中添加一个事件处理程序是将会发生什么?在本文中,基于我为 appdev 所写的课件,我将用各种方法来演示事件和事件处理程序交互,并且我将说明它们如何能解决一般问题。也许这些信息中的一些对你来说并不新鲜,但是如果你对事件的了解并不深入,这里肯定有些东西让你惊奇。在任一情况下,下载这两个示例应用程序(一个是用visual basic .net .2002和2003,一个是用visual basic 2005)并理解之。所有内容适用于visual basic .net2002 和 2003 及 visual basic 2005,除了最后的论及自定义事件的部分,它只能在visual basic 2005下工作。

      我将假定你已有一些关于委托和多路广播委托的基本知识。如果你没有研究过这些重要的microsoft.net framework特性,现在你就该去做了。获得这些问题的更多信息可以看看ted pattison的两部分关于委托的概论。

      事件

      visual basic(在visual basic .net之前)为你提供了创建和处理事件的简单机制,并且visual basic .net 2002和2003提供了几个不同的方法来做它们。visual basic 2005甚至允许你更强地控制事件处理程序,正如你将在本文里所看到的。

      事件提供一个松散的联系机制,它允许类为在将来某个时间可能或也许不可能发生的通知注册。如果“侦听器”得到它们正在等待的事件发生的通知,它们就处理这种情况。如果不,它们只是保持监听。一个按钮点击事件处理程序用类提供的按钮的功能(functionality)来注册它自己;在一个用户点击这个按钮时,这个按钮的类引发click事件,所有侦听器(这里可能是此按钮的多个click事件处理程序)运行它们的代码,并继续执行代码。

      我的示例程序包括一组类(filesearch1到filesearch5用于visual basic .net 2002 和 2003,而filesearch1到filesearch6可用于visual basic 2005)在一个指定位置搜索文件并在找到时引发一个事件。filesearch类只想在某个令人感兴趣的事情发生时让某个对应的类监听到。在这种情况下,每当filesearch类发现另一个文件时某个有趣的事情就会发生。许多侦听器类可能会希望对该事件做出反应。

      以.net的观点来说,一个类可以在代码执行的任何一点引发一个事件。其他类可以订阅这个事件,并且它们可以在事件发生时通过.net framework获得通知。这个引发事件的类一般并不会知道有多少(如果有的话)侦听器,尽管它可能做出某些努力以收集这个信息,正如你将在本文后面所看到的。另外,多侦听器可以注册以获得通知,并且每个都可以被通知而对其他任何侦听器一无所知。

      以visual basic 6.0方法处理

      .net framework和visual basic .net语言的设计者,已做了非常充分的工作以确保你可以在.net使用事件如同你在visual basic 6.0中所做的一样。这就是你可以:

      * 使用event关键词声明一个事件

      * 使用raiseevent语句引发一个事件

      * 使用一个withevents变量处理事件

      与.net的实质上的不同之处是底层的机制。对应于在visual basic 6.0中使用某些隐藏 plumbing,visual basic .net使用一个可见的、扩展的、公共plumbing-委托-来管理事件处理。

      visual basic 6.0 和visual basic .net版本之间的另一个不同是在.net中:你可以使用handles子句指示在对一个特殊事件的响应中应该运行的一个特殊过程。handles子句允许任何与事件的参数签名相符的过程来响应这个事件。听起来很像一个委托,而在表象之下,它就是委托。在编译时间,.net framework用你的事件名称创建一个委托类,只是在结尾添加“eventhandler”字样。举个例子,在你声明一个命名为filefound的事件时,.net framework创建为你创建一个命名为filefoundeventhandler的委托类型。处理这个事件的每个过程必须有一个符合委托类型的签名。

      点击在示例窗体上的raiseevent按钮演示了visual basic .net如何支持以visual basic 6.0为基础的事件处理。示例项目包括了filesearch1类,它使用以下代码建立事件:


      在它找到文件时,filesearch1类引发filefound事件:


      在frmmain.vb,你将找到以下声明,它允许代码使用变量fs1来对由filesearch1实例引发的事件做出反应:


      点击raiseevent运行以下代码:


      最后,frmmain.vb包括了一个事件处理程序,它处理filesearch1.filefound事件:


      尽管frmmain.vb只包括处理filesearch1.filefound事件的一个单过程,你将会有不止一个过程处理一个特定事件是相当可能的(并且是很可能的)。这就是说,当filesearch1类引发它的filefound事件,多个过程可能处理它是可能的。这听起来应该很像多路广播委托的概念,因为它就是多路广播委托。本质上,.net将事件转换为委托类。用ildasm.exe研究一下il(中间代码)就会拨云见日了。

    讨论区

    Login