Visual Basic学习手册
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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.二维数组的声明

二维数组是指程序中拥有两个下标的数组。可以把二维数组看做一个XY坐标轴,数组中的元素就是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.多维数组的声明

数字矩阵中的各个元素要用行、列位置标示。例如,为了追踪记录计算机屏幕上的每一个像素,需要引用它的xy坐标。这时应该用多维数组存储值。

声明多维数组的形式如下:

        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 本章小结

本章主要对数组进行详细的介绍,分别对静态数组、动态数组和控件数组进行讲解,最后,向读者介绍集合的概念及应用,使读者对集合有一个基本的了解。恰当合理地运用数组,会大大提高程序的运行效率,提高程序设计的质量。