VCL組件之按鈕


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會在主窗體上返回值,代碼中有詳細解釋,請詳細閱讀,還有一些比較精巧的技巧。

主界面如下:

0193 圖1

1、點擊“顯示Buttons窗口”后彈出對話框如下:

0194 圖2

2、點擊“顯示BitBtns窗口”后彈出對話框如下:

0195 圖3

星星以上代碼均在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繼承關系如下:

image

缺省放置在窗體上的Button按鈕,高度為25像素,寬度為75像素。

3、BitBtn組件

位圖按鈕TBitBtn位於Additional組件面板上。它的工作方式類似於Button組件,但可以在按鈕上顯示一個圖標,這樣就更便於用戶理解該按鈕的作用。BitBtn組件上可以同時顯示文本和位圖,比一般按鈕更直觀。TBitBtn類繼承關系如下:

image

下面介紹下該組件的特有的幾個屬性:

(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。

它能從幾個預定義按鈕種類中選擇,選擇后會導致以下屬性自動改變:

  1. Glyph屬性自動改變
  2. 根據選定的按鈕種類自動改變Cancel屬性和Default屬性
  3. Caption屬性自動改變
  4. ModalResult屬性自動改變
  5. 窗體上按鈕外觀自動更新

在上面的“按鈕ModalResult屬性測試程序”中顯示了一個BitBtns窗口,此窗體包含了每一種類型的BitBtn按鈕。請自行下載測試。

0196

(3)Layout屬性

決定位圖出現在按鈕上的位置,有blGlyphBottom、blGlyphLeft、blGlyphRight或blGlyphTop四種取值,默認值為blGlyphLeft。

0197

(4)Margin屬性

決定位圖與按鈕邊界間隔的像素數,默認為-1,即位圖居中。

0198

(5)Spacing屬性

決定標題與位圖之間間隔的像素數,默認值為4。

0199

4、SpeedButton組件

TSpeedButton也稱為“加速按鈕”,位於Additional組件面板上。SpeedButton對象通常出現在應用程序的工具欄上,但也可以單獨當按鈕使用。它與Button及BitBtn不同,它不是窗口組件,沒有窗口句柄及相關Windows結構,所以帶有十幾個SpeedButton的窗體比帶有十幾個標准按鈕的窗體占用較少的內存。SpeedButton比標准控件顯示速度更快。SpeedButton不能接受輸入焦點。另一個優點是可作為開/關按鈕,當按下這樣的按鈕時它就保持按下狀態。

另一方面,SpeedButton組件於BitBtn組件有幾個公用的屬性。SpeedButton處理Glyph屬性的方式與BitBtn組件一樣。缺省地SpeedButton按鈕時正方形25 x 25像素,SpeedButton可以是任意喜歡的尺寸,可以包含文本。

TSpeedButton類繼承關系如下:

image

下面對SpeedButton某些具體屬性進行介紹:

GroupIndex屬性、AllowAllUp屬性及Down屬性

通常屬於同一組(GroupIndex屬性相同)的加速按鈕以互斥的方式工作。比如當一個按鈕處於按下狀態時,所有其他的按鈕會彈起。當AllowAllUp屬性為True時,在一組中的加速按鈕可以同時處於彈起狀態。單擊一個處於按下狀態的按鈕時,該按鈕彈起,而其他按鈕依然處於彈起狀態;而如果AllowAllUp屬性為False時,則在同一時間該組內必須有一個按鈕處於按下狀態。單擊按下狀態的按鈕也不會讓它彈起。當在設置某個加速按鈕的AllowAllUp屬性時,其他與該按鈕同組的加速按鈕的AllowAllUp屬性也會自動發生相同的改變。

Down屬性用來判斷按鈕處於何種狀態,當為True時,處於按下狀態;否則處於彈起狀態。你可以在設計期將其設置為True,這樣按鈕一開始就是處於按下狀態。

Note

必須在按鈕的GroupIndex屬性大於零時,Down屬性才有作用。如果GroupIndex屬性為零時,單擊按鈕,按鈕不會保持按下狀態。

Flat屬性指定該按鈕是否具有立體外觀,當為True時,可以表現出彈起和按下的狀態。當設為False時,最好用不同的圖標來提示用戶該按鈕的狀態。

5、RadioButton(單選按鈕)

TRadioButton類繼承關系如下:

image 

單選按鈕十分常用,一般都是成組出線並且都是互斥的,即用戶在一組選項中只能選擇唯一的一個選項。一旦一個選項被選擇,其他選項將自動處於未選狀態。

實現單選按鈕有種辦法:

  • 使用單選按鈕組件(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類繼承關系如下:

image

CheckBox組件位於Standard組件面板上。和RadioButton不同的是,它是一種可以“復選”的組件,一系列的選項在同時可以選擇一個或多個。復選框的主要屬性如下:

復選框的主要屬性

屬性 含義
AllowGrayed 指定該按鈕是否可以灰顯
State 表明或指定該按鈕的狀態,有cbUnchecked、cbChecked和cbGrayed三種狀態

Note

請不要將灰顯狀態和禁用狀態混淆。如果AllowGrayed屬性為True,復選框就處於變灰單用戶仍可以操作的狀態;而當Enabled屬性為False時,整個復選框將變灰,並且用戶將無法操作。如下圖:

0200

如果AllowGrayed屬性為False(缺省值),可以通過Checked屬性來確定復選框是否選中;如果AllowGrayed屬性為True,必須用State屬性來表明或設置復選框狀態。

Tip

有時也許想用復選框來提示某種屬性是開或是關的,但使用戶不能再復選框上點擊來改變狀態。即想復選框是禁止的但是顯示是正常的。要是復選框只讀而不變灰,在面板Panel組件上放置復選框並改變面板Panel的Enabled屬性為False。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM