控制項數組
控制項數組
控制項數組是Visual Basic中的一個名詞,它是一組具有相同名稱和類型的控制項的集合,通過各自的編號(下標)來識別,並且可以共享事件。
一方面,使用控制項數組所佔用的資源比單獨添加每個控制項所佔用的資源更少,另一方面,因為控制項數組的事件可以共享,如果要使多個同類型控制項在一個事件中執行相同或類似的代碼,使用控制項數組比單獨創建多個控制項更方便,代碼也更容易維護。
例如,在一個窗體中有若干個Command控制項,顯示的內容是從1開始編號,要讓用戶單擊某按鈕時,彈出一個窗口顯示其編號的平方,若不使用控制項數組,則要為Command1、Command2、……、Command10控制項一一添加Click事件的代碼;如果日後要調整顯示內容,則要一一修改每個控制項的代碼,非常繁瑣。而控制項數組就能用類似下面的代碼很好地解決這個問題:
在設計時,有三種辦法創建控制項數組:更改控制項的Index屬性、將已有的控制項複製到同一窗體中、使多個同類型的控制項的名稱(Name屬性)相同。
更改Index屬性
選擇一個控制項,按F4打開“屬性”面板,找到“Index”屬性,將其更改為一個0和32767之間(包括0和32767)的且未被用於其他控制項索引值的整數,即可創建一個以原控制項名稱為名稱的控制項數組。
複製已有控制項
若已有一控制項名為Command,右擊該控制項,單擊快捷菜單中的“複製”,再右擊控制項所在窗體(或其中的一個類似Frame的容器控制項),單擊快捷菜單中的“粘貼”,VB會彈出一個對話框,顯示“已經有一個控制項為 'Command'。創建一個控制項數組嗎?”單擊“是”按鈕,就可創建一個名稱(Name屬性)為“Command”的控制項數組,被複制的控制項為Command(0),粘貼的控制項為Command(1)。
使控制項名相同
若已有一控制項名為Command,將另一同類型控制項的Name屬性改為“Command”后,VB也會彈出一個對話框,單擊“是”即可創建一控制項數組。
運行時增減對象添加對象
在VB中,不能在運行時直接創建一個原先不存在的控制項數組,但可以使用Load函數為已存在的控制項數組添加同類型的控制項。
假設已有一個控制項數組名為“Command”,數組中只有一個對象“Command(0)”,在運行時,可以通過下面的代碼增加一個對象“Command(1)”。
PrivateSubCommand_Click(IndexAsInteger)'控制項數組中控制項的點擊事件LoadCommand(1)'添加Command(1)Command(1).Top=0'將Command(1)移至頂端Command(1).Visible=True'將Command(1)設置為可見EndSub
說明:
此處的Load函數的語法如下:
Load Object ( Index As Integer)
Load函數參數
參數
描述
Object
必選,對象表達式,要添加控制項的控制項數組名稱。
Index
運行時在一個控制項數組中添加了新的控制項后,新控制項除Index、TabIndex和Visible屬性外,其餘屬性與該控制項數組中Index屬性最小的控制項的相應屬性完全相同。而Index屬性在Load函數中指定,TabIndex屬性取VB規定的默認數值(比其他任何控制項都大),Visible為False。所以需要改變新控制項的Left或Top,以及Visible屬性后才能看到它。
這裡的代碼僅設計用於添加Command(1),即使Command中的按鈕被點擊兩次,也不能添加Command(2),而是會返回“對象已經載入”的錯誤。為了不斷添加控制項,可以使用下面的代碼。
PrivateSubCommand_Click(IndexAsInteger)'控制項數組中控制項的點擊事件IfCommand.UBound=32767ThenExitSubLoadCommand(Command.UBound+1)'添加控制項Command(Command.UBound).Top=Command.UBound*150'移動新控制項Command(Command.UBound).Visible=True'將新控制項設置為可見EndSub
控制項數組的UBound屬性返回該控制項數組中控制項的最大下標(索引值),添加索引值為Command.UBound+1(不大於32767)的控制項數組元素可以保證不發生“對象已經載入”的錯誤。但是,由於控制項數組中每個控制項的索引值並不一定是連續的,即可以只添加Command(1)和Command(3)而不添加Command(2),所以即使控制項數組最大索引值為32767,該控制項數組也不一定有32767個對象。
刪除對象
運行時可以使用Unload函數刪除控制項數組中 運行時創建的控制項,但設計時創建的控制項不能刪除。如:
UnloadCommand(1)
屬性概述
每個控制項數組本身都有4個屬性,這4個屬性都是設計時無效、運行時只讀的;而一個單獨的控制項還有和控制項數組相關的Index屬性。
Count屬性
Object.CountAs Long
返回控制項數組中的元素個數。
Item屬性
Object.Item ( IndexAs Integer)As Object
返回控制項數組中指定下標的控制項,相當於Object(IndexAs Integer)As Object。
LBound和UBound屬性
Object.LBoundAs Integer
Object.UBoundAs Integer
返回控制項數組中下標的最小值(LBound)或最大值(UBound)。
Index屬性
Object.IndexAs Integer
(0≤ Object.Index≤32767)
這個屬性應用於控制項數組中的一個控制項,作用是返回或設計時設置控制項在其控制項數組中的下標,僅當Object屬於某一控制項數組時有效。
示例
已有一個名為“Commands”的Command控制項數組,其中有一大小為900緹×450緹的Commands(0)控制項。運行時單擊Commands(0),則向控制項數組中添加一個新控制項並顯示在前一個控制項下方75緹處,Caption屬性為其Index屬性值;單擊其他控制項時,則從控制項數組中刪除該控制項。
PrivateSubCommands_Click(IndexAsInteger)WithCommandsIfIndex=0ThenIf.UBound=32767ThenExitSubLoad.Item(.UBound+1).Item(.UBound).Caption=.UBound.Item(.UBound).Top=(75+450)*.UBound+75.Item(.UBound).Visible=TrueElseUnload.Item(Index)EndIfEndWithEndSub
這裡用到了With語句,在With ... End With語句塊中可以省略“Commands”標識符而直接引用其屬性。