VB编程基础教程17-创建对象
- 爱奇艺限时半价 | 30+正版软件打折 | PD 虚拟机 7 折 | RackNerd 黑五 | 京东 Plus ¥69
创建对象的最简单方法是在“工具箱”中双击控件。但是,对 visual basic 中的所有可用对象以及来自其它应用程序的所有可用对象,要想充分体现它们的优势,可在运行时用 visual basic 的可编程性能创立对象。
用对象变量创建对象引用。
用类模块“从零开始”创建自己的对象。
用集合对象创建自己的集合。
详细信息 其它章节会介绍如何访问对象。例如,在“用部件编程”中将讨论 createobject 和 getobject 函数。
使用对象变量
除了存储值以外,变量可引用对象。如同给变量赋值一样,基于下列相同理由,可把对象赋给变量:
变量名往往比变量所含的值(或者,在此情况下,所含值就是它们引用的对象)短而好记。
在运行代码时,为了引用其它对象,应改变变量。
引用包含对象的变量比反复引用对象本身有更高的效率。
使用对象变量与使用常规变量一样,只不过多了把对象赋予变量这一步:
首先声明变量:
dim variable as class
然后把对象赋予变量:
set variable = object
声明对象变量
声明对象变量的方法和声明其它变量一样,要用 dim、redim、static、private 和 public。仅有的不同在于可选的 new 关键字和 class 参数,本章后面将会对 new 关键字和 class 参数都作介绍。语法是:
{dim | redim | static | private | public} variable as [new] class
例如,可以声明一个对象变量,它引用应用程序中的被称做 frmmain 的窗体:
dim formvar as new frmmain ‘声明一个类型为 frmmain
’的对象变量。
也可以声明一个对象变量,它引用应用程序中的任何窗体:
dim anyform as form ‘一般窗体变量。
类似地,可以声明一个对象变量,它能够引用应用程序中的任何文本框:
dim anytext as textbox ’可以引用任何文本框
‘(但只能是一个文本框)。
还可以声明一个对象变量,它能够引用任何类型的控件:
dim anycontrol as control ’一般控件变量。
注意,可以声明一个引用应用程序中的指定窗体的窗体变量,但不能声明引用特定控件的控件变量。可以声明能够引用控件的特定类型(如 textbox 或列表框)的控件变量,但不是引用那种类型的一个特定控件(如 txtentry 或 list1)。但是,可把特定的控件赋予那种类型的变量。例如,对于具有列表框 lstsample 的窗体可以这样编码:
dim objdemo as listbox
set objdemo = lstsample
赋值对象变量
用 set 语句将对象赋予对象变量:
set variable = object
无论何时,只要希望对象变量引用对象,就可使用 set 语句。
有时可用对象变量,尤其可用控件变量直接缩短要键入的代码。例如,原来的代码是这样的:
if frmaccountdisplay!txtaccountbalance.text < 0 then
frmaccountdisplay!txtaccountbalance.backcolor = 0 frmaccountdisplay!txtaccountbalance.forecolor = 255
end if
如果使用控件变量,程序就可显著缩短:
dim bal as textbox
set bal = frmaccountdisplay!txtaccountbalance
if bal.text < 0 then
bal.backcolor = 0
bal.forecolor = 255
end if
特定对象类型与一般对象类型
特定的对象变量必须引用特定类型的对象或类。特定的窗体变量只能引用应用程序中的一个窗体(尽管可在该窗体的诸多实例中引用其中之一)。与此相似,特定的控件变量只能引用应用程序中的特定类型的控件,比如 textbox 或者列表框。请看一例,打开新的工程,在窗体中放置一文本框。将下列代码添加到窗体中:
private sub form_click ()
dim anytext as textbox
set anytext = text1
anytext.text = "hello"
end sub
运行应用程序并单击窗体。文本框的 text 属性将变成 "hello"。
一般对象变量可在多种特定对象类型中引用其中一种。例如,一般窗体变量可引用应用程序中的任何窗体;一般控件变量可引用应用程序中任何窗体上的任何控件。请看一例,打开新的工程并在窗体中按任意顺序放置若干 frame、label 和 commandbutton 控件。将下列代码添加到窗体中:
private sub form_click ()
dim anycontrol as control
set anycontrol = form1.controls (3)
anycontrol.caption = "hello"
end sub
运行程序并单击窗体。刚才放入窗体中的第三个控件的标题将变成 "hello"。
visual basic 中有四种一般对象:
一般对象类型 可引用的对象
form 应用程序中的任何窗体(包括 mdi 子窗体和 mdi 窗体)。
control 应用程序中的任何控件。
mdiform 应用程序中的 mdi 窗体(如果应用程序有 mdi 窗体的话)。
object 任何对象。
在不知道变量运行时是否引用特定类型的对象时,一般对象变量是很有用的。例如,如果要书写代码,并使之在应用程序的任何窗体中都可操作,则必须使用一般窗体变量。
注意 由于应用程序中只能有一个 mdi 窗体,因此不必使用一般的 mdiform 类型。无论何时,一旦需要声明引用 mdi 窗体的窗体变量,就可用特定的 mdiform 类型(或者是 mdiform1,或者是对 mdi 窗体的 name 属性指定的任何名称),而不用一般的 mdiform 类型。实际上,由于在运行应用程序前,visual basic 就能够决定引用特定窗体类型的属性和方法,因此总应使用特定的 mdiform 类型。
只是出于完整性的考虑才提供一般的 mdiform 类型;在 visual basic 的今后版本中,单个应用程序中可以拥有多个 mdi 窗体,这将是非常有用的。
作为对象的窗体
窗体最常用到的是构造应用程序界面,但也常常是应用程序中其它模块调用的对象。窗体与类模块关系密切。两者之间的主要区别在于,窗体是可视对象,而类模块却没有可视界面。
添加自定义方法和属性
可对窗体添加自定义方法和属性,并可从应用程序中的其它模块访问它们。为了创建窗体的新方法,请添加用 public 声明的过程。
‘自定义 form1 的方法。
public sub latejobscount ()
.
. ’
.
end sub
可用下面这个语句从其它模块调用 latejobscount 过程:
form1.latejobscount
创建窗体的新属性就象在窗体模块中声明一个公用变量那样简单:
public idnumber as integer
可用下面两个语句从其它模块设置和返回 form1 的 idnumber 值:
form1.idnumber = 3
text1.text = form1.idnumber
也可用 property 过程向窗体添加自定义属性。
详细信息 “用对象编程”提供了 property 过程的详细材料。
注意 不必加载窗体就可调用窗体的变量或自定义方法,还可设置窗体的自定义属性。于是,不必将窗体加载到内存就可运行有关窗体的代码。同样,引用控件而不引用其属性或方法时也不会加载窗体。
使用 new 关键字
用 new 关键字创建新对象,这个对象被视为它的类所定义的对象。可用 new 创建集合、窗体的实例以及类模块中定义的类。
在窗体上使用 new 关键字
在设计时创建的窗体是类。可用 new 关键字创建这个类的新实例。为了看到这一工作过程,请在窗体上画出一个命令按钮和其它几个控件。在“属性”窗口中将窗体的 name 属性设置成 sample。在命令按钮的 click 事件过程中添加下列代码:
dim x as new sample
x.show
运行应用程序,并单击命令按钮数次。把最前面的窗体移到一边。因为窗体是具有可视界面的类,所以可看到附加副本。每个窗体在相同位置上都有相同控件,而且这些位置也正是窗体在设计时的位置。
注意 要使窗体变量和已加载窗体的实例一直存在,请用 static 或 public 变量,而不要用局部变量。
也可将 new 关键字与 set 语句并用。请试用命令按钮的 click 事件过程中的代码:
dim f as form1
set f = new form1
f.caption = "hello"
f.show
将 new 关键字和 set 语句并用会加快运行速度,因此,这种方法值得推荐。
对其它对象使用 new 关键字
可用 new 关键字从类模块中定义的类创建集合和对象。试用下例说明这一工作过程。
此例说明了 new 关键字是如何创建类的实例的。打开新工程,在 form1 上画出一个 commandbutton 控件。从“工程”菜单中选择“添加类模块”命令,从而在工程中添加一个类模块。设置类模块的 name 属性为 showme 。
form1 中的下列代码创建了类 showme 的新实例,还调用了包含在类模块中的过程。
public clsnew as showme
private sub command1_click ()
set clsnew = new showme
clsnew.showfrm
end sub
类模块中的 showfrm 过程创建类 form1 的新实例,显示窗体,然后使其最小化。
sub showfrm ()
dim frmnew as form1
set frmnew = new form1
frmnew.show
frmnew.windowstate = 1
end sub
为了应用这个例子,请运行应用程序并单击命令按钮数次。在创建 showme 类的每一个新实例时将看到最小化的窗体图标出现在桌面上。
详细信息 关于利用 new 创建对象的信息,请参阅“用部件编程”。
new 关键字的限制
下表说明不能用 new 关键字做什么。
不能用 new 创建 不允许的代码的例子
基本数据类型的变量。 dim x as new integer
任何一般对象类型的变量。 dim x as new control
任何特定控件类型的变量。 dim x as new listbox
任何特定控件的变量。 dim x as new lstnames
释放对对象的引用
每个对象都使用内存和系统资源。当不再使用对象时及时释放这些资源,这是良好的编程习惯。
用 unload 从内存中卸载窗体或控件。
用 nothing 释放对象变量占用的资源。用 set 语句将 nothing 赋予对象变量。
详细信息 请参阅语言参考中的“unload 事件”和“nothing”部分。
给过程传递对象
可在 visual basic 中将对象传递给过程。在下面的代码例子中假定窗体中有一 commandbutton 控件:
private sub command1_click ()
‘调用 demo 子过程,并将窗体传递给它。
demo form1
end sub
private sub demo (x as form1)
’在屏幕中使窗体居中。
x.left = (screen.width - x.width) / 2
end sub
可以通过引用把对象传递给参数,然后在过程内将参数设置成新对象。为了看到这一工作过程,打开工程并插入第二个窗体。在每个窗体中安放一个图片框。需要改变的属性设置值如下表所示:
对象 属性 设置
form2 上的 图片框 name
picture
picture2
c:\vb\icons\arrows\arw01dn.ico
form1_click 事件过程调用 form2 中的 getpicture 过程,并把一个空的图片框传递给它。
private sub form_click ()
form2.getpicture picture1
end sub
form2 中的 getpicture 过程把 form2 上的图片框的 picture 属性赋予 form1 上的空图片框。
private objx as picturebox
public sub getpicture (x as picturebox)
‘将传递进来的图片框赋予对象变量。
set objx = x
’将 picture 属性值赋予 form1 的图片框。
objx.picture = picture2.picture
end sub
为了应用这个例子,请运行程序并单击 form1。在 form1 的图片框中将看到出现了 form2 中的图标。
详细信息 上述主题意在概述对象。更详细内容,请参阅“用对象编程”和“用部件编程”。
/ 关注 “异次元软件世界” 微信公众号,获取最新软件推送 /
如本文“对您有用”,欢迎随意打赏异次元,让我们坚持创作!
赞赏一杯咖啡