资源大全 | 神秘文化 | 在线翻译 | QQ专区 | 视频教程 | 彩信频道 | 搜索引擎 | BT下载 |  | 网站地图
设为首页
加入收藏
联系站长
您现在的位置: 一百网络 >> 其他编程 >> Delphi编程 >> 文档正文
最近更新
普通文档 Together与Visual.Studi
普通文档 Together与Visual.Studi
普通文档 Together与Visual.Studi
普通文档 Delphi实现在数据库中存
普通文档 Delphi开发多媒体播放音
普通文档 开发工具大比拼之Visual
普通文档 Delphi串口通讯的监听
普通文档 Delphi中远程控制的实现
普通文档 利用Delphi编写Socket通
普通文档 利用Delphi开发网络数据
推荐文章
  • 此栏目下没有推荐文档
  • 探索VB系列中的事件处理的奥秘(4)

    文章作者:佚名 录入时间:2006-6-2 来源:不详
    网站声明:本站的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出处和原始作者,文章版权归本网站与文章作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。


     使用.NET事件设计模式

       虽然如你在Visual Basic 6.0和我前面的例子中所可能做的一样引发事件并没有什么错误,.NET Framework已经为事件采用了一种特别的设计模式,一种你应该在你的应用程序中采用的设计模式。在这个模式里,所有事件提供两个参数:一个对象,提供一个对引发事件(一般命名为sender)对象的引用,和一个EventArgs对象(或者一个继承于EventArgs的对象),提供相关信息给事件(一般命名为e)。

       标准.NET Framework事件的设计模式添加了三个建议。首先,如果你的事件需要传递任何信息到它的侦听器,你应该创建一个继承于EventArgs的类并且它包含附加信息。你可以使用你的类的构造器来接受并存储信息。在示例项目中,FileFoundEventArgs类如图 8 所示。
    第二,提供一个引发事件的过程。大多.NET Framework类从一个重载的protected过程引发事件,一般命名为OnEventName(在FileFound事件的情况下,过程会被命名为OnFileFound)。需要引发事件的代码调用OnEventName过程,它将接着引发事件。使之成为一个protected方法意味着它可为当前类型的对象所用和基于继承自当前类的任何对象所用。使之重载意味着继承类可以改变事件的行为: 一个继承类可以添加运行于调用基类的OnEventName过程之前或之后的代码,或者可以全部跳过它们。在这个示例项目中,FileSearch5类提供以下protected过程:

    ’ From FileFoundEventsArgs.vb
    Public Class FileFoundEventArgs
    Inherits EventArgs
    Private mfi As FileInfo

    Public ReadOnly Property FileFound() As FileInfo
      Get
       Return mfi
      End Get
    End Property

    Public Sub New(ByVal fi As FileInfo)
      ’ Store the FileInfo object for later use.
      mfi = fi
    End Sub
    End Class

    ’’ 来自 FileSearch9.vb
    Protected Overridable Sub OnFileFound(ByVal fi As FileInfo)
    RaiseEvent FileFound(Me, New FileFoundEventArgs(fi))
    End Sub

      这个过程用RaiseEvent语句的第一个参数传递关键词Me。这个关键词引用在当前运行的代码中的对象,它当然就是那个引发事件的对象。

      第三,你可能发现创建你自己的事件委托是很有用的。尽管你无须定义一个显式事件委托就可获得事件委托,但在自己创建时可获得一些灵活性。在你创建一个委托时,你正在为过程定义一个“类型”。如果你有不止一个事件,它们需要同一套参数,创建一个定义这个类型的委托将会有用。如果你需要修改这些参数,你可以只要修改委托,而不用修改事件声明。

      举个例子,你可以声明这个FileFound事件,不用事件委托,如下:

    Public Event FileFound( _
    ByVal sender As Object, ByVal e As FileFoundEventArgs)

      如果你这时想要声明其他事件,使用相同参数,你将必须重复整个声明:

    Public Event FileFoundSomeOtherEvent( _
    ByVal sender As Object, ByVal e As FileFoundEventArgs)

      作为选择,你也可以声明一个新的委托类型,它描述了你的事件的参数签名:

    Public Delegate Sub FileFoundEventHandler( _
    ByVal sender As Object, ByVal e As FileFoundEventArgs)

      这时你应该声明这个类型的声明事件:

    Public Event FileFound As FileFoundEventHandler
    Public Event FileFoundSomeOtherEvent As FileFoundEventHandler

      如果你没有采取这个额外的步骤,Visual Basic .NET编译器将为你做这些工作,添加新的委托类型到类的元数据中去。FileSearch5.Search方法利用了这一机制,在每个文件找到时调用OnFileFound方法:

    ’’ 来自 FileSearch5.vb
    Dim afi() As FileInfo = diLocal.GetFiles(Me.FileSpec)
    For Each fi As FileInfo In afi
    OnFileFound(fi)
    Next

      点击示例窗体上的Event Design Pattern按钮创建一个FileSearch5类的实例并调用它的Execute方法(正如所有前面的例子一样)。在此情况下,FileSearch5.FileFound事件的事件处理程序是有点不同:不是只接受一个FileInfo对象,这个事件处理程序看起来像一个标准的.NET事件处理程序;它接受两个参数并使用了FileFoundEventArgs参数的 FileFound属性来显示找到的文件名称:

    ’’ From frmMain.vb
    Private Sub fs5_FileFound( _
    ByVal sender As Object, ByVal e As FileFoundEventArgs) _
    Handles fs5.FileFound
    AddText(e.FileFound.FullName)
    End Sub

      尽管你不需要使用标准.NET事件处理设计模式,它总是使得你自己的事件与内部.NET对象引发的事件匹配的最好。你获得在你的事件侦听器中“通晓”的好处,并且它们看起来像其他事件。创建你自己的事件委托是可选的,但是如果你有多个事件传递相同的参数,使用事件委托可以简化你的代码。另外,因为事件参数的更改只能在一个地方进行,所以根据你的需要在任何时候修改你的代码将会更容易。

  • 上一篇文档:

  • 下一篇文档:
  •     查找更多“探索VB系列中的事件处理的奥秘(4)”的内容  
    相关连接
  • 将Java程序变成Windows系统服务

  • 浅析Java多线程程序设计机制

  • Java初学者需掌握的30个基本概念(1)

  • JDBC 入门(1)

  • 面向Java程序员的Ajax:构建动态Java程序(1)