第5章 熟悉数组与集合
(名师课堂:1小时21分)
数组是Visual Basic数据类型中比较特殊和比较重要的数据结构。在编程时,如果涉及数据不多,可以使用变量存取和处理数据,但对于成批的数据处理,就要用到数组。利用数组,可以简化程序、提高编程效率。本章主要介绍静态数组、动态数组及控件数组的相关知识及其应用。
通过学习本章,读者可以达到以下学习目的:
了解一维数组;
了解二维数组;
掌握数组声明;
掌握动态数组;
了解控件数组的创建;
了解控件数组的使用;
了解什么是集合及其应用。
5.1 认识数组
专题讲座:光盘文件\MR\Video\5\数组的概念.exe
视频速递:详细讲解数组概念、数组分类和数组与简单变量的区别
编程时,如果涉及数据不多,可以使用变量存取来处理数据,但对于成批的数据处理,就要用到数组。利用数组,可以简化程序、提高编程效率。本节主要介绍数组的概念和数组与简单变量的区别。
5.1.1 数组的概念
在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这种具有相同数据类型数据的有序集合称为数组。
由于有了数组,可以用相同的名字引用一系列的变量,并用数字(索引)来识别他们。使用数组可以缩短和简化程序,因为可以利用索引值设计一个循环,高效处理多种情况。数组有上界和下界,数组元素在上界和下界内是连续的,因为Visual Basic对每个索引值都分配空间,所以不要声明范围过大的数组。
学习手册
注意 这里讨论的是程序中声明的数组,它不同于控件数组,控件数组是在设计时,通过设置Index属性实现的,变量数组总是连续的,与控件数组是不同的,不能从一个数组中加载或者卸载数组元素。
数组是一组相同数据类型变量的集合,并不是一种数据类型。通常把数组中的变量称为数组元素,数组中每一个数组元素都有一个唯一的下标来标示自己,并且同一个数组中各个元素在内存中是连续存放的。在程序中使用数组名代表逻辑上相关的一些数据,用下标表示该数组中的各个元素,这使得程序书写简洁,操作方便,编写出来的程序出错率低,可读性强。
编程技术:数组在内存中的分配状况
数据的定义和一般的变量类似,在程序中如果定义了一个数组,当系统对源程序进行编译时会分配一个连续的空间,这个空间的大小根据定义数组的大小进行分配。如定义一个有10个数组元素的整型数组,Dim A(10) As Integer。系统会给数组分配一个具有10个整型变量那么大的连续的存储空间,数组的名字就是这一段连续内存空间的名字。这连续的存储空间就像一个存储数据的容器,用户可以向里面存放整型数据。定义一个具有10个数组元素的整型数据的内存中的表现形式如图5.1所示。
图5.1 数组在内存中的分配状况
『名词解释』
数组:数组可以看成是多个相同类型数据的组合,对这些数据的统一管理。数组中的元素可以是任何数据类型。
5.1.2 数组与简单变量的区别
数组与简单变量的声明方法类似,但它们之间仍有区别:
◆ 数组是以基本数据类型为基础,数组中每一个元素都属于同一数据类型。
◆ 数组的定义类似于简单变量的定义,所不同的是数组需要指定数组中的元素个数。
5.1.3 了解数组的分类
数组可以按照多种不同的方式进行分类,比如:数组的长度、数组的维数、数组类型、作用域和类型等。下面介绍这几种分类方式的具体情况。
◆ 按数组的长度分类:静态(定长)数组、动态(变长)数组。
◆ 按数组的维数分类:一维数组、二维数组、多维数组。
◆ 按数据类型分类:整型数组、字符串型数组、日期型数组等。
◆ 按作用域分类:模块级数组、窗体级数组、过程级数组。
◆ 按类型分类:菜单对象数组、控件数组等。
5.2 掌握静态数组的使用
专题讲座:光盘文件\MR\Video\5\静态数组.exe
视频速递:详细讲解静态数组的使用
静态数组是指程序在运行时,数组中包含的数组元素的个数不变,所占存储空间也保持不变。静态数组在声明的时候,就已经确定了数组的大小。静态数组根据其下标个数(即维数)的不同可分为一维数组、二维数组和多维数组。
5.2.1 声明和使用一维数组
1.一维数组的声明
一维数组是指只有一个下标的数组,对应于一个数字向量。
声明一维数组的语法格式如下:
Public|Private|Dim数组名(<下标>)[As<类型>]
声明一维数组语法中各部分的说明如表5.1所示。
表5.1 声明一维数组语法中各部分的说明
例如,使用Dim语句声明一维数组,代码如下:
Dim b(3)As String '声明静态一维数组 Dim c(5) '声明默认Variant数据类型静态一维数组
2.一维数组的调用
在调用一维数组前,所调用的数组最好是经过声明的数组。下面通过实例,说明一维数组的调用方法。
实例位置:光盘文件\MR\ Instance\5\5.1
【例5.1】 本实例使用选择排序法,实现当单击“排序”按钮时,将一维数组a中各元素按从小到大的顺序输出。程序运行结果如图5.2所示。
图5.2 调用一维数组
程序代码如下:
Dim a(9)As Long ' 声明静态一维数组为整型 Private Sub Form_Load() ' 给数组a中各数组元素赋值 a(0) = 564: a(1) = 78: a(2) = 45: a(3) = 456412 a(4) = 456: a(5) = 1: a(6) = 45 + 79 a(7) = 12: a(8) = 1 * 966: a(9) = 65 / 5 Dim i As Long For i=0 To 9 '显示数组a中各元素值 Label1.Caption =Label1.Caption&"a("&CStr(i+1)&")="&CStr(a(i))&"" Next i End Sub Private Sub Command1_Click() Dim i As Long, l As Long, n As Long For i=0 To 9 '使用选择排序法排序,每次选择最小的数值 For l = i To 9 If a(i)>a(l)Then n = a(i) a(i) = a(l) a(l) = n End If Next l Print a(i) '打印输出数组元素的值 Next i End Sub
5.2.2 理解二维数组
1.二维数组的声明
二维数组是指程序中拥有两个下标的数组。可以把二维数组看做一个X,Y坐标轴,数组中的元素就是X轴与Y轴的交叉点。
例如,使用Dim语句声明二维数组。代码如下:
Dim b(3,4)As String '声明静态二维数组 Dim c(5,9) '声明默认Variant数据类型静态二维数组
2.二维数组的调用
与一维数组一样,在调用二维数组之前,最好对其进行声明。下面通过实例说明二维数组的调用。
实例位置:光盘文件\MR\ Instance\5\5.2
【例5.2】 本例实现单击“赋值输出”按钮,为二维数组A中所有元素赋值,并将A中每个数组元素的值输出。程序运行结果如图5.3所示。
图5.3 调用二维数组
程序代码如下:
Dima(1To9,1To9) ' 声明静态二维数组 Private Sub Command1_Click() Dim i As Long,l As Long For i = 1 To 9 For l = 1 To 9 a(i, l) = l '打印输出二维数组元素值 Print"a("&CStr(i)&","&CStr(l)&")="&CStr(a(i,l))&" "; Next l Print Next i End Sub
5.2.3 定义多维数组
1.多维数组的声明
数字矩阵中的各个元素要用行、列位置标示。例如,为了追踪记录计算机屏幕上的每一个像素,需要引用它的x、y坐标。这时应该用多维数组存储值。
声明多维数组的形式如下:
Dim<数组名>(下标1,下标2,…) As<数据类型>
其中下标的形式与一维数组中的下标相同,下标的个数决定了数组的维数。多维数组的大小为每一维大小的乘积,每一维大小为“上界−下界+1”。
例如,使用Dim语句声明多维数组,程序代码如下:
Dim b(3,4,6,9)As Double ' 声明静态多维数组 Dim c(5,9,8,1,3) '声明默认Variant数据类型静态多维数组
2.多维数组的调用
多维数组在调用之前,最好对其进行声明。下面通过实例说明多维数组的调用。
实例位置:光盘文件\MR\ Instance\5\5.3
【例5.3】 本例实现的是通过For…Next循环使用Rnd随机函数动态创建一个三维数组,并且将创建的三维数组显示出来。程序运行结果如图5.4所示。
图5.4 调用多维数组
程序代码如下:
Private Sub Command1_Click() Me.Refresh D im arr(2,3,4) ' 声明三维数组 Dim i As Integer, j As Integer, z As Integer For z=0 To 4 For j = 0 To 3 For i = 0 To 2 arr(i ,j,z)=Int(Rnd*10) ' 三维数组的赋值随机产生 Next i Next j Next z For z=0 To 4 For j = 0 To 3 For i = 0 To 2 '输出三维数组 Print "arr" & "(" & i & "," & j & "," & z & ")=" & arr(i, j, z) & Space(4); Next i Next j Print Tab Next z End Sub
5.2.4 了解数组中的数组
数组的元素可以是任意的数据类型,因此可以建立Variant数据类型数组。Variant数据类型元素可以是其他数组。
实例位置:光盘文件\MR\ Instance\5\5.4
【例5.4】 建立两个数组,一个包含整数,而另一个包含字符串。然后声明第三个Variant数据类型数组,并将整数和字符串数组放置其中。
Private Sub Command1_Click() Dim i As Integer ' 声明计数器变量。'声明并放置整数数组 Dim intarray(5)As Integer '声明数组 For i=0 To 4 '循环体 intarray (i)=2205 '设置元素值 Next i '声明并放置字符串数组。 D im strarray(5)As String '声明数组 For i=0 To 4 '循环体 strarray(i)="明日科技" '设置元素值 Next i Dim arr(1 to 2)As Variant '声明拥有两个成员的新数组 arr(1)=intarray() ' 将其他数组移居到数组 arr(2) =strarray() MsgBox arr(1)(2) ' 显示结果“2205” MsgBox arr(2)(3) ' 显示结果“明日科技” End Sub
5.2.5 情景应用——制作幼儿识字卡片
许多年轻的父母越来越认识到幼儿早期智力开发的重要性。这里我们就利用数组设计一个幼儿识字卡片的程序。
实例位置:光盘文件\MR\ Instance\5\5.5
【例5.5】 制作一个幼儿识字卡片,在窗体上利用Label控件显示汉字,这里面汉字的数目和顺序是固定的,将汉字都存储在数组中,当用户单击按钮时,会将这些汉字显示在Label控件中,并显示出来。
程序的设计过程如下:
1.窗体界面设计
新建一个标准的EXE工程。
在工程中默认创建一个窗体,使用该窗体的默认名,设置BorderStyle属性为“0-None”,窗体无边框,设置Picture属性为设计好的图片。
在窗体上添加一个Label控件,设置Caption属性为空,Backstyle属性为白色,BorderStyle属性为“1-Fixed Single”,固定单边框,ForeColor属性为黑色。设置Font属性,如图5.5所示。
图5.5 “字体”对话框
添加一个Timer控件,用于实现Label控件一定的效果。
在窗体上添加4个Image控件,并设置Picture属性,分别用于执行“上一字”、“下一字”、“最小化”、“最大化”的功能。
2.程序代码设计
首先定义窗体模块级的数组变量:
Dim MyArray(10)As String ' 定义数组变量,存储汉字 Dim i As Integer ' 定义整型变量,存储数组序号
在窗体加载时,设置Timer控件不可用,并且给数组赋值,设置Label控件的显示位置,设置索引值为-1,程序代码如下:
Private Sub Form_Load() Timer1.Enabled=False ' 设置Timer控件不可用 Timer1.Interval=100 ' 设置Interval属性为100 '给数组赋值 My Array(0)="大":MyArray(1)="小":MyArray(2)="多":MyArray(3)="少" My Array(4)="上":MyArray(5)="中":MyArray(6)="下":MyArray(7)="左" My Array(8)="右":MyArray(9)="前":MyArray(10)="后" Label1.Left=-3800 ' 设置标签控件的Left属性 i=-1 '设置索引值 Image2_Click ' 调用“下一字”按钮 End Sub
当用户单击“上一字”或“下一字”按钮时,判断索引值,如果是“上一字”按钮,则将索引值减1,然后设置Label控件的位置,并设置Timer控件可用。如果是“下一字”按钮,则将索引值加1,设置Label控件的位置,并设置Timer控件可用,程序代码如下:
Private Sub Image1_Click() ' 上一字 If i>0 Then ' 如果索引值大于0 i=i-1 '索引值减1 Label1 =MyArray(i) '将数组中的值显示在标签中 End If Timer1.Enabled=True ' 设置Timer控件可用 Label1.Left=-4000 ' 设置Label控件的Left属性位置 End Sub Private Sub Image2_Click() ' 下一字 If i<10 Then ' 如果索引值小于10 i=i+1 '索引值加1 Label1 =MyArray(i) '设置标签中的文字 End If Timer1.Enabled=True ' 设置Timer控件可用 Label1.Left=-4000 ' 设置Label控件的Left属性位置 End Sub
Timer控件的Timer事件用于处理标签控件从左侧向右侧的移动效果,当移动到大约窗体中间的位置,则停止移动,程序代码如下:
Private Sub Timer1_Timer() If Label1.Left<5000 Then ' 如果标签的Left属性小于5000 Label1.Left =Label1.Left+200 '设置Label控件向右移动 Else '否则 Label1.Left =-4000 '设置Label控件显示在最左侧 End If '如果Label控件的Label属性在1560和1660中间时 If Label1.Left > 1560 And Label1.Left < 1660 Then T imer1.Enabled=False '设置Timer控件不可用 End If End Sub
运行效果如图5.6所示。
图5.6 幼儿识字卡片
5.3 熟悉动态数组的使用
专题讲座:光盘文件\MR\Video\5\动态数组.exe
视频速递:详细讲解动态数组的声明和调用
动态数组是指在程序运行时,可以增加或减少其数组元素个数的数组,从而其存储空间也会根据需求变大或变小。
5.3.1 声明动态数组
动态数组使用ReDim语句声明。
语法:
ReDim[Preserve] 数组名(下标)[As数据类型]
声明动态数组语法中各部分的说明如表5.2所示。
表5.2 声明动态数组语法中各部分描述
学习手册
说明 ReDim语句是在过程级别中使用的语句,它可以多次被使用,以改变数组的维数和大小。
学习手册
注意 定长数组声明中的下标是常量,而动态数组下标是常量也可以是定值的变量。
例如,在程序中声明动态数组a(10),程序代码如下:
ReDim a(10) As Long
学习手册
注意 动态数组只能改变其数组元素的多少,从而改变所占内存大小,不能改变其已经定义的数据类型。
动态数组还可以使用Dim语句声明。在使用Dim语句声明动态数组时,将数组下标定义为空(没有数组),并在需要改变这个数组大小时,使用ReDim语句重新声明这个数组的下标。
5.3.2 调用动态数组
实例位置:光盘文件\MR\ Instance\5\5.6
【例5.6】 前面介绍了动态数组的声明,下面通过一个例子讲解如何调用动态数组。当运行程序后,单击“输入”按钮,使用InPutBox函数弹出“输入”对话框,输入一些数据储存在动态数组A中,并将动态数组A中的数据在TextBox控件中显示出来。程序运行结果如图5.7所示。
图5.7 调用动态数组
程序代码如下:
Private Sub Command1_Click() Text1.Text = "" Dim S As Long, i As Long Dim A() Do ReDim Preserve A(S) '动态定义数组 A(S) =InputBox("请输入字符串,输入空串时结束","输入") '对话框输入数组元素 S = S + 1 Loop Until A(S -1) = "" For i=0 To S-2 Text1.Text = Text1.Text & "第" & CStr(i + 1) & "个是:" & CStr(A(i)) & " " Next i Erase A '重新初始化数组的元素 End Sub
学习手册
注意 ① Dim语句是不执行的,可以放在过程体的外部,ReDim语句是可执行的,必须放在过程体内部。
② ReDim语句可以反复使用,以改变数组的维数和元素个数,但不能改变数组类型。
③ 在第二次使用ReDim语句时将对数组重新初始化:若为数值型数组,各元素都变成0,若为字符型数组,各元素都变成长度为0的字符串;Variant型则变为Empty。
④ ReDim语句可直接定义数组。
5.4 熟练运用数组的基本操作
专题讲座:光盘文件\MR\Video\5\数组的基本操作.exe
视频速递:详细讲解数组的一些基本操作
数组进行声明之后就可以使用了,本节主要介绍数据的一些基本操作。
5.4.1 对数组元素进行初始化
对数组元素进行初始化是指给数组元素赋值,可以使用给变量赋值的方法为数组元素赋值。
例如,在数组元素较少的情况下可以像变量一样为数组赋值。代码如下:
Dim A(1 To 3) As String A(1) = "明日科技" A(2) = "www.mingrisoft.com" A(3)="Visual Basic技术从入门到精通"
也可以使用Visual Basic所提供的函数为数组元素赋值,如Array函数。在数组元素较多的情况下,可以使用循环结构语句为数组中每个元素赋值。
例如,利用嵌套循环结构为二维数组中每个元素赋值。代码如下:
Dim A(1 To 9, 1 To 9) Dim i As Long, l As Long For i = 1 To 9 For l=1 To 9 A(i,l)=0 '遍历二维数组中每个元素,并将其赋值为0 Next l Next i
学习手册
说明 可以在循环中使用InputBox函数与用户交互为数组赋值。
5.4.2 访问数组中的元素
数组的输出是指将数组元素输出。数组的输出与访问变量类似,其方法也大致相同。
例如,将String型数据类型数组A中的元素输出,程序代码如下:
Dim A(1 To 3) As String A(1) = "明日科技" A(2) = "www.mingrisoft.com" A(3)="Visual Basic技术从入门到精通" Print A(1),A(2),A(3) ' 输出数组元素值
数组的输出与输入类似,对于数组元素较多的数组,也可以使用循环语句结构将数组中的元素输出。多维数组也可以采用嵌套循环结构将数组元素输出。
5.4.3 向数组中插入元素
数组的插入是指将相同数据类型的元素插入到数组的指定位置。如图5.8、图5.9所示的是向数组插入元素前与插入元素后的效果。
图5.8 插入数组元素前
图5.9 插入数组元素后
对数组进行插入操作时,数组的大小会被改变,所以插入操作只能针对动态数组进行。
实例位置:光盘文件\MR\ Instance\5\5.7
【例5.7】 本例实现的是向数组A中的指定位置插入一个新数值6,并将插入后的数组A中的各数组元素输出到窗口中。结果如图5.10所示。
图5.10 数组的插入
程序代码如下:
Dim A() As Long Private Sub Command2_Click() ReDim Preserve A(1 To 4) A(1)=1:A(2)=2:A(3)=3:A(4)=4 '为动态数组A中元素赋值 Dim n As Long: n = 6 ReDim Preserve A(1 To 5) Dim i As Long, m As Long For i=2 To 5 '插入新数值 m = A(i) A(i) = n n = m Next i For i=1 To 5 Debug.Print "a("&CStr(i)&")="&CStr(A(i)), '输出数组A中的元素 Next i End Sub
5.4.4 删除数组中的元素
数组的删除是指删除数组中一个或多个元素。如图5.11、图5.12所示的是从数组中删除一个数组元素的前后情况。
图5.11 删除数组元素之前
图5.12 删除数组元素之后
实例位置:光盘文件\MR\ Instance\5\5.8
【例5.8】 本例实现的是从数组A中删除一个数组元素,并将删除后数组A中的各数组元素输出到窗口中。结果如图5.13所示。
图5.13 数组的删除
程序代码如下:
Private Sub Command2_Click() ReDim A(1 To 4) As Long A(1)=1:A(2)=2:A(3)=3:A(4)=4 '为动态数组A中元素赋值 Dim i As Long For i=2 To 3 A(i) = A(i + 1) Next i ReDim Preserve A(1 To 3) For i=1 To 3 Pri nt"a("&CStr(i)&")="&CStr(A(i)), '输出删除后数组A中的元素值 Next i End Sub
5.4.5 查找数组中的元素
数组的查找是指查找数组中指定的一个数组元素。可以使用循环语句结构对数组元素进行顺序查找,即遍历数组中每一个元素,查看数组中每一个数组元素是否与所要查找的数据相符,将符合的数组元素输出。
实例位置:光盘文件\MR\ Instance\5\5.9
【例5.9】 本例实现的是使用For…Next语句,从包含0~9数组元素的Long型数据类型数组A中,查找一个值等于16的数组元素。结果如图5.14所示。
图5.14 数组的查找
程序代码如下:
For i = 0 To 9 If A(i)=16 Then MsgBox "查找值等于16的数组元素保存在a(" & CStr(i) & "中。", vbOKOnly, "提示" Exit For End If Next i
对于数组元素取值有序(由小到大或由大到小等)的数组,可以采用二分法查找数组元素。二分法为:将所要查询的数值,先与位于数组中间的数组元素进行比较,根据比较结果再对前一半或后一半进行查找,然后继续取前一半或后一半中间的数组元素与查询的数值进行比较,循环比较,直到查询到符合条件的结果为止。
学习手册
注意 二分法只适用于有序数组。
5.5 学习运用与数组相关的函数及语句
专题讲座:光盘文件\MR\Video\5\与数组相关的函数及语句.exe
视频速递:详细讲解Array函数、Ubound函数、Lbound函数等
Visual Basic提供了一些针对数组的函数及语句,方便用户对数组进行各种操作。
5.5.1 利用Array函数给数组赋值
Array函数可以创建一个数组,并返回一个Variant数据类型的变量。
语法:
Array(arglist)
参数说明:
arglist:一个数值表,各数值之间用“,”分开。这些数值是用来给数组元素赋值的。当arglist中没有任何参数时,则创建一个长度为0的数组。
例如,将一个Variant型变量,使用Array函数赋值成Variant型数组,代码如下:
Dim A As Variant A=Array(45,2,6,7) 'A中包含4个数组元素,各元素的值为:45,2,6,7
学习手册
注意 数组A中第一个元素是A(0)。使用Array函数创建的数组只能是Variant数据类型,返回的变量也只能是Variant型,如果这个变量不是Variant型,Visual Basic将产生类型不匹配的错误。
5.5.2 利用UBound和LBound函数获得数组下标
UBound函数可以返回指定数组中的指定维数可用的最大下标。其返回值为Long型。而LBound函数与UBound函数相反,该函数可以返回指定数组中的指定维数可用的最小下标。其值为Long型。
语法:
UBound(<数组>[,<维数>]) LBound(<数组>[,<维数>])
参数说明:
数组:必需的。数组的名称,遵循标准的变量命名约定。
维数:可选的。用来指定返回哪一维,默认值是1(第一维)。UBound函数返回指定维的上界;LBound函数返回指定维的下界。
例如,对一个定义好的三维数组,分别使用UBound函数和LBound函数取其中各个维数的上界与下界。UBound函数与LBound函数对三维数组A的取值结果如表5.3所示。
表5.3 UBound函数和LBound函数的取值结果
定义三维数组的代码如下:
Dim A(1 To 100, 4, -3 To 2) As Long
5.5.3 利用Split函数创建数组
Split函数返回一个下标从零开始的一维数组,一维数组中包含了指定数目的子字符串。
语法:
Split(<表达式>[, <字符>[, count[, compare]]])
Split函数语法中各部分的说明如表5.4所示。
表5.4 Split函数语法中各部分的说明
compare参数的设置值如表5.5所示。
表5.5 compare参数的设置值
例如,使用Split函数将明日公司网址www.mingrisoft.com按“.”划分到字符串数组中。程序代码如下:
Dim A Private Sub Form_Load() A =Split("www.mingrisoft.com",".",-1,1) '返回一个下标从零开始的一维数组 End Sub Private Sub Command1_Click() Dim i As Long For i=0 To 2 Print"A("&i+1&")="&A(i) '打印输出数组元素值 Next i End Sub
输出的结果值为:
A(1)=www A(2)=mingrisoft A(3)=com
5.5.4 利用Option Base语句定义数组下标
Option Base语句用来指定声明数组时下标下界省略时的默认值。该语句是在模块中使用的语句。一个模块中只能出现一次,该语句必须写在模块的所有过程之前,而且必须位于带维数的数组声明之前。只对该语句所在模块中的数组下界有影响。
语法:
Option Base [0 | 1]
参数说明:
[0 | 1]:设置数组下标中下界省略时的默认值。一般情况下数组的下标下界省略时的默认值为0。
例如,在声明数组之前使用Option Base语句将下标中默认值设置为1后,声明数组A,代码如下:
Option Base 1 Dim A(4) As Long
数组A中的元素分别为:A(1),A(2),A(3),A(4)。
5.6 认识控件数组
专题讲座:光盘文件\MR\Video\5\控件数组.exe
视频速递:详细讲解控件数组的概念、声明和调用
在程序设计中,通常将类型相同、功能相似的控件视为一个数组。这就是本节将介绍的控件数组。
5.6.1 了解控件数组的概念
控件数组是一组相同类型的控件,使用相同名称,并共享同一过程的集合。这个控件集合中的每一个控件,都是该控件数组中的数组元素。
在创建控件数组时,系统会给这个控件数组中每一个控件唯一的索引(Index),即下标。这个索引的作用是用来区分控件数组中不同的控件。
5.6.2 声明控件数组
声明控件数组常使用的方法有复制粘贴法和设置控件的Name属性两种方法,下面分别进行简单的介绍。
1.复制粘贴法
通过复制粘贴控件创建控件数组,具体步骤如下。
在窗体上添加一个要创建控件数组的控件。
选中该控件,单击鼠标右键,在弹出的菜单中选择“复制”命令。
使用鼠标选中窗体,单击鼠标右键,在弹出的菜单中选择“粘贴”命令。此时会弹出一个如图5.15所示的提示对话框。单击“是”按钮后,则在窗体上添加了一个新的控件数组元素。
图5.15 创建控件数组时弹出的对话框
重复执行步骤3,直到添加完所需要的控件数组元素为止。
学习手册
注意 要在容器类型控件内创建控件数组,需要选中容器控件,如Frame(框架)控件等,执行“粘贴”命令。
2.设置控件Name(名称)属性
控件的Name属性用在代码中用来标识控件的名字。通过将同类型控件(名称)属性设置为相同名称,也可以声明控件数组。创建的步骤如下。
向窗体或容器控件中添加两个或多个同类型控件。
逐一选中添加的每个控件,在属性窗口中设置这些控件的(名称)属性并与第一个控件的名称一致,即可完成创建控件数组的过程。在第一次出现(名称)属性同名时,也会出现如图5.15所示的提示对话框。单击“是”按钮即可创建控件数组。
5.6.3 调用控件数组
下面通过实例说明控件数组的调用方法。
实例位置:光盘文件\MR\ Instance\5\5.10
【例5.10】 本例实现在单击CommandButton控件数组中的按钮时,通过Index(索引)属性判断单击的是哪个按钮。程序代码如下:
Private Sub Command1_Click(Index As Integer) Select Case Index Case 0 MsgBox "你单击的是‘确定’按钮", vbOKOnly, "明日图书" Case 1 MsgBox "你单击的是‘取消’按钮", vbOKOnly, "明日图书" End Select End Sub
5.6.4 情景应用——利用控件数组设置控件状态
开发程序时,响应不同的事件有时需要设置一组控件的不同状态。这里可以利用控件数组来实现,下面通过一个实例讲解如何实现利用控件数组设置控件状态。
实例位置:光盘文件\MR\ Instance\5\5.11
【例5.11】 创建一个Visual Basic工程,在窗体上添加一组Label控件数组,当鼠标划过每一个Label控件的时候,将其字体颜色显示为红色。程序的设计过程如下。
新建一个标准工程。
在工程中添加一个窗体,窗体的名称使用其默认名称,Caption属性设置为“利用控件数组设置控件状态”,StartUpPosition属性设置为“2-屏幕中心”。
在窗体上添加一个Label控件数组,Caption属性均设置为“明日科技”,并设置Font属性。
程序的主要代码如下。
Private Sub Label1_MouseMove(Index As Integer,Butt on As Integer,Shift As Integer,X As Sing le,Y As Single) Dim mouseover As Boolean mouseover = (0 <= X) And (X <= Label1(Index).Width) If mouseover Then For i=0 To Label1.Count-1 Label1(i).ForeColor =&H0& Next i Label1(Index ).ForeColor=&HFF& End If End Sub
程序的运行结果如图5.16所示。
图5.16 利用控件数组设置控件状态
5.7 了解集合的使用
专题讲座:光盘文件\MR\Video\5\集合.exe
视频速递:详细讲解集合的概念和应用
本节主要讲解集合的概念和集合的应用。让大家对集合的知识有所了解。
5.7.1 集合的概念
集合就是在Visual Basic中把相关的对象进行分组的一种方法。它是Visual Basic提供的一种特殊的数据结构,因此集合具有自己的属性和方法。集合还可以通过一个关键字来访问其集合元素。声明集合对象也可以用Dim语句。例如声明一个集合A元素,代码如下:
Dim A As New Collection
定义一个集合之后,就可以利用集合属性和方法进行操作与访问。集合中的对象提供了Add方法、Remove方法、Item方法和Count属性。
◆ Add方法:添加集合对象。
◆ Remove方法:删除集合对象。
◆ Item方法:引用集合对象元素。
◆ Count属性:返回集合元素个数。
5.7.2 数据集合对象的应用
实例位置:光盘文件\MR\ Instance\5\5.12
【例5.12】 本例首先要创建一个集合实体,并利用其Add方法将指定对象加入到集合中。然后对集合中的对象进行操作。例如,将所有的TextBox控件加入到集合中。将集合中所有的TextBox控件的Text属性赋值为“mingrisoft”,单击“确定”按钮,显示结果如图5.17所示。
图5.17 数据集合对象的应用
程序代码如下:
Dim aaa As Collection Private Sub Form_Load() Set aaa=New Collection Dim tex As Control For Each tex In Me.Controls If TypeName(tex)="TextBox"Then '判断对象类型是否为TextBox aaa.Add tex,tex.Name '将所有TextBox控件加入到集合 End If Next tex End Sub Private Sub Command1_Click() Dim item As Control For Each item In aaa item.Text="mingrisoft" '对集合中所有的TextBox控件的Text属性赋值 Next item End Sub
5.8 实战练习
5.8.1 利用数组随机抽取幸运观众
难度系数:★★★★
题目描述
在电视节目中,经常需要随机抽取幸运观众。如果观众抽取的范围较小,可以使用数组实现。下面介绍实现的方法:首先将所有观众的姓名生成数组,然后获得总的数组元素,在数组元素中随机抽取元素的下标,根据抽取的下标获得幸运观众。结果如图5.18所示。
图5.18 利用数组随机抽取幸运观众
技术指导
本例的实现主要用到了Split函数、Ubound函数、Int函数和Rnd函数等方面的知识。
紧急救援
如果您在做本例题的过程中遇到困难或疑惑,可以按照下面救援通道提供的网址获取本例题的源码和技术文档。
救援通道:http://www.mrbccd.com/VisualBasic/loveVisualBasic/5.8.1
5.8.2 利用数组实现矩阵转换
难度系数:★★★★
题目描述
在对数据进行分析时,有时需要对列与行进行转换(即矩阵转换),从而更清晰地分析数据。利用数组可以轻松实现矩阵转换。本练习尝试开发一个程序,思路是将数组中的行和列对换,实现效果如图5.19所示。
图5.19 矩阵转换
技术指导
本例主要是通过使用二维数组来实现的。二维数组是指程序中拥有两个下标的数组。可以把二维数组看做是一个XY坐标系中的点。
紧急救援
如果您在做本例题的过程中遇到困难或疑惑,可以按照下面救援通道提供的网址获取本例题的源码和技术文档。
救援通道:http://www.mrbccd.com/VisualBasic/loveVisualBasic/5.8.2
5.8.3 使用Split函数分隔明日公司网址
难度系数:★★★★
题目描述
本例主要实现了使用Split函数分隔明日公司网址的功能,以“.”作为分隔单位,使用Split函数将明日公司网址www.mingrisoft.com返回为字符串数组。将网址分隔后将值赋给数组并显示出来。程序的运行效果如图5.20所示。
图5.20 使用Split函数分隔明日公司网址
技术指导
本例的实现主要是通过使用Split函数来实现的。Split函数返回一个下标从零开始的一维数组,一维数组中包含了指定数目的子字符串。语法如下:
Split(<表达式>[, <字符>[, count[, compare]]])
Split函数语法中各部分的说明如表5.6所示。
表5.6 Split函数语法中各部分的说明
紧急救援
如果您在做本例题的过程中遇到困难或疑惑,可以按照下面救援通道提供的网址获取本例题的源码和技术文档。
救援通道:http://www.mrbccd.com/VisualBasic/loveVisualBasic/5.8.3
5.9 本章小结
本章主要对数组进行详细的介绍,分别对静态数组、动态数组和控件数组进行讲解,最后,向读者介绍集合的概念及应用,使读者对集合有一个基本的了解。恰当合理地运用数组,会大大提高程序的运行效率,提高程序设计的质量。