4.列表類組件
31)問:當我需要使用多個選項的時候,使用單選按鈕或復選框來進行選擇不是很恰當,因為在窗體上放置大量的按鈕既不利於布局的美觀,又會消耗大量的系統資源,C++Builder有什麼解決辦法嗎?
答:可以使用列表框(ListBox、CheckListBox)或組合框(ComboBox)這兩類最常用的列表組件。
32)問:列表框有那些主要屬性?
答:列表組件ListBox在缺省情況下,只能進行單項選擇,當屬性MultiSelected為True時,可以進行多項選擇。這時你只要單擊想要的選項,那麼這些選項都會被選中。
Items屬性:列表框中的所有選項都是通過這個屬性來進行訪問的。設置時只要點擊Items右邊的“…”就可以編輯了。
當屬性ExtendedSelect也等於True時,有兩種方法可以進行多項選擇。一種是單擊選項同時按下Ctrl鍵,這樣可以選中兩個選項之間的所有選項。它的缺省值為False。
Sorted屬性確定列表框中顯示的內容書否按照字母順序排列。缺省值為False。
當不允許多項選擇時,我們通過屬性ItemIndex就可以返回被選中的選項。但是,如果打開了多項選擇,那麼屬性ItemIndex只返回最後個被選中的選項序號(有些書上也說返回選中選項中具有輸入焦點的選項序號,但我覺得這種說法有點不易讓初學者理解)。
SelCount屬性在MultiSelected屬性為True時,指出了列表框中被選中項目的個數。當MultiSelected屬性為False時,它的值為-1。
Selected屬性指出了列表框中的某個項目是否被選中。
TcheckListBox是從TcustomListBox繼承下來的的,TListBox也是直接從TcustomListBox繼承下來的,因此這兩個組件是兄弟關系,它們的屬性和使用都非常相似。下面來看看它的不同之處:
AllowGrayed屬性和多選按鈕一樣,當屬性值為True時,則列表框中的選項有三種狀態:選中、未選中和選中但變灰;當屬性值為False時,列表框只有兩種狀態。缺省值為false。
Checked其聲明為:_property bool Checked[int Index];這個屬性用來返回或者設置列表框中的指定選項是否被選中。其中參數Index表示指定的選項的序號。
32)問:那麼,組合框和列表框相比有什麼相似之處和不一樣的地方呢?
答:首先,從外觀上來說,列表框占據了比較大的空間,而組合框只需要一行的空間就可以了。從另一方面來說,組合框還帶有一個編輯框,用戶可以直接在編輯框中輸入文本,組合框在一般情況下只顯示這個編輯框,當用戶單擊組合框右邊的下拉箭頭時,就會顯示一個包含所有選項的下拉列表。
組合框和列表框最大的不同是組合框不能進行多項選擇。
組合框與列表框有一定的相似之處,就是它們都能夠包含許多的選項。但是組合框還是有不少獨特的屬性。
33)問:組合框有哪些常用屬性及事件呢?
答:屬性Style決定著組合框的樣式,C++Builder為組合框定義了五種不同的樣式。
CsDropDown:這時為一個標准的組合框,由一個編輯框和下拉列表組成。
CsDropDownList:與標准組合框相似,但不能在編輯框中輸入文本。
CsSimple:沒有下拉列表的組合框,只是一個編輯框,也就是說只能輸入不能選擇。
csOwnerDrawFixed和csOwnerDrawVariable這兩種樣式的組合框常用於需要圖像作為項目時,當然你輸入字符串也可以。前面一種樣式組合框中各個項目的高度是固定的,而後面一種樣式的高度可以變化,也就是說,各個項目的高度可以不一樣,此外,在這兩種樣式中,編輯框是不可輸入的。
Text屬性用來設置或者返回組合框中顯示出來的文本內容。
當編輯框中的內容發生變化時將觸發OnChange事件。所以在組合框裡我們用的就是它。
注意下面四段兩組語句的區別與聯系:
//………………第一組
void _fastcall TForm1::ComboBox1Change(TObject *Sender)
{
if(ComboBox1->Text!=””)
Edit1->Font->Size=StrToInt(ComboBox1->Text);
}
上面的代碼還可以寫成下面的樣子,它們的作用是一樣的:
void _fastcall TForm1::ComboBox1Change(TObject *Sender)
{
if(!ComboBox1->Text.IsEmpty())
Edit1->Font->Size= ComboBox1->Text.ToInt();
}
//………………第二組
void _fastcall TForm1::ComboBox2Change(TObject *Sender)
{
Edit1->Font->Name= ComboBox2->Text;
}