ListBox
ComboBox構件
Label構件
按鈕VCL
BitBtn構件
SpeedButton構件
單選鈕與復選框
ScrollBar構件
File Open
File Save對話框
Color對話框
Find和Replace
ListBox和ComboBox構件的用途很廣的構件。表示標准Windows列表框,用戶可以從它的選項清單中選擇選項。如果列表框中的項目太多,無法一次顯示完,則會出現滾動條,以便訪問列表框中的其它項目。新術語 有些列表框是所有者繪制的列表框。在所有者繪制的列表框中,編程人員要負責繪制列表框中的項目。如果需要,可以生成所有者繪制的列表框。所有者繪制的列表框很常見,只是你不一定認識到了而已。介紹定制C++ Builder工具條,其中介紹了C++ Builder工具條編輯器對話框,其中包含兩個列表框,左邊的列表框是普通列表框,列出可以選擇的按鈕組,而右邊的列表框則是個所有者繪制的列表框,顯示工具條上會顯示的實際按鈕和按鈕功能的文字說明。組合框是個專門列表框。實際上,組合框是列表框與編輯控件的組合。用戶可以在列表框中選擇,也可以在編輯部分輸入數值。用戶在列表框中選擇時,該項目即放在編輯控件中。組合框有三種,具體類型取決於Style屬性。表8.5列出了組合框類型及其說明。合框類型項目說明Simple只是在列表框上面放一個編輯控件。用戶可以在列表框中選擇,也可以在編輯部分輸入數值Drop-down類似於簡單樣式,只是列表框部分最初不顯示,而是提供一個下拉按鈕,讓用戶浏覽清單和選擇選項。用戶也可以在編輯部分輸入數值Drop-down list這種組合框限制更多。和下拉樣式一樣,列表框部分最初不顯示。用戶可以單擊下拉按鈕浏覽清單和選擇選項,但不能在編輯部分輸入文本。用這個樣式時只能在預定選項中選擇圖8.4顯示了ComboBox測試程序運行的情況,從中可以體會每種組合框的特點。
ColumnsListBox包含列表框中的列數,讓這個屬性大於1可以生成多列。缺省為0ExtendedSelectionListBox確定是否允許擴展選擇。擴展選擇使用戶能用Shift+單擊和Ctrl+單擊選擇項目。MultiSelect設置為false時無效。缺省為true
IntegralHeightListBox設置為true時,調整列表框高度以確保顯示部分行。設置為false時列表框可以顯示部分行。缺省為falseItemHeight兩者設置控件中項目的高度。用戶所有者繪制的列表框和組合框。缺省為13Items兩者包含列表框中的項目表,是個TStrings實例(具體屬性和方法見本章前面介紹TStrings的部分)MaxLengthComboBox用戶可以在組合框編輯部分輸入的最大字符數。同於編輯控件的MaxLength。缺省為0(無限)MultiSelectListBox設置為true時,列表框中可以選擇多個項目。缺省為falseSorted兩者設置為true時,列表框項目按升序排列,設置為false時不排序缺省為false
StyleComboBox提供組合框的樣式選項:
csSimple,
csDropDown
csDropDownList,
lbOwnderDrawFixed,
csOwnerDrawVariable,缺省為csDropDownListBox提供列表框的樣式選項:lbStandard,lbOwnderDrawFixed,和csOwnerDrawVariable,缺省為lbStandardTabWidthListBox設置列表框中標簽的寬度(像素),缺省為0TextComboBox包含組合框編輯部分的文本。運行屬性ItemIndexListBox包含當前所選項目的索引,0和第一個項目,1表示不選項目。寫入時,選擇指定的索引SelCountListBox包含多項選擇列表框中選擇的項目個數SelectedListBox選擇指定項目時返回true,否則返回falseSelLengthComboBox包含組合框編輯部分當前所選文本的長度SelStartComboBox包含組合框編輯部分當前所選文本的起點,編輯控件中第一個字符為0SelTextComboBox包含編輯控件中當前所選文本TopIndexListBox返回列表框頂部的項目,可以將頂部項目設置為某個列表框項目和前面介紹的編輯構件一樣,列表框與組合框的方法不多。Clear()方法清除控件的所有數據,ItemAtPos()方法返回指定x、y坐標處的列表框項目,SelectAll()方法選擇組合框編輯部分的文本。列表框與組合框中最常用的事件是OnClick事件,可以確定列表框中何時進行了選擇。說明 單擊組合框編輯部分或下拉按鈕不會觸發OnClick事件,只有單擊組合框的列表部分時才會觸發OnClick事件。OnChange事件可以和編輯控件中一樣觸發組合框編輯部分的變化。OnDropDown事件檢測是否單擊了組合框下拉按鈕。OnMeasureItem和OnDrawItem事件用於所有者繪制的列表框和所有者繪制的組合框。
按鈕VCL包含幾個可以在應用程序中運用的按鈕,盡管它們不全是基於標准Windows按鈕控件,但都放在這裡介紹。介紹具體按鈕構件之前,先要介紹一些基本知識。說明 設置按鈕的Caption屬性時,象設置菜單項目的Caption屬性一樣使用和號(&),和號後面的字符會加上下劃線,可以作為按鈕的加速鍵。
況下,ModalResult屬性設置為mrNone(即0)。這個值用於窗體上的普通按鈕,不關閉窗體。如果ModalResult屬性使用非0值,則按下按鈕時窗體關閉,並返回ModalResult屬性值。例如,如果將按鈕放在窗體上並將ModalResult屬性設置為mrOK,則按下按鈕時窗體關閉,並返回ModalResult屬性值mrOK(1)。這樣就可以編制下列代碼:
int result = MyForm>ShowModal();
if (result == mrOK) DoSomething();
if (result == mrCancel) return;
mrNone0mrOk1
mrCance2
mrAbort3mrRetry4
mrIgnore5
mrYes6
mrNo7
mrAll8
mrNoToAll9
mrYesToAll10說明 按鈕不一定要使用預定義ModalResult屬性常量,也可以用其它數值。例如,假設有個自定義對話框可以用各種按鈕關閉,則可以對每個按鈕賦予不同的ModalResult值(例如100、150、200),然後就知道是哪個按鈕關閉了對話框。任何非0的值都有效,只要不超過int的取值范圍。DefaultDefault屬性是按鈕的另一重要屬性。Windows具有處理對話框的標准機制,其中一個特點如下:如果焦點在按鈕以外的控件上而用戶按鍵盤上的Enter鍵,則對話框的表現和用戶單擊缺省按鈕時一樣,缺省按鈕就是設置了BS_DEFPUSHBUTTON樣式的按鈕(通常是OK按鈕)。這個特性是編程人員的克星,數據輸入人員抱怨已久。Default屬性可以將窗體上的一個按鈕設置為缺省按鈕。這個屬性的缺省值為false。為了將窗體上的一個按鈕設置為缺省按鈕,將其Default屬性設置為true。如果不將任何按鈕的Default屬性設置為true,則用戶按Enter鍵時窗體不關閉。說明 用戶按Enter鍵關閉窗體時,先調用缺省按鈕(如有)的OnClick處理器再關閉窗體。
Cancel屬性與Esc鍵配合,就象Default屬性與Enter鍵配合。用戶按Esc鍵關閉窗體時,ShowModal()返回值為Cancel屬性設置為true的按鈕的ModaResult值。如果沒有按鈕的Cancel屬性設置為true,則用戶按Esc關閉窗體時返回mrCancel。說明 單擊系統關閉框或按Alt+F4關閉窗體時ShowModal()也會返回mrCancel。但按Esc鍵時ShowModal()返回值為Cancel屬性設置為true的按鈕的ModaResult值,先調用Cancel按鈕的OnClick處理器再關閉窗體。如果用戶單擊系統關閉框或按Alt+F4關閉窗體,則不調用OnClick處理器。必須考慮用戶使用窗體的不同方法。說明 多個按鈕的Default屬性可以設置為true,同樣,多個按鈕的Cancel屬性也可以設置為true。但是,用戶按鍵盤上的Enter鍵時,調用Default屬性設置為true的按鈕中跳表順序為最先的按鈕,同樣,用戶按鍵盤上的Esc鍵時,ShowModal()返回Cancel屬性設置為true的按鈕中跳表順序為最先的按鈕的ModalResult值。Enabled前面介紹一般構件時曾介紹過Enabled屬性。這個屬性用於根據程序當前狀態或特定窗體當前狀態打開或關掉按鈕。按鈕關掉時,Enabled屬性設置為false,按鈕不起作用,上面的文字變灰,對於帶位圖的按鈕,位圖也自動變灰。Button構件只有一個有趣的方法:Click()方法,模擬鼠標單擊調用按鈕的Click()方法時,就象單擊按鈕時一樣,執行按鈕的OnClick事件。和事件一樣,通常只用OnClick事件。下面要介紹C++ Builder提供的各種按鈕構件。Button構件8.6.4Button構件標准Button構件並不漂亮,但做了大量工作。標准Button構件自身已很完備,缺省Height屬性值為25像素,缺省Width屬性值為75像素。通常只要將按鈕放在窗體上並響應其OnClick事件即可。
BitBtn構件BitBtn構件是擴展構件以增加功能的范例。這裡擴展標准Button構件以便在按鈕表面上顯示位圖。BitBtn構件比Button構件多幾個屬性,這些屬性共同管理按鈕上的位圖和位圖與按鈕文本之間的布置,將在下面幾節介紹。GlyphGlyph屬性表示按鈕上的位圖,其數值是一個圖形。新術語 Glyph圖形通常是Windows位圖文件(.BMP)。Glyph本身由一個或幾個位圖構成,表示按鈕的四種狀態:起、落、關掉和按住。如果生成自己的按鈕,可能只要提供一個Glyph,然後由BitBtn構件修改成表示另外三種狀態。單擊按鈕時,位圖向右下方移動;關掉按鈕時,位圖變灰。按下狀態的位圖與平常一樣,只是按鈕表面變成按下狀態。如果提供多個位圖,則每個位圖的高度和寬度應相同,並包含在位圖帶中。C++ Builder所帶的位圖提供了兩個Glyph。
SpeedButton構件SpeedButton構件和Panel構件一起用於建立工具條,它與Button和BitBtn構件不同,不是窗口化構件,即不能跳表也不能接受輸入焦點。另一方面,SpeedButton構件又與BitBtn構件有一些共同之處,例如Glyph屬性的處理方式在SpeedButton構件中和BitBtn構件中完全一樣,這裡不再一一重述。但這裡要介紹它們間的兩個主要差別。缺省情況下,快速按鈕是方形的,是25×25像素。快速按鈕可以取任何尺寸,也可以包含文本,但通常不包含文本。快速按鈕有一些特定的屬性,將在下面幾節一一介紹。說明 C++ Builder 1.0中生成工具條的方法用Panel構件並在上面放各種構件(主要是SpeedButton構件)。C++ Builder 3.0提供了Toolbar構件,能更好地生成工具條。Toolbar構件有一些優點,但用起來更復雜。GroupIndex快速按鈕可以組合成象單選鈕一樣(單選鈕框”中介紹)。按下組中一個按鈕時,它保持按下狀態,原先按下的按鈕彈起來。為了組合快速按鈕,只要對組中所有按鈕賦予相同GroupIndex屬性值(缺省值為0,表示不在組中)。試舉例如下:1. 生成空白窗體並在窗體上放五個快速按鈕(我不想在這個簡單例子中放上按鈕位圖,但讀者也可以這麼干)。2. .選擇所有按鈕並將GroupIndex屬性值變為1,這樣所有按鈕的GroupIndex屬性都變成1。3. 可選:將一個按鈕的Down屬性變為true。4. 單擊Run按鈕編譯和運行程序。程序運行時,單擊幾個按鈕。注意一次只有一個按鈕顯示按下狀態。GroupIndex屬性賦予非0值時,可以看出快速按鈕的表現有所改變。GroupIndex屬性值為0的按鈕單擊時會彈回,而快速按鈕組中的快速按鈕單擊時保持按下狀態。AllowAllUp缺省情況下,組中隨時要有一個按鈕處於按下狀態,但也可以將AllowAllUp屬性設置為true以改變這點,將一個按鈕的AllowAllUp屬性設置為true時,組中所有按鈕的AllowAllUp屬性設置為true。這樣就可以選擇組中一個按鈕或一個都不選。
GroupIndex屬性一定要用窗體上其它構件不用的值。用戶單擊按鈕時,它保持按下狀態,再次單擊時,它彈起來。Down讀取Down屬性時,如果按鈕保持按下狀態則返回true,否則返回false。寫入Down屬性時,可以在按鈕按與不按之間拔動。如果快速按鈕不是組中成員,則寫入Down屬性無效果。
單選鈕與復選框盡管單選鈕與復選框是專門的按鈕,但最終還是按鈕。這裡不想花大量時間介紹這些構件,因為它們很容易實現。RadioButton和CheckBox構件都有個Checked屬性,可以設置核選狀態和讀取當前核選狀態。單選鈕通常用在按鈕組中,通常表示選項組中一次只能選擇一個選項(如前面介紹的快速按鈕組)。盡管單選鈕可以單獨使用,但通常不提倡這麼用,以免讓用戶費解。想把單選鈕單獨使用時,應當改用復選框。窗體上的任何按鈕均被自動當作同一組中的一部分。如果有多組單選鈕,每組需要獨立操作,則應當使用RadioGroup構件。這個按鈕可以在一組單選鈕周圍加上三維幀和標題,建立單選鈕組。試舉例說明如下:1. 生成空白窗體或用上一練習中生成的窗體,放上一個RadioGroup構件。2. 找到Items屬性並雙擊Value列。3.出現字串清單編輯器,在字串清單編輯器中輸入下列語句:Redtailed Hawk Peregrine FalconGyrfalconNorthern Goshawk4.單擊OK關閉字串清單編輯器。組框中產生包含所輸入文本的單選鈕。5.將單選鈕組的Caption屬性變為Apprentice Falconers Can Legally Posses:6.單擊Run編譯和運行程序。單擊一個單選鈕時,前面選擇的按鈕如期彈出。利用RadioGroup構件可以在一個窗體上放多組單選鈕。和前面介紹的列表框與組合框一樣,RadioGroup構件也有ItemIndex屬性,可以在運行時用於確定組中選擇了哪個項目。說明 也可以用GroupBox構件放單選鈕,GroupBox構件不如RadioGroup構件方便,但更加靈活。組框中可以放任何類型的控件。放在組框中的控件和組框本身可以在設計時作為一個單元移動。CheckBox構件可以打開和關掉選項或向用戶表示項目當前打開或關掉。復選框最多有三種狀態:打開、關掉和變灰。如果復選框的AllowGrayed屬性設置為false,則只能復選或不選,而AllowGrayed屬性設置為true時則可以取三種狀態中任何一種。變灰狀態是由程序處理的。換句話說,你可以確定應用程序中變灰的含義。如果AllowGrayed屬性為false(缺省),則可以用Cheched屬性確定復選框是否核選。AllowGrayed屬性為true,則要用State屬性確定或設置復選框狀態。這個屬性的取值為cbChecked、cbUnckecked和cbGrayed。提示 有時要用復選框表示某個特性的開關狀態而又不能讓用戶單擊復選框改變其開關狀態,這時復選框要關掉而又正常顯示。為了讓復選框不變灰而又只能讀取,要放上一個面板,並將面板的Enabled屬性變為false
Label構件Label構件顯示窗體上的文本。有時標題文本在設計時確定,此後不再改變,而有時則會在運行時動態改變。利用標題的Caption屬性可以在運行時改變標題文本。Label構件沒有專門的方法和事件。表8.8列出了Label構件特有的屬性。表8.8Label構件特有的屬性屬性說明AutoSize設置為true時,標題根據Caption屬性中包含的文本調整尺寸。設置為false時,文本在標題右邊剪取FocusControl標題為非窗口化構件,所以無法跳表和接受輸入焦點。但有時標題是編輯控件等控件中的文本,這時可以給標題指定和速符(用和號&),然後將FocusControl屬性變為按標題加速鍵時要接受輸入焦點的控件名ShowAccelChar設置為true時,顯示標題中的實際和號,而不是把和號作為加速鍵Transparent這個屬性設置為true時,Color屬性忽略,顯示標題底下的一切,例如可用於將標題放在位圖背景中WordWrap這個屬性設置為true時,標題中的文本到達標題邊沿時會換到新行中
ScrollBar構件ScrollBar構件表示獨立滾動條,即不與編輯控件、列表框、窗體等相聯系。我很少用到獨立滾動條,有些應用程序可能大量使用獨立滾動條,但日常應用程序中用得不多。ScrollBar構件的性能通過Min、Max、Large Change和SmallChange屬性設置,滾動條位置可以通過Position屬性取得。Kind屬性可以指定垂直或水平滾動條。
公用對話框在構件板的Dialogs標簽中,這些構件不是可視構件,因為沒有圖形設計接口。下面幾節介紹這些公用對話框,但Print和Printer Setup對話框要留到後面介紹打印時再介紹。
8.8.1Execute方法公用對話框的一個共同之處是都有Execute方法,用於生成和顯示對話框。Find和Replace對話框是無模態對話框,其余都是模態對話框。用戶單擊OK按鈕、雙擊文件名(對於文件對話框)或按鍵盤上的Enter鍵時,Execute方法返回true。用戶單擊Cancel按鈕、按Esc鍵或用系統關閉框關閉對話框時,Execute方法返回false。公用對話框通常實現如下:if(OpenDialog>Execute()) { // user pressed OK so use the filenameMemo>Lines>LoadFromFile(OpenDialog>FileName);}return;這個代碼顯示File Open對話框並向用戶請求文件名。如果用戶單擊OK按鈕,則執行if塊內的代碼,文件裝入Memo構件。如果不按OK按鈕,則忽略if塊內的代碼,不發生動作。說明 上例中的代碼是C++快捷語法的又一個例子。第一行:if(OpenDialog>Execute()) {等於if(OpenDialog>Execute() == true) {兩種方法都可以,但第一種更好。
File Open和File Save對話框File Open和File Save對話框有幾個共同屬性。File Open對話框讓用戶打開應用程序中的文件,包裝成OpenDialog構件。File Save對話框用於從用戶那裡取得文件名以保存文件,也用作Save As對話框。File Save對話框包裝成SaveDialog構件。
DefaultExt屬性DefaultExt屬性設置對話框使用的缺省擴展名。缺省擴展名是用戶不提供擴展名時自動添加到文件名後面的擴展名。FileName屬性FileName屬性是最明顯的文件對話框屬性,用於放用戶所選文件的文本。如果文件對話框初始顯示時要讓文件名出現在文件對話框的編輯部分,則要在調用文件對話框時先設置這個屬性。用戶單擊OK關閉文件對話框後,這個屬性中包含所選文件的完整路徑和文件名。Files屬性Files屬性是只讀屬性,是啟用多文件選擇時包含所選文件清單的TStrings實例。Filter屬性Filter屬性包含一列用戶可以選擇的文件類型清單。文件類型放在文件對話框的File of type:組合框中。可以設置Filter屬性以反映應用程序所針對的文件類型。例如,簡單文字編輯程序的過濾器可以設置成顯示文件類型.TXT、.INI和.LOG等。過濾器可以在設計時通過Filter Editor對話框設置。為了打開FilterEditor對話框,雙擊對象觀察器FIlter屬性旁邊的Value列。Filter Name列中包含文件類型的文本說明,Filter列中是用於顯示該類型文件的實際文件掩膜。盡管可以直接在對象觀察器Value列中輸入過濾器字串,但使用Filter Editor對話框更方便。如果只用一個過濾器,則可以直接在value列中輸入Filter屬性,說明和過濾器之間管道分開。例如,為了用一個過濾器對付所有文件類型,可以輸入如下過濾器:All Files (*.*)| *.*FilterIndex屬性FilterIndex屬性設置對話框初始顯示時使用的過濾器,但索引不是以0為基數,而是從1開始。InitialDir屬性InitialDir屬性指定文件對話框顯示時作為初始目錄的目錄。如果沒有指定InitialDir屬性值,則采用Windows確定的當前目錄。提示 一流的Windows程序能跟蹤打開文件和保存文件時使用的目錄。這個信息通常放在注冊表中。顯示File Open或File Save對話框之前,將InitialDir屬性設置為用戶上次使用的目錄。用戶選擇文件之後,可以更新注冊表以反映新的目錄。
Options屬性Options屬性控制使用文件對話框的方法。選項很多,最常見的有是否允許生成新文件或目錄、對話框中是否顯示Help按鈕、是否允許長文件名、是否允許選擇多個文件,等等。詳見C++ Builder中關於OpenDialog和SaveDialog構件的聯機幫助。Title屬性Title屬性設置或讀取文件對話框的標題。不指定標題時,OpenDialog缺省用Open,SaveDialog構件缺省用Save。提示 Save As對話框就是Title屬性設置為Save As的SaveDialog構件。文件對話框沒有相關聯的事件。提示 也可以不放OpenDialog構件到窗體上而在運行時實現File Open對話框或其它公用對話框。為此,生成TOpenDialog類的實例,然後調用Exeate方法:TOpenDialog* openDlg = new TOpenDialog(this);if (openDlg>Execute()) {// do something here}delete openDlg;如果需要,還可以在調用Execute之前設置OpenDialog構件的屬性。
File Open Picture和File Save Picture對話框這兩個對話框是在File Open和File Save對話框中增加了一個特性,用預覽窗口顯示當前所選的圖形。這些對話框也有Filter屬性,預設成常用Windows圖形格式,此外,它們與File Open和File Save對話框完全一樣。 Color對話框Color對話框可以用於選擇顏色。單擊OK按鈕時,Color屬性會包含顏色信息。Color對話框和文件對話框一樣,沒有要響應的事件。
Font對話框Font對話框讓用戶從系統提供的字體清單中選擇字體。通過Device屬性可以選擇要屏幕字體、打印字體還是兩者都顯示。通過修改MaxFontSize和MinFontSize屬性可以限定用戶可選的最大和最小字體尺寸。和文件對話框一樣,Options屬性包含各種控制Font對話框功能的選項。如果用戶單擊OK,則Font屬性包含實現新字體所要的全部信息。Font對話框有個OnApply事件,在用戶單擊Font對話框的Apply按鈕時觸發。必須生成OnApply事件在有效事件處理器之後,Font對話框中才會顯示Apply按鈕。
Find和Replace對話框Find和Replace對話框讓用戶輸入搜索文本和替換文本,並提供了各種搜索和替換選項。Find對話框包裝在FindDialog構件中,Replace對話框包裝在ReplaceDialog構件中。Replace對話框具有Find對話框的一切,並增加了替換功能。FindDialog和ReplaceDialog構件的主要屬性有FindText(要找的文本)、ReplaceText(要替換成的文本)和Options。顯然,FindDialog構件不會有ReplaceText屬性。Options屬性包含單擊Find Next、Teplace或Replace All按鈕時用戶設置的各種選項信息。FindDialog和ReplaceDialog構件的Execute()方法與其它Dialog構件稍有不同。首先,Find和Replace對話框是無模態對話框,只要對話框顯示,Execute()方法就返回。由於這些對話框是無模態對話框,所以Execute()方法的返回值沒有意義(總是true)。這些對話框用OnFind、OnReplace事件和Options屬性確定對話框中發生的情況。OnFind事件在單擊Find Next時發生,ReplaceDialog構件有OnFind事件,但也有OnReplace事件,在單擊Replace或Replace All按鈕時發生。利用這些事件可以確定用戶何時請求了尋找或替換動作。程序應讀取Options屬性以確定用戶希望如何進行尋找或替換動作。