為用戶提供選擇的控件
大多數應用程序需要向用戶提供選擇,如簡單的“Yes/No”選項、或者從包含成百個可能性的列表中進行選擇。VisualBasic包含幾種用於提供選擇的標准控件。下列表格總結了這些控件及其用途。
用CheckBox選擇單個選項
CheckBox表明一個特定的狀態是選定(on)還是清除(off)。在應用程序中使用CheckBox為用戶提供了“True/False”或“yes/no”的選擇。因為CheckBox彼此獨立工作,所以用戶可以同時選擇任意多個CheckBox。例如,在圖3.9中,可同時選定粗體和斜體。
CheckBox應用程序
這個例子使用一個CheckBox來決定文本用普通字體還是用斜體字顯示。關於此例的工作版本,請參閱應用程序示例Controls.vbp中的Check.frm。如圖3.10所示,此應用程序有一個TextBox,一個Label,一個CommandButton和兩個CheckBox。
下表列出了應用程序中的對象的屬性設置。
選定粗體或斜體時,CheckBox的Value屬性值設置為1,不選定時為0。缺省Value值為0,所以除非改變Value屬性值,否則第一次顯示時不會選定CheckBox。可以用常量vbChecked和vbUnchecked表示數值1和0。
checkbox應用程序中的事件
當單擊CheckBox時,會發生CheckBox的Click事件。此事件過程測試是否選定CheckBox(即是否Value=vbChecked)。如果選定,通過設置Font對象的Bold或Italic屬性,將文本轉換為粗體或斜體;該Font對象是由TextBox的Font屬性返回的。
PrivateSubchkBold_Click()
IfChkBold.Value=vbCheckedThen '如果選定。
txtDisplay.Font.Bold=True
Else '如果沒有選定。
txtDisplay.Font.Bold=False
EndIf
EndSub
PrivateSubchkItalic_Click()
IfChkItalic.Value=vbCheckedThen '如果選定。
txtDisplay.Font.Italic=True
Else '如果沒有選定。
txtDisplay.Font.Italic=False
EndIf
EndSub
用選項按鈕進行選項分組
選項按鈕表示給用戶一組兩個或更多的選擇。但是,不同於CheckBox,選項按鈕總是作為一組的組成部分工作的;因此,選擇一個選項按鈕就會立即清除該組中的其它按鈕。定義一個選項按鈕組,告訴用戶“這是一組選擇,從中選一個,而且只選一個”。
例如,在圖3.11所示的選項按鈕組中,用戶只能在三個選項按鈕中選擇一個。
創建選項按鈕組
直接放在一個窗體中(也就是不在Frame或PictureBox中)的所有的選項按鈕構成一組。如果想創建別的選項按鈕組,必須將其中一些選項按鈕組放到Frame或PictureBox中去。
所有在給定的Frame中的選項按鈕,組成一個獨立的組,在PictureBox中的所有選項按鈕也是如此。用這種方法生成一個獨立的組時,總是要先畫好一個Frame或PictureBox,然後,將選項按鈕畫到裡面。圖3.12顯示了一個具有兩個選項按鈕組的窗體。
在Frame中畫了一組選項按鈕後,用戶只能在組內選擇一個選項按鈕。要在Frame中為控件分組,請按照以下步驟執行:
1.在“工具箱”中選擇Frame控件,並在窗體上畫出Frame。
2.在“工具箱”中選擇OptionButton控件,並在Frame內畫出控件。
3.如果還想在Frame中增加選項按鈕,重復步驟2。先畫Frame,再在Frame上畫每個控件,這樣移動Frame時控件會一起移動。如果將已經存在的控件移到Frame上,此控件不會和Frame一起移動。
注意如果將已存在的控件分組到一個Frame中去,可以選擇這些控件,然後剪貼到Frame或Picture控件上去。
控件的容器
當控件是獨立的對象時,窗體和控件之間存在著某種父子關系。圖3.12表明選項按鈕怎樣才能包含在一個窗體或一個Frame控件中。
要理解容器的概念,首先要把所有的控件都想象為所在窗體的孩子。實際上,大多數控件都支持只讀Parent屬性,它的值就是控件所在的窗體。作為孩子,控件決定其在父窗體上的位置。控件的Left屬性和Top屬性是相對父窗體而言,且控件不能移出父窗體的邊界。移動容器的同時也移動了控件,因此控件與容器的相對位置不變(即控件的Left屬性和Top屬性不變)。
選定或禁止選項按鈕
一個選項按鈕可以用以下方法選擇:
1.在運行期間用鼠標單擊選項按鈕。
2.用Tab鍵定位到選項按鈕組,然後在組內使用方向鍵(箭頭鍵)定位選項按鈕。
3.用代碼將它的Value屬性設置為True:optChoice.Value=True
4.使用在Label的標題中指定的快捷鍵。
5.要使某個按鈕成為選項按鈕組中的缺省按鈕,只要在設計時將其Value屬性設置成True。它保持被選中狀態,直到用戶選擇另一個不同的選項按鈕或用代碼改變它。
要禁用選項按鈕,將其Enabled屬性設置為False。程序運行時,若此選項按鈕變灰,表示無法選取此選項按鈕。
Options應用程序
圖3.13所示的窗體使用選項按鈕為一台計算機選擇處理器類型和操作系統。當用戶在組內選擇了選項按鈕後,Label的標題就改變,反映當前的選擇。關於此例的工作版本,請參閱應用程序示例Controls.vbp中的Options.frm。
下表列出了應用程序中對象屬性的設置。
Options應用程序中的事件
選項應用程序對事件的響應如下:
前三個選項按鈕的Click事件為窗體級的string變量strComputer分配一個相應的描述。
後兩個選項按鈕的Click事件為第二個窗體級變量strSystem分配一個相應的描述。
這個方法的關鍵就在於使用這兩個窗體級變量,strComputer和strSystem。這兩個變量具有不同的string值,選項按鈕的最後選定就依賴於這些值。
每次選擇新的選項按鈕,其Click事件的代碼就更新相應變量的值。
PrivateSubopt586_Click()
strComputer="Pentium"
CallDisplayCaption
EndSub
然後它調用一個名為DisplayCaption的過程,此過程把兩個變量連在一起並改變Label的Caption屬性。
SubDisplayCaption()
lblDisplay.Caption="Youselecteda"&
_strComputer&"running"&strSystem
EndSub
使用子過程是因為改變Caption屬性的過程對所有五個選項按鈕來說基本是一樣的,只不過變量的值因情況而異。這就可以避免在每個Click事件中重復同樣的代碼。
詳細信息變量和子過程將在第五章“編程基礎”中討論。
使用ListBox和ComboBox
ListBox和ComboBox為用戶提供了選擇。按照缺省規定,選項以垂直單列方式顯示,也可以設置成多列方式。如果項目數量超過ComboBox或ListBox所能顯示的數目,ScrollBar自動出現在控件上。於是用戶可以在列表中上下左右滾動。圖3.14為一個單列ListBox。
ComboBox兼有TextBox和ListBox兩者的功能。該控件允許用戶通過鍵入文本或選擇列表中的項目來進行選擇。圖3.15為一個ComboBox。
與其它含有單值的控件相反,例如Label的Caption屬性或TextBox的text屬性,ListBox和ComboBox含有多個值或值的集合。在運行時用內置的方法增加、刪除及保持集合中的值。要將幾條項目添加到名為List1的ListBox中,其代碼如下: List1.AddItem"Paris"
List1.AddItem"NewYork"
List1.AddItem"SanFrancisco"
ListBox和ComboBox是在有限空間為用戶提供大量選項的有效方法。
詳細信息關於ListBox和ComboBox控件的詳細信息,請參閱第七章“使用VisualBasic的標准控件”。