Variant變數中儲存的Objects
可以將Objects儲存在Variant變數中。當需要有效率地處理包括Objects在內的各種資料類型時,這可能十分有用。例如,一個陣列中的所有元素都必須具有相同的資料類型。將陣列的資料類型設為Variant就可將Objects連同其它資料類型存入同一個陣列中。
陣列
如果有過用其它語言程式設計的經歷,那麼想必會熟悉數組的概念。由於有了數組,可以用相同名字引用一系列變量,並用數字(索引)來識別它們。在許多場合,使用陣列可以縮短和簡化程序,因為可以利用索引值設計一個循環,有效地處理多種情況。數組有上界和下界,數組的元素在上下界內是連續的。因為VisualBasic對每個索引值都分配空間,所以不要不切實際宣告一個太大的陣列。
注意這一部分討論的數組是程式中宣告的變數數組。它們不同於控制項數組,控制項數組是在設計時透過設定控制項的Index屬性規定的。變數數組總是連續的;與控制項數組不同的是,不能從一個數組的中間載入或卸載數組元素。
一個數組中的所有元素具有相同的資料類型。當然,當資料類型為Variant時,各個元素能夠包含不同種類的資料(物件、字串、數值等等)。可以宣告任何基本資料類型的數組,包括使用者定義的類型(請參閱第八章「再論程式設計」中的「建立自己的資料類型」)和物件變數(請參閱第九章「用物件程式設計」) 。
在VisualBasic中有兩種類型的陣列:固定大小的陣列-它總是保持相同的大小,以及在運行時大小可以改變的動態陣列。在本章後面的「動態數組」中將要詳細討論動態數組。
聲明固定大小的數組
有三種方法宣告固定大小的數組,用哪一種方法取決於數組應有的有效範圍:
建立公用數組,在模組的宣告段用Public語句宣告數組。
建立模組級數組,在模組的宣告段用PRivate語句聲明數組。
建立局部數組,在過程中用Private語句聲明數組。
設定上下界
宣告數組時,在數組名之後跟一個用括號括起來的上界。上界不得超過Long資料型態的範圍(-2,147,483,648到2,147,483,647)。例如,下列數組宣告可出現在模組的宣告區段:
DimCounters(14)AsInteger '15個元素。
DimSums(20)AsDouble '21個元素。
為建立公用數組,直接用Public取代Dim。
PublicCounters(14)AsInteger
PublicSums(20)AsDouble
在過程之中同樣的聲明使用Dim:DimCounters(14)AsIntegerDimSums(20)AsDouble第一個聲明建立了一個有15個元素的數組,其索引號從0到14。第二個聲明建立了一個有21個元素的數組,其索引號從0到20。缺省的下界為0。
為了規定下界,用關鍵字To明確提供下界(為Long資料型別):
DimCounters(1To15)AsInteger
DimSums(100To120)AsString
在前述聲明中,Counters的索引值範圍從1到15,而Sums的索引值範圍從100到120。
包含其它數組的數組
有可能建立Variant資料類型數組,並與不同資料類型的數組共居一處。以下程式碼建立兩個數組,一個包含整數,而另一個包含字串。然後聲明第三個Variant數組,並將整數和字串數組放置其中:
PrivateSubCommand1_Click()
DimintXAsInteger '聲明計數器變數。
'聲明並放置整數數組。
DimcountersA(5)AsInteger
ForintX=0To4
countersA(intX)=5
NextintX
'聲明並放置字串數組。
DimcountersB(5)AsString
ForintX=0To4
countersB(intX)=hello
NextintX
DimarrX(2)AsVariant '聲明擁有兩個成員的新陣列。
arrX(1)=countersA() '將其它數組移居到數組。
arrX(2)=countersB()
MsgBoxarrX(1)(2) '顯示每個陣列的成員。
MsgBoxarrX(2)(3)
EndSub
多維數組
有時需要追蹤記錄數組中的相關資訊。例如,為了追蹤記錄電腦螢幕上的每個像素,需要引用它的X、Y座標。這時應該用多維數組來儲存值。可用VisualBasic聲明多維數組。例如,下面的語句宣告了一個過程內的10×10的二維陣列。
StaticMatrixA(9,9)AsDouble
可用顯式下界來宣告兩個維數或兩個維數中的任何一個:
StaticMatrixA(1To10,1To10)AsDouble
可以將所有這些推廣到二維以上的陣列。例如:
DimMultiD(3,1To10,1To15)
這個聲明建立了三維數組,大小為4×10×15。元素總數為三個維數的乘積,為600。
注意在增加數組的維數時,數組所佔的儲存空間會大幅增加,所以要慎用多維數組。使用Variant數組時更要格外小心,因為它們需要更大的儲存空間。
用循環操作數組
可以用For迴圈嵌套有效的處理多維數組。例如,在MatrixA中基於每個元素在陣列中的位置為其賦值:
DimIAsInteger,JAsInteger
StaticMatrixA(1To10,1To10)AsDouble
ForI=1To10
ForJ=1To10
MatrixA(I,J)=I*10 J
NextJ
NextI
詳細資訊關於循環的詳細信息,請參閱本章後面的“循環結構”部分。
動態數組
數組到底應該有多大才合適,有時可能不得而知。所以希望能夠在運行時具有改變數組大小的能力。
動態數組就可以在任何時候改變大小。在VisualBasic中,動態數組最靈活、最方便,有助於有效管理記憶體。例如,可短暫使用大數組,然後,不使用這個數組時,將記憶體空間釋放給系統。
如果不用動態數組,就要宣告一個數組,它的大小盡可能達到最大,然後再抹去那些不必要的元素。但是,如果過度使用這種方法,會導致記憶體的操作環境變慢。
若要建立動態數組,請依照下列步驟執行:
1.(如果希望數組為公用數組,則)用Public語句聲明數組,或者(如果希望數組為模組級,則)在模組級用Dim語句聲明數組,或者(如果希望數組為局部數組,則)在過程中用Static或Dim語句聲明數組。給數組附以空維數組,這樣就將數組宣告為動態數組。
DimDynArray()
2.用ReDim語句分配實際的元素個數。
ReDimDynArray(X 1)
ReDim語句只能出現在過程中。與Dim語句、Static語句不同,ReDim語句是一個可執行語句,由於這個語句,應用程式在執行時執行一個動作。 ReDim語句支援這樣的語法,它與固定數組中使用的語法相同。對於每一維數,每個ReDim語句都能改變元素數目以及上下界。但是,數組的維數不能改變。
ReDimDynArray(4to12)
例如,用第一次聲明在模組級所建立的動態數組Matrix1:
DimMatrix1()AsInteger
然後,在過程中給數組分配空間:
SubCalcValuesNow()
.
.
.
ReDimMatrix1(19,29)
EndSub
這裡的ReDim語句給Matrix一個20×30的整數矩陣(元素總大小為600)。還有一個辦法,用變數設定動態數組的邊界:
ReDimMatrix1(X,Y)
注意您可以將字串賦值給大小可變的位元組數組。一個位元組數組也可以被賦值給一個可變長的字串。一定要注意字串中的位元組數會隨平台而變化。同一個字串在Unicode平台上的位元組數是它在非Unicode平台上的兩倍。
保留動態數組的內容
每次執行ReDim語句時,目前儲存在陣列中的值都會全部遺失。 VisualBasic重新將陣列元素的值置為Empty(對Variant陣列)、置為0(對Numeric陣列)、置為零長度字串(對String陣列)或置為Nothing(對於物件的陣列)。
在為新資料準備數組,或者要縮減數組大小以節省記憶體時,這樣做是非常有用的。有時希望改變數組大小又不遺失數組中的資料。使用具有Preserve關鍵字的ReDim語句就可做到這一點。例如,使用UBound函數引用上界,使陣列擴充、增加一個元素,而現有元素的值並未遺失:
ReDimPreserveDynArray(UBound(DynArray) 1)
在用Preserve關鍵字時,只能改變多維數組中最後一維的上界;如果改變了其它維或最後一維的下界,那麼運行時就會出錯。所以可這樣程式設計:
ReDimPreserveMatrix(10,UBound(Matrix,2) 1)
而不可這樣編程:
ReDimPreserveMatrix(UBound(Matrix,1) 1,10)
詳細資訊關於動態數組的更詳細信息,請參閱語言參考中的“ReDim函數”。關於物件數組,請參閱第九章「用物件程式設計」。
->