控制项数组

控制项数组是Visual Basic中的一个名词,它是一组具有相同名称和类型的控制项的集合,通过各自的编号(下标)来识别,并且可以共享事件。

一方面,使用控制项数组所占用的资源比单独添加每个控制项所占用的资源更少,另一方面,因为控制项数组的事件可以共享,如果要使多个同类型控制项在一个事件中执行相同或类似的代码,使用控制项数组比单独创建多个控制项更方便,代码也更容易维护。

例如,在一个窗体中有若干个Command控制项,显示的内容是从1开始编号,要让用户单击某按钮时,弹出一个窗口显示其编号的平方,若不使用控制项数组,则要为Command1、Command2、……、Command10控制项一一添加Click事件的代码;如果日后要调整显示内容,则要一一修改每个控制项的代码,非常繁琐。而控制项数组就能用类似下面的代码很好地解决这个问题:

在设计时,有三种办法创建控制项数组:更改控制项的Index属性、将已有的控制项复制到同一窗体中、使多个同类型的控制项的名称(Name属性)相同。

更改Index属性

选择一个控制项,按F4打开「属性」面板,找到「Index」属性,将其更改为一个0和32767之间(包括0和32767)的且未被用于其他控制项索引值的整数,即可创建一个以原控制项名称为名称的控制项数组。

复制已有控制项

若已有一控制项名为Command,右击该控制项,单击快捷菜单中的「复制」,再右击控制项所在窗体(或其中的一个类似Frame的容器控制项),单击快捷菜单中的「粘贴」,VB会弹出一个对话框,显示「已经有一个控制项为 ‘Command’。创建一个控制项数组吗?」单击「是」按钮,就可创建一个名称(Name属性)为「Command」的控制项数组,被复制的控制项为Command(0),粘贴的控制项为Command(1)。

使控制项名相同

若已有一控制项名为Command,将另一同类型控制项的Name属性改为「Command」后,VB也会弹出一个对话框,单击「是」即可创建一控制项数组。

运行时增减对象添加对象

在VB中,不能在运行时直接创建一个原先不存在的控制项数组,但可以使用Load函数为已存在的控制项数组添加同类型的控制项。

假设已有一个控制项数组名为「Command」,数组中只有一个对象「Command(0)」,在运行时,可以通过下面的代码增加一个对象「Command(1)」。

PrivateSubCommand_Click(IndexAsInteger)’控制项数组中控制项的点击事件LoadCommand(1)’添加Command(1)Command(1).Top=0’将Command(1)移至顶端Command(1).Visible=True’将Command(1)设置为可见EndSub

说明:

此处的Load函数的语法如下:

Load Object ( Index As Integer)

Load函数参数

参数

描述

Object

必选,对象表达式,要添加控制项的控制项数组名称。

Index

必选,数值表达式,0~32767的一个整数,被添加的控制项在控制项数组中的索引值(Index属性),该值必须未被引用。

运行时在一个控制项数组中添加了新的控制项后,新控制项除Index、TabIndex和Visible属性外,其余属性与该控制项数组中Index属性最小的控制项的相应属性完全相同。而Index属性在Load函数中指定,TabIndex属性取VB规定的默认数值(比其他任何控制项都大),Visible为False。所以需要改变新控制项的Left或Top,以及Visible属性后才能看到它。

这里的代码仅设计用于添加Command(1),即使Command中的按钮被点击两次,也不能添加Command(2),而是会返回「对象已经载入」的错误。为了不断添加控制项,可以使用下面的代码。

PrivateSubCommand_Click(IndexAsInteger)’控制项数组中控制项的点击事件IfCommand.UBound=32767ThenExitSubLoadCommand(Command.UBound+1)’添加控制项Command(Command.UBound).Top=Command.UBound*150’移动新控制项Command(Command.UBound).Visible=True’将新控制项设置为可见EndSub

控制项数组的UBound属性返回该控制项数组中控制项的最大下标(索引值),添加索引值为Command.UBound+1(不大于32767)的控制项数组元素可以保证不发生「对象已经载入」的错误。但是,由于控制项数组中每个控制项的索引值并不一定是连续的,即可以只添加Command(1)和Command(3)而不添加Command(2),所以即使控制项数组最大索引值为32767,该控制项数组也不一定有32767个对象。

删除对象

运行时可以使用Unload函数删除控制项数组中 运行时创建的控制项,但设计时创建的控制项不能删除。如:

UnloadCommand(1)

Unload函数语法与Load函数语法相似。

属性概述

每个控制项数组本身都有4个属性,这4个属性都是设计时无效、运行时只读的;而一个单独的控制项还有和控制项数组相关的Index属性。

Count属性

Object.CountAs Long

返回控制项数组中的元素个数。

Item属性

Object.Item ( IndexAs Integer)As Object

返回控制项数组中指定下标的控制项,相当于Object(IndexAs Integer)As Object。

LBound和UBound属性

Object.LBoundAs Integer

Object.UBoundAs Integer

返回控制项数组中下标的最小值(LBound)或最大值(UBound)。

Index属性

Object.IndexAs Integer

(0≤ Object.Index≤32767)

这个属性应用于控制项数组中的一个控制项,作用是返回或设计时设置控制项在其控制项数组中的下标,仅当Object属于某一控制项数组时有效。

示例

已有一个名为「Commands」的Command控制项数组,其中有一大小为900缇×450缇的Commands(0)控制项。运行时单击Commands(0),则向控制项数组中添加一个新控制项并显示在前一个控制项下方75缇处,Caption属性为其Index属性值;单击其他控制项时,则从控制项数组中删除该控制项。

PrivateSubCommands_Click(IndexAsInteger)WithCommandsIfIndex=0ThenIf.UBound=32767ThenExitSubLoad.Item(.UBound+1).Item(.UBound).Caption=.UBound.Item(.UBound).Top=(75+450)*.UBound+75.Item(.UBound).Visible=TrueElseUnload.Item(Index)EndIfEndWithEndSub

这里用到了With语句,在With … End With语句块中可以省略「Commands」标识符而直接引用其属性。