VCL中包含好幾種類型的按鈕,盡管它們不都是基於標准Windows按鈕,但仍把所有按鈕類型列出來。在看具體的按鈕組件之前先復習下一些基本知識。
Note
設置按鈕的Caption屬性時,使用&符號,就像設置菜單項的Caption屬性一樣,&符號后面的字符會有下划線,作為按鈕的加速鍵。
1、按鈕屬性
按鈕屬性只有四個顯著屬性,如下:
- ModalResult
- Default
- Cancel
- Enabled
(1)ModalResult屬性
此屬性用於為顯示ShowModal的窗體提供內部的關閉窗體。ModalResult缺省設置為mrNone(0)。這個值用於窗體上的普通按鈕並且不關閉窗體。如果對ModalResult使用任何非零值,則點擊按鈕會關閉窗體並返回ModalResult值。例如,把按鈕放置到窗體上,設置ModalResult屬性為mrOK,則點擊按鈕會關閉窗體,從ShowModal的返回值為mrOK(1),例如下面的代碼:
var Res: Integer; begin Res := MyForm.ShowModal; if Res = mrOK then { do something} ; if Res = mrCancel then Exit; end;
VCL ModalResult常量
常量 | 值 |
mrNone | 0 |
mrOK | 1 |
mrCancel | 2 |
mrAbort | 3 |
mrRetry | 4 |
mrIgnore | 5 |
mrYes | 6 |
mrNo | 7 |
mrAll | 8 |
mrNoToAll | 9 |
mrYesToAll | 10 |
Note
不必對按鈕用一個預定義常量,可使用任何喜歡的值。例如某對話框上使用多個按鈕實現關閉,對每個按鈕可指定不同的ModalResult值(如100,150,200等),這樣就知道哪個按鈕關閉了對話框。任何非零值都可以關閉對話框。
我們做了一個測試程序,測試不同ModalResult的使用。此程序含有多個按鈕,點擊按鈕時,ModalResult會在主窗體上返回值,代碼中有詳細解釋,請詳細閱讀,還有一些比較精巧的技巧。
主界面如下:
1、點擊“顯示Buttons窗口”后彈出對話框如下:
2、點擊“顯示BitBtns窗口”后彈出對話框如下:
以上代碼均在Delphi7中測試通過,按鈕ModalResult屬性測試程序下載:ButtonTestProgram.rar
(2)Default屬性
對於缺省按鈕,如果希望用戶直接回車就相當於單擊了這個按鈕,可以將它Default屬性設置為True。但是當用戶在回車前按Tab鍵或方向鍵選擇了其他按鈕的話,該按鈕就取得了輸入焦點,那么回車觸發的就是這個按鈕的響應事件。
缺省按鈕是設置為BS_DEFPUSHBUTTON類型的按鈕,通常是OK按鈕。Default屬性用於設置按鈕為窗體的缺省按鈕。此屬性的缺省值為False。要把按鈕做成缺省按鈕,設置它的Default屬性為True。
Note
當用戶按Enter鍵盤關窗體時,缺省按鈕的OnClick處理程序會在窗體關閉前被調用。
(3)Cancel屬性
Cancel屬性使用Esc鍵,與Default屬性使用Enter鍵工作大體相同。若Cancel屬性設置為True,當用戶按Esc鍵關閉窗體時,從ShowModal的返回值為按鈕的ModalResult值。若沒有按鈕的Cancel屬性設為True,用戶按Esc鍵關閉窗體會返回mrCancel。
Note
點擊系統按鈕關閉或按Alt+F4關閉窗體會導致從ShowModal返回mrCancel。然而按Esc鍵會返回Cancel設置為True的按鈕的ModalResult屬性,在窗體關閉時,該Cancel屬性為True的按鈕OnClick事件處理程序被調用。如果用系統按鈕關閉或Alt + F4關閉窗體,沒有OnClick事件被調用。一定要考慮到用戶使用窗體的不同操作方式。
Note
可以把多個按鈕的Default屬性設為True。類似地,可以把多個按鈕的Cancel屬性設為True。當是,當用戶在鍵盤按Enter鍵時,在具有Default屬性為True的且Tab順序為第一個的按鈕被激活。類似地,當用戶按ESC鍵關閉窗體時,從ShowModal返回值將是具有Cancel屬性為True的且Tab順序中第一個按鈕的ModalResult值。
(4)Enabled屬性
這個屬性經常對按鈕使用,允許或禁止按鈕依賴於程序或特定窗體的當前狀態。當按鈕被禁止時候(它的Enabled屬性為False),其文本是灰色的,按鈕不起作用。在用位圖的按鈕的情形(BitBtn和SpeedButton)時,圖像也自動變灰下來。
OnClick是按鈕的重要事件。當用戶單擊按鈕、在按鈕有輸入焦點時按下空格鍵、按下按鈕的快捷鍵、對默認按鈕使用回車鍵、對取消按鈕使用Esc鍵等情況下,按鈕的OnClick事件都會被觸發。
2、Button組件
TButton位於Standard組件面板上,是封裝在Delphi組件庫中的一個普通按鈕組件。按鈕很容易使用。在窗體上插入一個Button對象,給其Caption屬性設置按鈕標題。為了在用戶單擊按鈕時完成動作,為按鈕的OnClick事件創建一個事件處理程序。TButton繼承關系如下:
缺省放置在窗體上的Button按鈕,高度為25像素,寬度為75像素。
3、BitBtn組件
位圖按鈕TBitBtn位於Additional組件面板上。它的工作方式類似於Button組件,但可以在按鈕上顯示一個圖標,這樣就更便於用戶理解該按鈕的作用。BitBtn組件上可以同時顯示文本和位圖,比一般按鈕更直觀。TBitBtn類繼承關系如下:
下面介紹下該組件的特有的幾個屬性:
(1)Glyph屬性和NumGlyphs屬性
Glyph屬性指定了顯示在按鈕上的自定義位圖。
NumGlyphs屬性指定位圖按鈕使用的自定義位圖的個數,取值為1~4之間,如下圖所示,但這幾幅位圖實際上保存在一個用Glyph屬性指定的文件中。要使用自定義位圖,必須首先將Kind屬性設置為bkCustom。你可以在運行期給Glyphs指定一個TBitmap對象,或者在設計期時指定,做法如下:在Object Inspector中單擊Glyph屬性右側的“…”按鈕,彈出Picture Editor窗口,單擊“Load”按鈕可以調入一個位圖文件。由於這個文件最多包含4個同樣大小且組成一排的位圖,因此這個位圖文件的長度必定是寬度像素值的1到4倍。
位圖按鈕的四種狀態圖標
位圖位置 | 按鈕狀態 | 說明 |
1 | 彈起 | 該位圖會顯示在彈起狀態下的按鈕上 |
2 | 禁用 | 該位圖通常呈現灰色來表示按鈕不可用 |
3 | 單擊 | 當用戶單擊按鈕時顯示該位圖。松開左鍵時,恢復到第一個位圖 |
4 | 按下 | 當按鈕保持按下的狀態時顯示該位圖 |
當該文件只包含一幅位圖時,位圖按鈕就不會對該位圖做一些變化來表示其他狀態(按下狀態不會改變)。如果你對這樣的按鈕效果不滿意,只要自己添加其他三個位圖啦。
Note
在NumGlyphs屬性中說明的位圖個數必須和實際個數相同。
位圖左下角(The lower left )點處像素的顏色是默認透明色。如果不想用左上角像素作為透明色,可以設置TBitmap對象的TransparentMode屬性為tmFixed,然后設置TransparentColor屬性為選擇的透明色。
Delphi標准按鈕的位圖尺寸為15X15,該尺寸很適合標准按鈕的25像素高度。當然位圖可以是任意高度,但BitBtn組件不根據位圖來設置按鈕尺寸。使用較大的位圖時,就必須相應地設置按鈕尺寸。
(2)Kind屬性
確定位圖按鈕的類型,缺省值為bkCustom。
它能從幾個預定義按鈕種類中選擇,選擇后會導致以下屬性自動改變:
- Glyph屬性自動改變
- 根據選定的按鈕種類自動改變Cancel屬性和Default屬性
- Caption屬性自動改變
- ModalResult屬性自動改變
- 窗體上按鈕外觀自動更新
在上面的“按鈕ModalResult屬性測試程序”中顯示了一個BitBtns窗口,此窗體包含了每一種類型的BitBtn按鈕。請自行下載測試。
(3)Layout屬性
決定位圖出現在按鈕上的位置,有blGlyphBottom、blGlyphLeft、blGlyphRight或blGlyphTop四種取值,默認值為blGlyphLeft。
(4)Margin屬性
決定位圖與按鈕邊界間隔的像素數,默認為-1,即位圖居中。
(5)Spacing屬性
決定標題與位圖之間間隔的像素數,默認值為4。
4、SpeedButton組件
TSpeedButton也稱為“加速按鈕”,位於Additional組件面板上。SpeedButton對象通常出現在應用程序的工具欄上,但也可以單獨當按鈕使用。它與Button及BitBtn不同,它不是窗口組件,沒有窗口句柄及相關Windows結構,所以帶有十幾個SpeedButton的窗體比帶有十幾個標准按鈕的窗體占用較少的內存。SpeedButton比標准控件顯示速度更快。SpeedButton不能接受輸入焦點。另一個優點是可作為開/關按鈕,當按下這樣的按鈕時它就保持按下狀態。
另一方面,SpeedButton組件於BitBtn組件有幾個公用的屬性。SpeedButton處理Glyph屬性的方式與BitBtn組件一樣。缺省地SpeedButton按鈕時正方形25 x 25像素,SpeedButton可以是任意喜歡的尺寸,可以包含文本。
TSpeedButton類繼承關系如下:
下面對SpeedButton某些具體屬性進行介紹:
GroupIndex屬性、AllowAllUp屬性及Down屬性
通常屬於同一組(GroupIndex屬性相同)的加速按鈕以互斥的方式工作。比如當一個按鈕處於按下狀態時,所有其他的按鈕會彈起。當AllowAllUp屬性為True時,在一組中的加速按鈕可以同時處於彈起狀態。單擊一個處於按下狀態的按鈕時,該按鈕彈起,而其他按鈕依然處於彈起狀態;而如果AllowAllUp屬性為False時,則在同一時間該組內必須有一個按鈕處於按下狀態。單擊按下狀態的按鈕也不會讓它彈起。當在設置某個加速按鈕的AllowAllUp屬性時,其他與該按鈕同組的加速按鈕的AllowAllUp屬性也會自動發生相同的改變。
Down屬性用來判斷按鈕處於何種狀態,當為True時,處於按下狀態;否則處於彈起狀態。你可以在設計期將其設置為True,這樣按鈕一開始就是處於按下狀態。
Note
必須在按鈕的GroupIndex屬性大於零時,Down屬性才有作用。如果GroupIndex屬性為零時,單擊按鈕,按鈕不會保持按下狀態。
Flat屬性指定該按鈕是否具有立體外觀,當為True時,可以表現出彈起和按下的狀態。當設為False時,最好用不同的圖標來提示用戶該按鈕的狀態。
5、RadioButton(單選按鈕)
TRadioButton類繼承關系如下:
單選按鈕十分常用,一般都是成組出線並且都是互斥的,即用戶在一組選項中只能選擇唯一的一個選項。一旦一個選項被選擇,其他選項將自動處於未選狀態。
實現單選按鈕有種辦法:
- 使用單選按鈕組件(TRadioButton)
- 使用單選按鈕成組組件(TRadioGroup)
RadioButton位於Standard組件面板上,在默認情況下,放在同一個容器,如Panel、RadioGroup中的單選框總是自動變成一組。下表列出了TRadioButton的常用屬性。
RadioButton的常用屬性
屬性 | 含義 |
Alignment | 決定了選項的標題與按鈕之間的相對位置,有taLeftJustify和taRightJustify兩種選擇 |
Checked | 該選項是否被選中 |
在使用RadioButton對象來設置單選按鈕時,一般都是先在窗體上放置若干個GroupBox,再將RadioButton分別放置到響應的GroupBox中去,這樣按鈕就屬於GroupBox了,一旦該GroupBox被刪除,其中的RadioButton也將刪除。
位於Standard組件面板上的RadioGroup組件來設置單選按鈕組比用RadioButton和GroupBox來的更為方便。下面列出了TRadioGroup組件的主要屬性。
RadioGroup組件的主要屬性
屬性 | 含義 |
Columns | 制定了該RadioGroup中含有的單選按鈕共排列多少列 |
ItemIndex | 表明當前被選擇單選按鈕的序號 |
Items | 包含了所有單選按鈕標題的字符串列表 |
單擊Object Inspector的Items屬性右側的“…”按鈕,會彈出“String List Editor”對話框,對話框中的一行就是RadioGroup中一個單選按鈕的標題。
6、CheckBox(復選框)
TCheckBox類繼承關系如下:
CheckBox組件位於Standard組件面板上。和RadioButton不同的是,它是一種可以“復選”的組件,一系列的選項在同時可以選擇一個或多個。復選框的主要屬性如下:
復選框的主要屬性
屬性 | 含義 |
AllowGrayed | 指定該按鈕是否可以灰顯 |
State | 表明或指定該按鈕的狀態,有cbUnchecked、cbChecked和cbGrayed三種狀態 |
Note
請不要將灰顯狀態和禁用狀態混淆。如果AllowGrayed屬性為True,復選框就處於變灰單用戶仍可以操作的狀態;而當Enabled屬性為False時,整個復選框將變灰,並且用戶將無法操作。如下圖:
如果AllowGrayed屬性為False(缺省值),可以通過Checked屬性來確定復選框是否選中;如果AllowGrayed屬性為True,必須用State屬性來表明或設置復選框狀態。
Tip
有時也許想用復選框來提示某種屬性是開或是關的,但使用戶不能再復選框上點擊來改變狀態。即想復選框是禁止的但是顯示是正常的。要是復選框只讀而不變灰,在面板Panel組件上放置復選框並改變面板Panel的Enabled屬性為False。