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

VB备忘录(7)类与对象--再回首,第1张

概述对象的引用 dim objvar   as object   ‘创建一个引用 dim objvar   as New   object   '创建一个引用 为啥后面有New呢?当一个对象是顶层对象、外部可创建对象时,就用new来生成,比如引用外部的excel表时。这里叫直接赋值引用                                     当一个对象是从属关系,即前面顶层中已经含有时

对象的引用

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 @R_502_6889@() 无返回值






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

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

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


事件定义:

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

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

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

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


引发事件

RaiseEvent Event@R_502_6889@ [(参数)]

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

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

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


事件处理

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

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


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


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

例子:

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

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


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

2、事件的处理

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

Option ExplicitDim WithEvents obj As MyClassPrivate Sub Form_Load()    Set obj = New MyClass    obj.MethodEnd SubPrivate 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,@R_502_6889@,Container)

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

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

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

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

Option ExplicitDim WithEvents T As TextBoxPrivate Sub Form_Load()    Set T = Me.Controls.Add("VB.TextBox","text")    T.Visible = TrueEnd SubPrivate 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、Type@R_502_6889@(object)获取类名。如 Type@R_502_6889@(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 iEnd 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:@R_502_6889@        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 iEnd Sub


集合:

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

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

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

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

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


集合创建:

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

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

Connection提供强大的功能:

Count 统计元素个数。只读

Add 添加一元素

ReMove 删除一元素

Item 指定一元素

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

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

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

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


集合中对象的引用:

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

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

总结

以上是内存溢出为你收集整理的VB备忘录(7)类与对象--再回首全部内容,希望文章能够帮你解决VB备忘录(7)类与对象--再回首所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1280616.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存