什麼是控制元件陣列控制元件陣列的優點

  控制元件陣列是一組具有相同名稱和型別的控制元件的集合,通過各自的編號***下標***來識別,並且可以共享事件。那麼你對控制元件陣列瞭解多少呢?以下是由小編整理關於什麼是控制元件陣列的內容,希望大家喜歡!

  控制元件陣列的概述

  在設計時,有三種辦法建立控制元件陣列:更改控制元件的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

  必選,數值表示式,0~32767的一個整數,被新增的控制元件在控制元件陣列中的索引值***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***

  Unload函式語法與Load函式語法相似。

  屬性概述

  每個控制元件陣列本身都有4個屬性,這4個屬性都是設計時無效、執行時只讀的;而一個單獨的控制元件還有和控制元件陣列相關的Index屬性。

  Count屬性

  Object.Count As Long

  返回控制元件陣列中的元素個數。

  Item屬性

  Object.Item ***IndexAs Integer*** As Object

  返回控制元件陣列中指定下標的控制元件,相當於Object***IndexAs Integer*** As Object。

  LBound和UBound屬性

  Object.LBound As Integer

  Object.UBound As Integer

  返回控制元件陣列中下標的最小值***LBound***或最大值***UBound***。

  Index屬性

  Object.Index As 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”識別符號而直接引用其屬性。

  控制元件陣列的優點

  一方面,使用控制元件陣列所佔用的資源比單獨新增每個控制元件所佔用的資源更少,另一方面,因為控制元件陣列的事件可以共享,如果要使多個同類型控制元件在一個事件中執行相同或類似的程式碼,使用控制元件陣列比單獨建立多個控制元件更方便,程式碼也更容易維護。

  例如,在一個窗體中有若干個Command控制元件,顯示的內容是從1開始編號,要讓使用者單擊某按鈕時,彈出一個視窗顯示其編號的平方,若不使用控制元件陣列,則要為Command1、Command2、……、Command10控制元件一一新增Click事件的程式碼;如果日後要調整顯示內容,則要一一修改每個控制元件的程式碼,非常繁瑣。而控制元件陣列就能用類似下面的程式碼很好地解決這個問題:

  PrivateSubCommands1_Click***IndexAsInteger***

  MsgBoxIndex^2

  EndSub

控制元件陣列的優點