Variant變量中存儲的Objects
可以將Objects存儲在Variant變量中。當需要高效地處理包括Objects在內(nèi)的各種數(shù)據(jù)類型時,這可能十分有用。例如,一個數(shù)組中的所有元素都必須具有相同的數(shù)據(jù)類型。將數(shù)組的數(shù)據(jù)類型設置成Variant就可將Objects連同其它數(shù)據(jù)類型一起存入同一個數(shù)組中。
數(shù)組
如果有過用其它語言編程的經(jīng)歷,那么想必會熟悉數(shù)組的概念。由于有了數(shù)組,可以用相同名字引用一系列變量,并用數(shù)字(索引)來識別它們。在許多場合,使用數(shù)組可以縮短和簡化程序,因為可以利用索引值設計一個循環(huán),高效處理多種情況。數(shù)組有上界和下界,數(shù)組的元素在上下界內(nèi)是連續(xù)的。因為VisualBasic對每一個索引值都分配空間,所以不要不切實際聲明一個太大的數(shù)組。
注意這一部分討論的數(shù)組是程序中聲明的變量數(shù)組。它們不同于控件數(shù)組,控件數(shù)組是在設計時通過設置控件的Index屬性規(guī)定的。變量數(shù)組總是連續(xù)的;與控件數(shù)組不同的是,不能從一個數(shù)組的中部加載或卸載數(shù)組元素。
一個數(shù)組中的所有元素具有相同的數(shù)據(jù)類型。當然,當數(shù)據(jù)類型為Variant時,各個元素能夠包含不同種類的數(shù)據(jù)(對象、字符串、數(shù)值等等)。可以聲明任何基本數(shù)據(jù)類型的數(shù)組,包括用戶定義的類型(請參閱第八章“再論編程”中的“創(chuàng)建自己的數(shù)據(jù)類型”)和對象變量(請參閱第九章“用對象編程”)。
在VisualBasic中有兩種類型的數(shù)組:固定大小的數(shù)組——它總是保持同樣的大小,以及在運行時大小可以改變的動態(tài)數(shù)組。在本章后面的“動態(tài)數(shù)組”中將要詳細討論動態(tài)數(shù)組。
聲明固定大小的數(shù)組
有三種方法聲明固定大小的數(shù)組,用哪一種方法取決于數(shù)組應有的有效范圍:
建立公用數(shù)組,在模塊的聲明段用Public語句聲明數(shù)組。
建立模塊級數(shù)組,在模塊的聲明段用 MsgBoxarrX(2)(3)
EndSub
多維數(shù)組
有時需要追蹤記錄數(shù)組中的相關信息。例如,為了追蹤記錄計算機屏幕上的每一個像素,需要引用它的X、Y坐標。這時應該用多維數(shù)組存儲值??捎肰isualBasic聲明多維數(shù)組。例如,下面的語句聲明了一個過程內(nèi)的10×10的二維數(shù)組。
StaticMatrixA(9,9)AsDouble
可用顯式下界來聲明兩個維數(shù)或兩個維數(shù)中的任何一個:
StaticMatrixA(1To10,1To10)AsDouble
可以將所有這些推廣到二維以上的數(shù)組。例如:
DimMultiD(3,1To10,1To15)
這個聲明建立了三維數(shù)組,大小為4×10×15。元素總數(shù)為三個維數(shù)的乘積,為600。
注意在增加數(shù)組的維數(shù)時,數(shù)組所占的存儲空間會大幅度增加,所以要慎用多維數(shù)組。使用Variant數(shù)組時更要格外小心,因為它們需要更大的存儲空間。
用循環(huán)操作數(shù)組
可以用For循環(huán)嵌套有效的處理多維數(shù)組。例如,在MatrixA中基于每個元素在數(shù)組中的位置為其賦值:
DimIAsInteger,JAsInteger
StaticMatrixA(1To10,1To10)AsDouble
ForI=1To10
ForJ=1To10
MatrixA(I,J)=I*10 J
NextJ
NextI
詳細信息關于循環(huán)的詳細信息,請參閱本章后面的“循環(huán)結(jié)構(gòu)”部分。
動態(tài)數(shù)組
數(shù)組到底應該有多大才合適,有時可能不得而知。所以希望能夠在運行時具有改變數(shù)組大小的能力。
動態(tài)數(shù)組就可以在任何時候改變大小。在VisualBasic中,動態(tài)數(shù)組最靈活、最方便,有助于有效管理內(nèi)存。例如,可短時間使用一個大數(shù)組,然后,在不使用這個數(shù)組時,將內(nèi)存空間釋放給系統(tǒng)。
如果不用動態(tài)數(shù)組,就要聲明一個數(shù)組,它的大小盡可能達到最大,然后再抹去那些不必要的元素。但是,如果過度使用這種方法,會導致內(nèi)存的操作環(huán)境變慢。
要創(chuàng)建動態(tài)數(shù)組,請按照以下步驟執(zhí)行:
1.(如果希望數(shù)組為公用數(shù)組,則)用Public語句聲明數(shù)組,或者(如果希望數(shù)組為模塊級,則)在模塊級用Dim語句聲明數(shù)組,或者(如果希望數(shù)組為局部數(shù)組,則)在過程中用Static或Dim語句聲明數(shù)組。給數(shù)組附以一個空維數(shù)表,這樣就將數(shù)組聲明為動態(tài)數(shù)組。
DimDynArray()
2.用ReDim語句分配實際的元素個數(shù)。
ReDimDynArray(X 1)
ReDim語句只能出現(xiàn)在過程中。與Dim語句、Static語句不同,ReDim語句是一個可執(zhí)行語句,由于這一語句,應用程序在運行時執(zhí)行一個操作。ReDim語句支持這樣的語法,它與固定數(shù)組中使用的語法相同。對于每一維數(shù),每個ReDim語句都能改變元素數(shù)目以及上下界。但是,數(shù)組的維數(shù)不能改變。
ReDimDynArray(4to12)
例如,用第一次聲明在模塊級所建立的動態(tài)數(shù)組Matrix1:
DimMatrix1()AsInteger
然后,在過程中給數(shù)組分配空間:
SubCalcValuesNow()
.
.
.
ReDimMatrix1(19,29)
EndSub
這里的ReDim語句給Matrix分配一個20×30的整數(shù)矩陣(元素總大小為600)。還有一個辦法,用變量設置動態(tài)數(shù)組的邊界:
ReDimMatrix1(X,Y)
注意您可以將字符串賦值給大小可變的字節(jié)數(shù)組。一個字節(jié)數(shù)組也可以被賦值給一個可變長的字符串。一定要注意字符串中的字節(jié)數(shù)會隨平臺而變化。同一個字符串在Unicode平臺上的字節(jié)數(shù)是它在非Unicode平臺上的兩倍。
保留動態(tài)數(shù)組的內(nèi)容
每次執(zhí)行ReDim語句時,當前存儲在數(shù)組中的值都會全部丟失。VisualBasic重新將數(shù)組元素的值置為Empty(對Variant數(shù)組)、置為0(對Numeric數(shù)組)、置為零長度字符串(對String數(shù)組)或者置為Nothing(對于對象的數(shù)組)。
在為新數(shù)據(jù)準備數(shù)組,或者要縮減數(shù)組大小以節(jié)省內(nèi)存時,這樣做是非常有用的。有時希望改變數(shù)組大小又不丟失數(shù)組中的數(shù)據(jù)。使用具有Preserve關鍵字的ReDim語句就可做到這點。例如,使用UBound函數(shù)引用上界,使數(shù)組擴大、增加一個元素,而現(xiàn)有元素的值并未丟失:
ReDimPreserveDynArray(UBound(DynArray) 1)
在用Preserve關鍵字時,只能改變多維數(shù)組中最后一維的上界;如果改變了其它維或最后一維的下界,那么運行時就會出錯。所以可這樣編程:
ReDimPreserveMatrix(10,UBound(Matrix,2) 1)
而不可這樣編程:
ReDimPreserveMatrix(UBound(Matrix,1) 1,10)
詳細信息關于動態(tài)數(shù)組的更詳細信息,請參閱語言參考中的“ReDim函數(shù)”。關于對象數(shù)組,請參閱第九章“用對象編程”。
新聞熱點
疑難解答