VB备忘录(7)类与对象--再回首

对象的引用

dim objvar   as object   ‘创建一个引用

dim objvar   as New   object   '创建一个引用

为啥后面有New呢?当一个对象是顶层对象、外部可创建对象时,就用new来生成,比如引用外部的excel表时。这里叫直接赋值引用

                                    当一个对象是从属关系,即前面顶层中已经含有时,如worksheet已经有cells时,就不能new。这里叫间接赋值。

当上面第一句创建后,还必须赋值: Set   objvar =[New] objvar1    这样对象才有实际的意义

                                     Set并不创建对象的副本,它实质还是原来的对象objvar1,所以修改objvar实质上修改的是objvar1.

                                     当Set中用了New时,就创建了objvar1的一个实例。

                                     当Set objvar=nothing时,就会断绝引用关系 ,实质的效果就是释放这个对象。就象风筝断了线一样,再也无法索引空中的风筝。



方法:public/private  sub name()   无返回值






事件:对象识别动作,就是事件发生时,将产生一个信号,这个信号通知应用程序,用户就可以利用这个信号,比如单击鼠标事件。

            除了本身的事件外,我们还可以自己来定义一些自己需要的“事件”,以便在这些事件中来处理

             其实手工定义的事件不完全叫事件,只是处理的方法类似于事件的过程原理,所以还是叫事件。


事件定义:

[Public] Event    事件名称(形式参数)

事件同Sub一样无返回值,但它的形式参数不能用Optional,ParamArray、静态数组等。用动态数组时须用byRef来声明。

当我们手工定义了一个事件后,那么这个事件什么时候发生,或者说引爆呢?

也要我们手工在某个代码中进行“调用”,就象Call 方法一样,这仲点燃事件的动作我们叫  引发事件


引发事件

RaiseEvent  EventName  [(参数)]

参数不是必须的。没有参数时必须省略括号

比如我们做一个从1到1000的累加,我们想在加到500时做一些事,我们就可以事件来处理,当加到500时,可以用RaiseEvent来触发一个事件。

这个事件在另一个过程中进行处理,比如提示到了500了。


事件处理

平时所遇单击事件会在代码窗上面有列表显示。

同样,声明可以响应事件的窗体级对象变量后,对象变量名称就添加到代码窗口左边下拉表中,事件就在右侧下拉表中


事件都是在类模块中定义的,如果在窗体模块(标准模块中定义,将会出错。


哇,没想到啊,没想到啊,这里还有一个知识点。。。都快忘记了。

例子:

1、添加事件定义:在新建的类模块中进行定义

      事件的发生须在对象中进行添加,位置由用户来控制。正如command命令按钮一样,单击事件的引发,肯定由内部收到这个信号。


Option Explicit

Public Event MyEvent(ByVal Val As Integer) '定义事件

Public Sub Method()
    Dim i As Integer
    i = 63
    RaiseEvent MyEvent(i)   '引发事件,位置与时间用户自己来控制,放于想控制的位置
End Sub

2、事件的处理

      上面定义后,就可以在下拉框中选择,就会自动添加事件过程。要处理的代码就加入这个事件中。

Option Explicit

Dim WithEvents obj As MyClass

Private Sub Form_Load()
    Set obj = New MyClass
    obj.Method
End Sub

Private Sub obj_MyEvent(ByVal Val As Integer)
    MsgBox Val        '发生事件时要做的事,用户自己添加自己要做的事。
End Sub

WithEvents说明后面的对象是一个带有事件的对象(这个对象的类在类模块中有定义)

如果不加WithEvents,说明是一个一般的对象,这个对象将不会有事件发生,同时在代码窗的下拉列表中也不会有这个事件。所以不能省。

注意,WithEvents不能同New同时出现。两者只能分开单独出现。而且withevents不能创建数组。





对象创建:

一、创建静态对象:拖动控件到窗体上就是创建静态对象。

二、创建动态对象: 用代码创建,或者说在程序运行中才创建的。

        1、声明对象:dim  conn as adodb.connection    ’若要响应事件,或者说带上事件还应加上WithEvents

        2、Set和New来创建新实例

               Set   conn=New AdoDb.Connection

         3、动态创建可视对象

                使用Controls集合中的Add方法,在Controls集合中添加一个控件并返回一个对控件的引用。

                object.Add(ProgID,Name,Container)

                ProgID 标识控件,由库名、点号、类名组成。可以通过F2对象浏览器来得知。比如查看textbox的ProgID标志,按F2调出对象浏览器,找到textbox

                              其最上是库名:VB,最下面有一个Class TextBox,所以类名是TextBox。组合成ProgID就是:VB.TextBox   此参数不可省略

                Name   添加的这个控件被命名为什么名字,用户自己控制,是一个字符串。不可省略

                Container   指定添加控件所属的容器。可省略。省略时,容器默认为Controls所在的容器(一般是窗体)。可以自定在frame中等等。

 

Option Explicit

Dim WithEvents T As TextBox
Private Sub Form_Load()
    Set T = Me.Controls.Add("VB.TextBox", "text")
    T.Visible = True
End Sub

Private Sub T_Change()
    T.Text = "123456"
End Sub

              

 

对象的比较

判断是否指向(引用)同一个对象实例,用IS,不能用=

dim i as new Class1,j as Class1

Set  j=i

msgbox i Is j    ' 为真

上面是已经实例化,下面未实例化

dim i as class1,j as class1

msgbox i  Is j      ' 为真,因为都为Nothing

再看一个:

dim i as new class1

dim j as new class1

msgbox  i Is j   '为假,均实例化,系统为两者分配不同内存地址,故相互独立,返回假



对象类型判断:

1 、Typeof  obj  is Class 只能在IF中使用

2、TypeName(object)获取类名。如  TypeName(T)="Textbox"进行判断。



对象的清除与释放:

1、静态对象(窗体或控件)   用Unload

2、动态对象, Set obj=Nothing





再向前走一步:

对象数组:

一、窗体变量数组。

         如同定义其它数组一样,唯一区别就是,没加New时,仅引用无实例;当加New时,则每个元素均实例化,实例化时连同窗体上的所有控件一起。

Private Sub Command1_Click()
    Dim i As Integer
    Dim a(1 To 3) As New Form1 '产生窗体实例,实例包括窗体中的控件全部
    For i = 1 To 3
        a(i).Show
    Next i
End Sub

二、控件数组

         与窗体数组不同的是,不能用New

Private Sub Command1_Click()
    Dim obj(3) As TextBox, i As Integer
    For i = 0 To 3
        Set obj(i) = Me.Controls.Add("VB.TextBox", "MyAddTextBox" & i + 1) 'Set给对象赋值,参数1:ProgID,参数2:Name
        obj(i).Text = "text" & i
        obj(i).Visible = True           '默认是不显示,所以要显式指出
        If i > 0 Then
            obj(i).Left = obj(i - 1).Left + obj(i - 1).Width + 10
        End If
    Next i
End Sub


集合:

一堆数据,这数据可以是对象也可以是基本类型,还可以是自定义的。

这些数据可以是有序的,也可以是无序的。但实际上集体才不管你是有序或无序,它对集合没有任何影响。

集合的大小不固定,这与数组有点差别,它可以增加,更可以减少。

对象集合中每个元素都是以Variant进行存储和操作的,以方便进行处理。

集合的两个重要概念:索引(index)和键值(key)             按索引的不同可分为:基于0的集合,基于1的集合。


集合创建:

系统预定了一些集合如:Forms(窗体集合)   Controls(控件集合),而且 还提供了一个自定义的集合类型Connection来满足用户来定义一些集合。

Connection是一个有序集合,可以处理基数数据类型、数组和对象作为其中的元素,但是,不包括用户自定义的类型。

Connection提供强大的功能:

            Count   统计元素个数。只读 

             Add      添加一元素

             ReMove  删除一元素

             Item        指定一元素

用类生成器来创建集合(这是一个好东西,可以创建类或者集合,直观,方便,不被大量代码遮住)

       右击“工程窗体”,选择“添加类模块”,“类生成器”,就会出现一个窗体,选择文件-》新建-》集合,在弹出框中,可以改名,选择已有或新建一个类。

       点击确定,这样,就会根据类创建一个集合。

       还没有完,这个还没进工程,选择文件-》更新工程,新建的集合才进了工程中。


集合中对象的引用:

         1、根据名称:  Me.Controls("Label1").caption="用名称引用"

          2、根据索引:  Me.Controls(0).Caption=“用索引来引用”







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值