打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
vb的委托学习
委托和事件
 
委托,这个词一听被邪乎。几年前我还以为和律师什么的有关系。可事实上“委托”就是System.Delegate类。它是一个类,这就意味着它是一个数据类型,而且是一个引用类型。它能够引用对象的方法(实例方法)和类的方法(静态方法、在VB里的Shared方法)。
 
使用委托可以概括为三步:声明、实例化、调用。
 
Public Class Class1
    Shared Sub Main()

        Dim cls2 As New Class2

        '实例化

        Dim d1 As OneDelegate = AddressOf cls2.fun1

        '调用
        d1() '实际上执行fun1
        '实例化

        Dim d2 As OneDelegate = AddressOf Class2.fun2

        '调用
        d2() '实际上执行fun2
 
        Console.ReadLine()
    End Sub
End Class
 
'声明委托
Delegate Sub OneDelegate()
 
Public Class Class2
    '实例方法
    Public Sub fun1()
        Console.WriteLine("fun1")
    End Sub
 
    'shared方法
    Public Shared Sub fun2()
        Console.WriteLine("fun2")
    End Sub
End Class
 
这样直接调用委托没有什么意义。因为可以直接调用方法。那样更加简单。使用委托最多的其实是事件,因为事件是由委托实现的。现如今大多数程序都是事件驱动的。要使用事件必须正确作如下几件事:
 
声明事件
引发事件
编写事件处理程序
把时间处理程序和事件联系起来
 
声明事件
 
通常我们都是在编写某一个类的时候把事件添加给类。请看下面这段代码:
 
Public Class class3
    '该类具有一个属性Prop。当该属性发生改变之后引发事件PropChanged
 
    '添加事件PropChanged
    Public Event PropChanged()
    '把事件添加给一个类,指定该类可以引发该事件。
    '要引发事件必须使用RaisEvent,就像下面这样。(在属性的set里面)
 
    '注意:使用事件必须注意,事件不能具有返回值、可选参数、ParamArray参数。
 

    Private _prop As String

    '参数Prop
    Public Property Prop() As String
        Get

            Return Me._prop

        End Get
        Set(ByVal Value As String)

            Me._prop = Value

            '当这个参数发生改变之后触发事件PropChanged

            RaiseEvent PropChanged()

            '这样事件就发生了。但是让这个事件发生绝对不是
            '最终的目的。人们使用事件机制,是为了在事件发生
            '的时候做点什么事情。所以,必须再使用这个类的
            '程序里写一个函数作为事件处理程序。
            '就像Class1.cls3_PropChanged(那样)
        End Set
    End Property
End Class
 
Public Class Class1
    Shared Sub Main()

        Dim cls2 As New Class2

        '实例化

        Dim d1 As OneDelegate = AddressOf cls2.fun1

        '调用

        d1() '实际上执行fun1

        '实例化

        Dim d2 As OneDelegate = AddressOf Class2.fun2

        '调用
        d2() '实际上执行fun2
 

        Dim cls1 As New Class1

        cls1.TestEvent()
 
        Console.ReadLine()
    End Sub
 
    '声明class3对象

    Private cls3 As class3

 
    '事件处理程序。准备用来处理对象cls3的PropChanged事件。
    '就是说,当对象cls3.Prop被改变之后,这个函数被执行。
    '这就需要把事件处理程序,也就是这个方法,和事件联系起来。
    '然后再为cls3.Prop赋值。就像TestEvent方法所作的那样。
    Private Sub cls3_PropChanged()
        '把事件和事件处理程序分开

        RemoveHandler cls3.PropChanged, _

            AddressOf Me.cls3_PropChanged

 

        Console.WriteLine("cls3_PropChanged被执行")

    End Sub
 
    Private Sub TestEvent()

        Me.cls3 = New class3

        '把事件处理程序和事件联系起来。

        AddHandler cls3.PropChanged, AddressOf Me.cls3_PropChanged

 
        '注意:
        '还有另一种把事件和事件处理程序联系起来的方法,
        '就是使用WithEvents和Handles。非常常见,所以不详述。
 
        '为属性赋值

        Me.cls3.Prop = "改变属性"

        '事件这时就发生了,事件处理程序被执行。
    End Sub
End Class
 
'声明委托
Delegate Sub OneDelegate()
 
Public Class Class2
    '实例方法
    Public Sub fun1()
        Console.WriteLine("fun1")
    End Sub
 
    'shared方法
    Public Shared Sub fun2()
        Console.WriteLine("fun2")
    End Sub
End Class
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Thread.实例学习笔记
VB.net学习笔记(二十八)线程同步下
[VB.NET Tips]线程传递参数四种方法
Vue.js---事件冒泡和默认事件处理
VB窗体动态创建控件及控件事件
VB.NET环境下的Socket编程举例
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服