对象的引用
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=“用索引来引用”