- Visual Basic學習手冊
- 鞏建華 孫秀梅 安劍等編著
- 222字
- 2018-12-27 17:51:23
第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 本章小結
本章主要對數組進行詳細的介紹,分別對靜態數組、動態數組和控件數組進行講解,最后,向讀者介紹集合的概念及應用,使讀者對集合有一個基本的了解。恰當合理地運用數組,會大大提高程序的運行效率,提高程序設計的質量。
- Advanced Machine Learning with Python
- Learning Cython Programming(Second Edition)
- Docker技術入門與實戰(第3版)
- 軟件界面交互設計基礎
- JIRA 7 Administration Cookbook(Second Edition)
- 精通搜索分析
- 網頁設計與制作教程(HTML+CSS+JavaScript)(第2版)
- 數據結構(C語言)
- C程序設計實踐教程
- Building RESTful Python Web Services
- C# 8.0核心技術指南(原書第8版)
- Android系統下Java編程詳解
- Python預測分析與機器學習
- 原型設計:打造成功產品的實用方法及實踐
- SAS編程演義