一直以來都想寫一點(diǎn)為BCB初學(xué)者快速入門的東西,前不久寫了幾篇《閑談BCB》想把自己學(xué)習(xí)BCB中如何來解決難點(diǎn)的方法說給大家,沒想到被罵得不成樣子。本想不寫了,但覺得這些東西留下來能做什么呢?還是用另一種方法來重新演譯我的思維吧,最近有些忙,那幾篇沒有寫完的文章,我也會盡快寫完的,至于《深入QR》,我想我一定會用另一種手法來寫,讓你一看就會把QR這個嬌女的所有衣服都脫光,不整理到這個地步,我是不敢輕易再拿出來,還請朋友見諒!
本文分為《基礎(chǔ)入門》、《快速提高》與《成功編程者》三部分。
第一部分:基礎(chǔ)入門
1.窗體
1)問:Windows的編程就是在窗體的基礎(chǔ)上實(shí)現(xiàn)的, C++Builder是怎樣處理窗體的呢?
答:窗體的一部分功能通過窗體的屬性來實(shí)現(xiàn),窗體的屬性非常多,這里只對其中比較重要的屬性進(jìn)行介紹。
1.ActiveControl指定窗體上的某個組件為輸入焦點(diǎn)。如下面的語句將窗體上的Label1組件成為輸入焦點(diǎn):ActiveControl=Label1。在同一時時刻,應(yīng)用程序只能有一個輸入焦點(diǎn)。
2.BorderIcons用來設(shè)定標(biāo)題欄上出現(xiàn)哪些系統(tǒng)圖標(biāo)。它是一個集合,可以設(shè)成以下幾個類型:最大化按鈕(biMaximize)、最小化按鈕(biMinimize)、幫助按鈕(biHelp)和系統(tǒng)菜單(biSystemMenu)。
3.Icon屬性用來指定當(dāng)窗體最小化時顯示的圖標(biāo)。
4.KeyPreview屬性為true時,表示擊鍵事件發(fā)生時先傳給窗體,然后再傳給有輸入焦點(diǎn)的組件上,相當(dāng)于窗體截獲了原本屬于組件的事件。缺省值為false,表示擊鍵事件只送到當(dāng)前有輸入焦點(diǎn)的組件上。
5. Menu屬性用來指定窗體的主菜單。
6.Visible屬性用來確定窗體是否可見。
此外還有一些運(yùn)行時態(tài)屬性,這些屬性只有在程序運(yùn)行的時候才能通過編程訪問。這種屬性主要有:
Active
屬性用來確定窗體是否獲得輸入焦點(diǎn)。
ActiveMDIChild
這個函數(shù)將返回當(dāng)前活動的子窗體。
DropTarget
屬性用來指定窗體是否是拖放操作的對象。
Parent
屬性用來設(shè)定包含窗體的窗口控件,通常是另一個窗體。如果窗體沒有包含它的控件,那么它的Parent屬性為nil。
2)問: Windows窗體有很多樣式,比如對話框,彈出窗口。如果我要控制窗體的邊界樣式,應(yīng)該怎么辦?
答:屬性BorderStyle可以指定窗體邊界的外觀和行為。它一共有六種可能的取值。
bsDialog
表示大小不可變的標(biāo)準(zhǔn)的對話框邊界。
bsSingle
表示大小不可變的單線邊界。
bsNone
表示大小不可變、沒有邊界。
bsSizeable
表示標(biāo)準(zhǔn)的可改變大小的窗體。
bsToolWindow
與bsSingle時類似,但是標(biāo)題較小,用做工具框窗口。
bsSizeToolWin
與bsSizeable時相似,但是標(biāo)題較小,做工具框窗口。
要注意的是,對于MDI子窗體,bsDialog或bsNone將不起作用。
3)問:同樣是獲得焦點(diǎn),ActiveControl與SetFocus()有什么不同?
答: ActiveControl是把焦點(diǎn)交給組件,它是一個屬性。而SetFocus()是組件主動要焦點(diǎn),是一個方法。書寫格式也不一樣。例如,我們想使同樣的一個Button1獲得焦點(diǎn),可以下的兩種寫法:
ActiveControl=Button1或Button1=SetFocus()
二者作用是一樣的,不過一般都習(xí)慣用第一種方式。
4)問:屬性FormStyle有什么作用?
答:屬性FormStyle可以確定窗體的類型,它一共有四種屬性值。
fsNormal
表示窗體既不是MDI父窗口也不是MDI子窗口,只可能是單文檔SDI窗口或者對話框。這個屬性值是缺省值。
fsMDIChild
表示這個窗體是一個MDI子窗口。
fsMDIForm
表示這個窗體是一個MDI父窗口。
fsStayOnTop
表示窗體始終保持在窗體所屬工程中其它窗體的上面,除非還有別的窗體的FormStyle屬性也被設(shè)置成了fsStayOnTop。
要特別注意的是,在程序運(yùn)行期間不要修改窗體的FormStyle屬性。
5)問:屬性Position有什么作用?
答:屬性Position可以確定程序運(yùn)行時出現(xiàn)在屏幕上的窗體的大小和位置,它有五種可能的取值。
1.poDesigned表示使用設(shè)計(jì)時指定的尺寸和位置屬性時顯示窗體。尺寸屬性是指Height和Width,位置屬性是指Left和Top。這個屬性值是缺省值。
2.poDefault表示窗體在屏幕上顯示的位置和大小由Windows決定。每次運(yùn)行應(yīng)用程序時,窗體都會稍微向下向右移動。
3.poDefaultPosOnly表示窗體以設(shè)計(jì)時的窗體尺寸顯示窗體,但是在屏幕上顯示的位置由Windows確定。每次運(yùn)行應(yīng)用程序時,窗體都會稍微向下向右移動。當(dāng)無法再向下移動時,就又會從屏幕的左上角開始顯示。
4.poDefaultSizeOnly表示窗體的位置由設(shè)計(jì)時指定的值確定,而尺寸由Windows確定。
5.poScreenCenter表示使用設(shè)計(jì)時指定的尺寸和位置屬性,在屏幕的中央顯示窗體。
6)問:如何最大化或最小化窗體?
答:屬性WindowState與窗體的顯示有關(guān),它有三種可能的取值。
wsNormal
窗體既不是最大化顯示也不是最小化顯示。這個值是缺省值。
wsMinimized
窗體最小化顯示。
wsMaximized
窗體最大化顯示。
7)問:屬性ClientHeight和ClientWidth有什么作用?
答:這兩個屬性用來定義窗體用戶區(qū)域的高和寬。所謂用戶區(qū)域窗體的實(shí)際工作區(qū)域,就是除了窗體的標(biāo)題欄、菜單條、工具條和狀態(tài)條以及邊框之外的窗體區(qū)域。所以對于新創(chuàng)建的窗體,它的用戶區(qū)域比窗體的大小要稍微小一些,相對而言,窗體的大小是由屬性Height和Width確定的。
8)問:如何動態(tài)創(chuàng)建一個窗體呢?
答:我們先創(chuàng)建一個主窗體MainForm,把她的Caption改為“主窗體”,把FormStyle屬性改為fsMDIForm。再創(chuàng)建一個子窗體windows1,把Caption改為“子窗體”,把FormStyle屬性改為fsMDIChild。
fsStayOnTop
表示窗體始終保持在窗體所屬工程中其它窗體的上面,除非還有別的窗體的FormStyle屬性也被設(shè)置成了fsStayOnTop。
要特別注意的是,在程序運(yùn)行期間不要修改窗體的FormStyle屬性。
5)問:屬性Position有什么作用?
答:屬性Position可以確定程序運(yùn)行時出現(xiàn)在屏幕上的窗體的大小和位置,它有五種可能的取值。
1.poDesigned表示使用設(shè)計(jì)時指定的尺寸和位置屬性時顯示窗體。尺寸屬性是指Height和Width,位置屬性是指Left和Top。這個屬性值是缺省值。
2.poDefault表示窗體在屏幕上顯示的位置和大小由Windows決定。每次運(yùn)行應(yīng)用程序時,窗體都會稍微向下向右移動。
3.poDefaultPosOnly表示窗體以設(shè)計(jì)時的窗體尺寸顯示窗體,但是在屏幕上顯示的位置由Windows確定。每次運(yùn)行應(yīng)用程序時,窗體都會稍微向下向右移動。當(dāng)無法再向下移動時,就又會從屏幕的左上角開始顯示。
4.poDefaultSizeOnly表示窗體的位置由設(shè)計(jì)時指定的值確定,而尺寸由Windows確定。
5.poScreenCenter表示使用設(shè)計(jì)時指定的尺寸和位置屬性,在屏幕的中央顯示窗體。
6)問:如何最大化或最小化窗體?
答:屬性WindowState與窗體的顯示有關(guān),它有三種可能的取值。
wsNormal
窗體既不是最大化顯示也不是最小化顯示。這個值是缺省值。
wsMinimized
窗體最小化顯示。
wsMaximized
窗體最大化顯示。
7)問:屬性ClientHeight和ClientWidth有什么作用?
答:這兩個屬性用來定義窗體用戶區(qū)域的高和寬。所謂用戶區(qū)域窗體的實(shí)際工作區(qū)域,就是除了窗體的標(biāo)題欄、菜單條、工具條和狀態(tài)條以及邊框之外的窗體區(qū)域。所以對于新創(chuàng)建的窗體,它的用戶區(qū)域比窗體的大小要稍微小一些,相對而言,窗體的大小是由屬性Height和Width確定的。
8)問:如何動態(tài)創(chuàng)建一個窗體呢?
答:我們先創(chuàng)建一個主窗體MainForm,把她的Caption改為“主窗體”,把FormStyle屬性改為fsMDIForm。再創(chuàng)建一個子窗體windows1,把Caption改為“子窗體”,把FormStyle屬性改為fsMDIChild。
選擇“Project|Options…”菜單項(xiàng),將會彈出一個如圖所示的對話框。
在這里我們可以通過下拉框選擇主窗體(Main form),在左側(cè)的Auto-create forms里列出了所有的窗口,這里面的窗口通常是動態(tài)創(chuàng)建,你可以把需要動態(tài)創(chuàng)建的窗口(Available forms)通過中間的那四個按鈕調(diào)到右側(cè),然后OK就可以了。
動態(tài)的創(chuàng)建的方法如下:
|
void _fastcall TForm1::Button1Click(TObject *Sender)
{
Tform2 *Forms;
try
{
Form2=new TForm2(Application);//動態(tài)創(chuàng)建Form2
Form2->ShowModal();
delete Form2;//把Form2釋放
}
catch(Exception &exception)
{
delete Form2;
Application->ShowException(&exception);
}
}
|
要注意一般你可能不喜歡用上面的那種形式,而寫成如下格式:
|
void _fastcall TForm1::Button1Click(TObject *Sender)
{
Tform2 *Forms;
Form2=new TForm2(Application);//動態(tài)創(chuàng)建Form2
……
}
|
你要記住,無論你的子窗體創(chuàng)建是否完成,你都必須運(yùn)行delete來釋放你剛才創(chuàng)建的子窗體,當(dāng)然你也可以把釋放的過程寫在OnClose事件函數(shù)內(nèi),這個函數(shù)有一個參數(shù)為Action,它有四個取值:caNone為不關(guān)閉窗體,什么也不操作;caHide為不關(guān)閉窗體,但把它隱藏起來;caFree為關(guān)閉窗體,同時釋放內(nèi)存;caMinimize為最小化窗體,不關(guān)閉。所以我們也可以象下面這樣來釋放子窗體。
|
void _fastcall TForm2::FormClose(Tobject *Sender,TcloseAction &Action)
{
Action=caFree;
}
|
9)問:為什么我們用Close()不能關(guān)閉我當(dāng)前活動的子窗體?
答:關(guān)閉當(dāng)前活動窗體,很多人會用如下的方法:
|
void _fastcall TForm1::Button2Click(Tobjcet *Sender)
{
ActiveMDIChild->Close();//注意這是在主窗體(或者說在其它窗體)中來關(guān)閉當(dāng)前活動的子窗體,這樣做不好,一般的關(guān)閉應(yīng)該象10)問中那樣來做
}
|
此時窗體并沒有關(guān)閉,而是最小化了,因此要在子窗體的OnClose事件中用如下代碼來關(guān)閉。
|
void _fastcall TForm2::FormClose(Tobject *Sender,TCloseAction &Action)
{
Action=caFree;
}
|
這段程序不用多說了,上面都說過了。
這里有一點(diǎn)要說明一下,就是在調(diào)用Close()時,會自動觸發(fā)OnClose事件,而由上我們知道窗體沒有關(guān)閉,而是最小化,說明在OnClose中Action的此時的值為caMinimize。所以我們要寫上面的方法來關(guān)閉。
10)問:Show()與ShowModal()有什么不同?
答:我們的程序中不可能就只有一個Form,比如,有Form1和Form2兩個窗口,我們在Form1中調(diào)用Form2應(yīng)該先在Unit1.cpp的開頭部分加入:
在要調(diào)用的地方加入:
|
Form2->Show();//或是Form2->ShowModal();
|
兩者的區(qū)別在于若使用了ShowModal()則必須關(guān)閉Form2,才能處理其它窗口的內(nèi)容,而Show()則不用。當(dāng)然你可以直接在Form2直接創(chuàng)建一個Button1來關(guān)閉她,程序內(nèi)容如下:
|
void _fastcall TForm2::Button1Click(Tobject *Sender)
{
Close();
}
|
在Close前,不需要加上Form2,因?yàn)檫@行程序就是在Form2上運(yùn)行的,所以默認(rèn)的父組件就是Form2。
2.文本輸入組件
11)問:如果要實(shí)現(xiàn)文本輸入,在C++Builder中應(yīng)該怎么辦?
答:C++Builder常用文本輸入組件來實(shí)現(xiàn),常用的文本輸入組件有Edit、MaskEdit 、Memo和RichEdit。他們的主要不同在于Edit和MaskEdit用于輸入單行文本,而Memo和RichEdit可以輸入多行文本。此外Label組件也可用來進(jìn)行文本顯示。
Edit和MaskEdit是一個窗口控件,它可以獲得輸入焦點(diǎn)。當(dāng)用戶需要輸入單行文本時,就應(yīng)該使用編輯框。它通常與標(biāo)簽組件一起使用。
12)問:編輯框(Edit)常用的屬性有哪幾個?
答:編輯框常用的幾個屬性如下:
Text屬性是一個String類型的數(shù)據(jù),它決定了在編輯框中出現(xiàn)的文本字符串。在編程中,我們經(jīng)常要通過text屬性獲取編輯框中的文本字符串
MaxLength是一個Integer類型的數(shù)據(jù),它指定編輯框所能容納的最大字符數(shù)。缺省情況下為0,表示長度不限。
編輯框還可以用做口令輸入。具體方法是,把PasswordChar屬性設(shè)置為除#0之外的任何字符。這時,無論你在編輯框中輸入什么字符,都只顯示PasswordChar包含的字符。我們經(jīng)常把PasswordChar設(shè)置為星號*,當(dāng)用戶輸入口令時只顯示星號。如輸入#0表示編輯框正常顯示。PasswordChar是一個字符類型的數(shù)據(jù)。
如果要限制用戶對編輯框?qū)懙臋?quán)利。可以使用屬性ReadOnly,當(dāng)ReadOnly的值為True時只讀。
13)問:標(biāo)簽控件(Label)起什么作用?
答:標(biāo)簽的常用屬性有Caption和FocusControl。
Caption屬性是字符串類型,用來指定標(biāo)簽的標(biāo)題,也就是標(biāo)簽的顯示內(nèi)容。
FocusControl屬性是窗口控件類,用來指定一個與標(biāo)簽相連的窗口控件。從而允許這個控件使用快捷鍵來獲得輸入焦點(diǎn)。
標(biāo)簽是一個典型的非窗口控件,它不能獲得輸入焦點(diǎn),所以經(jīng)常被用來給一些沒有Caption屬性的組件做標(biāo)簽。標(biāo)簽還能同時給這些組件提供快捷鍵的功能,允許用戶通過快捷鍵獲得輸入焦點(diǎn)。
14)問:那在Label中如何使用Caption與FocusControl呢?
答:下面舉個例子說吧(這個例子在第19問中會用到):
首先在輸入標(biāo)題時需要指定一個快捷鍵,這可以用在一個字母前面加上一個連字符&來實(shí)現(xiàn)。單擊caption屬性輸入欄,輸入&N姓名,這里字母N就被指定為快捷鍵,要注意的是中文是不能被指定為快捷鍵的,只有26個英文字母才可以。
然后,把標(biāo)簽的FocusControl屬性與編輯框Edit1相連,選擇FocusControl屬性,從屬性值字段列舉的窗體上所有的窗口控件中選取Edit1。這樣當(dāng)用戶按下Alt+N時,輸入焦點(diǎn)就會轉(zhuǎn)移到編輯框Edit1。
15)問:我遇到一些程序,當(dāng)在編輯中輸入完文本后,按一下回車鍵,程序就開始執(zhí)行了,C++Builder應(yīng)該怎樣實(shí)現(xiàn)?
答:當(dāng)然可以。當(dāng)我們按下回車鍵時,產(chǎn)生了OnKeyPress事件。所以如果要在程序中處理這種事件,這就要編寫OnKeyPress事件處理程序。
還有三種事件是編輯框常用的事件:OnChange事件、OnEnter事件和OnExit事。每當(dāng)編輯框中的文本發(fā)生改變時都會觸發(fā)OnChange事件。當(dāng)編輯框獲得輸入焦點(diǎn)時會觸發(fā)OnEnter事件,而失去焦點(diǎn)時會產(chǎn)生OnExit事件。
16)問:簡單說一下Memo組件的重要屬性?
答: Memo與Edit的屬性有很多相似的,下面只來說一下Memo組件的重要屬性。
Lines屬性是一個TStrings類的一個對象,它是由多個字符串組成的,每一個字符串就是Lines中的一個 元素。Memo組件的每一行文本都是Lines中的一個字符串。
在設(shè)計(jì)階段,如果要給Memo組件增加一些顯示內(nèi)容,可以在對象編輯器中選擇屬性Lines,單擊Value列上的省略號按鈕,這時會打開一個字符串編輯窗口。
在這個編輯器中輸入文本。編輯器中顯示的所有內(nèi)容都會出現(xiàn)在Memo組件中。
Memo組件屬性中:
Alignment
用來確定Memo組件中顯示文本的對齊方式。
WordWrap
確定文本到達(dá)右邊界時是否自動換行
WantReturn
確定用戶是否可以在文本中插入回車符。
WantTabs
確定用戶是否可以在文本中插入Tab字符。
屬性ScrollBar是一個常見的屬性,它確定著滾動組件滾動條的行為。ScrollBar有四種可能的取值:
SsNone
表示沒有滾動條;
ssHorizonal
表示只有水平滾動條;
ssVertical
表示只有垂直條;
SsBoth
表示既有水平滾動條也有垂直滾動條。
當(dāng)顯示的內(nèi)容比較多時,應(yīng)該選擇ssBoth,這樣才能夠使用戶看到所有的內(nèi)容。
17)問:要在程序運(yùn)行期間修改Memo組件的顯示內(nèi)容,應(yīng)該怎么辦?
答:這就需要使用TStrings類的某些屬性和方法。例如要給Memo組件增加一句話“我來了”,那么可以使用方法Add來完成。
要尋找Memo中的某一行,可以使用Lines->Strings[n]的形式,不過要注意Lines的字符串是從0開始的,所以在與Memo中的實(shí)際行號對應(yīng)時,行號需要減一。
18)問:如果我要實(shí)現(xiàn)文本的剪切、復(fù)制和粘貼,應(yīng)該怎么辦?
答:Memo組件提供了三個用來完成剪切、復(fù)制和粘貼的方法。CutToClipboard用來把Memo組件中被選中的文本剪切到剪切板。
CopyToClipboard用來把Memo組件中被選中的文本復(fù)制到剪切板。
PasteFromClipboard用來把剪切板的內(nèi)容粘貼到Memo組件中光標(biāo)所在的位置。
19)問:前面講了幾個控件,能把他們綜合起來編制一個程序嗎?
答:好的,就利用剛才已經(jīng)放好的組件來編寫一個用戶姓名錄入和顯示的程序。
這個程序?qū)?shí)現(xiàn)當(dāng)在編輯框中輸入文本并按下Enter鍵后,文本就被增加到Memo組件中。因此需要給編輯框組件增加事件處理過程。
當(dāng)用戶按下Enter鍵時產(chǎn)生了OnKeyPress事件,所以應(yīng)該編寫這個事件的處理過程。
選中組件Edit1,
在對象觀察器上選擇Events標(biāo)簽頁,
雙擊Edit1的事件OnKeyPress,C++Builder將自動生成這個事件處理程序的代碼模板。在里面編寫如下代碼:
|
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
AnsiString Temp("用戶姓名:");
if((Key==0xD) && !Edit1->Text.IsEmpty())
Memo1->Lines->Add(Temp+Edit1->Text);
}
|
或者寫成如下的格式更好理解,它們是一樣的。
|
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
AnsiString Temp="用戶姓名:";
if((Key==VK_RETURN) && Edit1->Text!="")
Memo1->Lines->Add(Temp+Edit1->Text);
}
|
當(dāng)用戶輸入文本并且按下回車鍵后,第三條語句將Temp和用戶輸入的字符串合并后加到Memo控件文本的末尾。
現(xiàn)在,點(diǎn)擊速度條上Run的按鈕,運(yùn)行這個程序,在編輯框中輸入一個用戶姓名,然后按回車鍵。用戶的姓名就被自動加到了文本框的末尾。
用鼠標(biāo)在Memo控件中點(diǎn)擊一下,將焦點(diǎn)移動到它里面,然后按下Alt+N加速鍵,可以看出,標(biāo)簽控件將焦點(diǎn)移動到了編輯框中。
目資料/市北燃?xì)?網(wǎng)頁資料/青稞學(xué)習(xí)資源-C++%20Builder%20初學(xué)問與答(一~五).files/040720form.gif)
20)問:BCB中有一個和寫字板差不多的組件RichEdit,學(xué)習(xí)她主要注意那幾個屬性的呢?
答:只要能夠把設(shè)置缺省字符格式DefAttributes、設(shè)置選中字符格式SelAttributes與設(shè)置段落Paragraph三個屬性掌握好就差不多了,因?yàn)樗钠渌鼘傩耘cMemo差不多。
缺省字符格式DefAttributes、設(shè)置選中字符格式SelAttributes是TtextAttributes對象,它是用來控制字符格式的,它的Color、Height、Name、Size、Style、Pitch等性性和字體Tfont對象差不多,當(dāng)然還有一些象CharSet、ConsistentAttributes、Protected等一些不太常用的屬性。
設(shè)置段落Paragraph是TparaAttributes對象,用來設(shè)置段落的對齊Alignment、首行縮進(jìn)FirstIndent、左縮進(jìn)LeftIndent、右縮進(jìn)RightIndent、編號方式Numbering、制表位Tab等屬性。
段落的對齊Alignment的取值是taLeftJustify左對齊、taCenter居中和taRightJustify右對齊。
編號方式Numbering,用來設(shè)置編號方式,取nsNone表示沒有編號,取nsBulet表示采用懸掛縮進(jìn)方式編號。
制表位Tab用來設(shè)置某個制表位所在的位置。其聲明為:_property int Tab[Byte Index]。第一個制表位為Tab[0],依次類推。
注:本文的所有例程都在BCB6、WINXP下編譯通過。
3. 按鈕類組件
21)問:在進(jìn)行Windows程序界面設(shè)計(jì)中,經(jīng)常會用到按鈕,在C++Builder中,按鈕一定是通過按鈕組件來實(shí)現(xiàn)的嗎?
答:是的,并且C++Builder的按鈕類組件十分豐富。BCB提供了兩類按鈕類組件:一類是執(zhí)行類按鈕,另一類是信息類按鈕。所謂執(zhí)行類按鈕是指它們通常用來啟動程序運(yùn)行的,比如按鈕、位圖按鈕、加速按鈕。而信息類按鈕一般用來獲取信息,包括單選按鈕和復(fù)選框。靈活地使用各種按鈕,不僅可以使程序更加豐富多彩,而且可以提高程序的性能。
22)問:那么按鈕組件有哪些常用的屬性和方法呢?
答:對于按鈕組件,Caption屬性用來描述按鈕的標(biāo)題,也就是按鈕上顯示的文本,它與標(biāo)簽組件很相識,我們同樣可以在這個屬性中為按鈕指定快捷鍵。
當(dāng)Cancel屬性值為True時,用戶無論何時按下Esc鍵,都會產(chǎn)生OnClick事件,當(dāng)窗體上有多個按鈕時,Esc鍵觸發(fā)TabOrder值最小的那個按鈕的OnClick事件。它的缺省值為False
當(dāng)Default屬性值為true時,用戶無論何時按下Enter鍵時,都會產(chǎn)生OnClick事件,與Cancel屬性不同的是,如果輸入焦點(diǎn)正好在一個按鈕上,那么會產(chǎn)生這個按鈕的OnClick事件。否則,產(chǎn)生TabOrder的值最小的那個按鈕的OnClick事件。它的缺省值為True
Hint屬性保存著按鈕的提示內(nèi)容,當(dāng)用戶把鼠標(biāo)光標(biāo)停留在按鈕上時,就會顯示提示信息。
ShowHint屬性用來確定是否顯示提示文本,缺省值為False。
按鈕常用的事件就是OnClick事件,OnClick事件在鼠標(biāo)單擊按鈕時產(chǎn)生,另外,通過快捷鍵、enter鍵和Esc鍵也可以產(chǎn)生OnClick事件,一般情況下,按鈕都需要增加OnClick事件處理程序。
23)問:那么位圖按鈕又有什么特點(diǎn)呢?
答:位圖按鈕BitBtn除了可以像普通按鈕那樣顯示文本外,還可以顯示圖形,除了具有一般按鈕所具有的全部屬性外,位圖按鈕還有一個特有的Kind屬性。這個屬性用來設(shè)定按鈕為幾種預(yù)定義圖形按鈕風(fēng)格中的哪一種。這是幾種預(yù)定義按鈕風(fēng)格。這些做好的按鈕如下表:
Kind屬性值
|
按鈕外觀
|
等價屬性設(shè)置
|
bkCustom
|
目資料/市北燃?xì)?網(wǎng)頁資料/青稞學(xué)習(xí)資源-C++%20Builder%20初學(xué)問與答(一~五).files/040725b_1.jpg)
|
缺省值
用來給用戶制定
|
bkOK
|
目資料/市北燃?xì)?網(wǎng)頁資料/青稞學(xué)習(xí)資源-C++%20Builder%20初學(xué)問與答(一~五).files/040725b_2.jpg)
|
Caption=”OK”
ModalResult=mrOK
Default=true
|
bkCancel
|
目資料/市北燃?xì)?網(wǎng)頁資料/青稞學(xué)習(xí)資源-C++%20Builder%20初學(xué)問與答(一~五).files/040725b_3.jpg)
|
Caption=”Cancel”
ModalResult=mrCancel
Cancel=true
|
bkYes
|
目資料/市北燃?xì)?網(wǎng)頁資料/青稞學(xué)習(xí)資源-C++%20Builder%20初學(xué)問與答(一~五).files/040725b_4.jpg)
|
Caption=”&Yes”
ModalResult=mrYes
Default=true
|
bkNo
|
目資料/市北燃?xì)?網(wǎng)頁資料/青稞學(xué)習(xí)資源-C++%20Builder%20初學(xué)問與答(一~五).files/040725b_5.jpg)
|
Caption=”&No”
ModalResult=mrNo
Cancel=true
|
bkHelp
|
目資料/市北燃?xì)?網(wǎng)頁資料/青稞學(xué)習(xí)資源-C++%20Builder%20初學(xué)問與答(一~五).files/040725b_6.jpg)
|
Caption=”&Help”
|
bkClose
|
目資料/市北燃?xì)?網(wǎng)頁資料/青稞學(xué)習(xí)資源-C++%20Builder%20初學(xué)問與答(一~五).files/040725b_7.jpg)
|
Caption=”&Close”
|
bkAbort
|
目資料/市北燃?xì)?網(wǎng)頁資料/青稞學(xué)習(xí)資源-C++%20Builder%20初學(xué)問與答(一~五).files/040725b_8.jpg)
|
Caption=”Abort”
ModalResult=mrAbort
|
bkRetry
|
目資料/市北燃?xì)?網(wǎng)頁資料/青稞學(xué)習(xí)資源-C++%20Builder%20初學(xué)問與答(一~五).files/040725b_9.jpg)
|
Caption=”&Retry”
ModalResult=mrRetry
|
bkIgnore
|
目資料/市北燃?xì)?網(wǎng)頁資料/青稞學(xué)習(xí)資源-C++%20Builder%20初學(xué)問與答(一~五).files/040725b_10.jpg)
|
Caption=”&Ignore”
ModalResult=mrIgnore
|
bkAll
|
目資料/市北燃?xì)?網(wǎng)頁資料/青稞學(xué)習(xí)資源-C++%20Builder%20初學(xué)問與答(一~五).files/040725b_11.jpg)
|
Caption=”&All”
ModalResult=mrAll
|
當(dāng)把Kind的屬性值設(shè)置為bkCustom時,還可以給位圖按鈕指定其他的圖形,具體的方法是,在對象編輯器中選擇Glyph屬性,然后單擊Value列中的省略號按鈕,這時會出現(xiàn)一個圖形編輯對話框,要求指定位圖的位置。
單擊Load按鈕,在文件打開對話框中選擇一個位圖文件就可以了。要注意的是,如果選擇的位圖太大,位圖按鈕不會自動調(diào)整其尺寸,這時你只能看到一部分的圖形。
24)問:位圖按鈕組件的NumGlyph屬性有什么作用?
答:屬性NumGlyph指出位圖按鈕使用的位圖的數(shù)目,當(dāng)你需要位圖按鈕使用多個位圖分別表示按下,彈起等不同狀態(tài)時,必須保證這些位圖具有相同的尺寸,并且一個接著一個地水平排列著。
在C++Builder中,一個位圖按鈕最多可有四個位圖,因此,NumGraph地取值范圍只能是1到4,C++Builder將根據(jù)位圖按鈕地狀態(tài)確定顯示哪個位圖。
一般來說,當(dāng)按鈕未選中時顯示第一個位圖。
當(dāng)按鈕不能選擇時,顯示第二個位圖,
當(dāng)按鈕被單擊時顯示第三個位圖,
當(dāng)用戶釋放鼠標(biāo)鍵時,又會重新顯示第一個位圖,
當(dāng)沒有希望的位圖時,那么所有地狀態(tài)都使用第一個位圖。
25)問:快捷按鈕有哪幾個重要屬性?
答:快捷按鈕與位圖按鈕很相似,也可以顯示圖像,但也有一些不同之處:快捷按鈕一般都比較小,缺省大小25*25,基本上都是只顯示圖像而不顯示文字,最大差別是,快捷可以保持在按下的狀態(tài),而其它兩類按鈕不能??旖莅粹o一般都是用來制作工具欄按鈕,這時要和Panel配合使用。下面來看一下它的重要屬性:
AllowAllUp:設(shè)置一個組的快捷按鈕是否可以全部處于彈起的狀態(tài)。缺省為false,這時可以用來模擬單選按鈕,讓同一個組的總有一個按鈕處在按下狀態(tài)。如果一個組中只有一個快捷按鈕,把這個屬性改為true,這時這個按鈕就可以在按下和彈起兩個狀態(tài)之間切換,可以用來模擬一個復(fù)選按鈕。
Down:表示按鈕是否按下,若設(shè)為true,則處于按下的狀態(tài)。
GroupIndex:用來把幾個這個屬性相同的快捷按鈕編為一組,即相同取值的按鈕為一組。缺省為0,表示這個按鈕不編成組。
26)問:那么單選按鈕又有什么特點(diǎn)呢?
答:單選按鈕RadioButton是相互排斥的一種選擇組件,在一組單選按鈕中用戶一次只能選取一個單選按鈕。
雖然你可以只使用一個單選按鈕,但是那樣單選按鈕也就失去了意義。單選按鈕一般都是成組出現(xiàn)的。
單選按鈕只有一個比較特殊的屬性Checked,它表示按鈕是否被選中。缺省情況下,Checked的屬性是False,表示按鈕未選中。
另外單選按鈕也具備Caption屬性,這就意味著它也可以通過快捷鍵來選中。
單選按鈕在成組使用時有一些特點(diǎn)需要掌握。當(dāng)你在同一容器(如:Form、Panel、GroupBox等)上直接放置單選按鈕時,這些單選按鈕自成一組,也就是說,無論在容器上放置2個或者幾十個單選按鈕,它們都是一組的,每次只能選中它們中的某一個。
27)問:如果我想在窗體上放置不止一組按鈕,應(yīng)該怎么辦?
答:可以用兩種方法。一種是使用組合框(GroupBox),另一種是使用單選按鈕分組框(RadioGroup)。
組合框顧名思義就是用來把許多組件組合起來,使窗口變得整齊而有條理,每一組不同的按鈕使用一個組合框。在設(shè)計(jì)時,首先把組合框放在窗體上,然后再把單選按鈕放在分組框上。要記住的是,放置次序不能顛倒。一旦把單選按鈕放在分組框中,那么這個單選按鈕就屬于這個組合框了,你無法把它從組合框中移走,如果刪除組合框的話,分組框中所有的單選按鈕也會被同時刪除。
在實(shí)際應(yīng)用中,我們經(jīng)常使用單選按鈕分組框而不是單選按鈕。因?yàn)閱芜x按鈕分組框可以包含多個單選按鈕,而它實(shí)際上只是一個組件。這比使用分組框和多個單選按鈕更直觀和簡單。
28)問:單選按鈕分組框又有哪些特殊的屬性呢?
答: 單選按鈕分組框有三個屬性是比較特殊的:
屬性Items是類TStrings的一個對象,這一點(diǎn)與Memo組件中的Lines屬性很相似,但是它們的含義不同,Lines屬性包含Memo組件中顯示的每一行字符串,而Items屬性雖然也包含許多字符串,但是每一個字符串代表單選按鈕組中的一個單選按鈕。
單擊Items屬性Value列中的省略號按鈕,可以打開一個字符串編輯器,然后在這個編輯器中可以輸入單選按鈕的標(biāo)題。每個單選按鈕占用一行。
Columns屬性決定著單選按鈕分組框內(nèi)分欄的數(shù)目,默認(rèn)是1,最多可以有16欄,即16列。
ItemIndex屬性為單選分組框中被選中項(xiàng)的序號。-1表示不指向任何一個項(xiàng)。
29)問:復(fù)選按鈕(CheckBox)有什么作用?
答:復(fù)選按鈕與單選按鈕不同,你可以一次選擇多個復(fù)選按鈕。復(fù)選按鈕有幾個比較重要的屬性。
Alignment屬性控制復(fù)選框標(biāo)題的位置。
taRightJustify
標(biāo)題出現(xiàn)在復(fù)選框的右邊
taLeftJustify
標(biāo)題出現(xiàn)在復(fù)選框的左邊
缺省值為taRightJustify。
AllowGrayed屬性決定復(fù)選框是否可以處于灰色的狀態(tài),當(dāng)屬性值為True時,復(fù)選框有三種狀態(tài),選中、未選中、和灰色;當(dāng)屬性值為False時,復(fù)選框只有兩種狀態(tài)。缺省值為false。
Checked屬性確定復(fù)選框是否被選中。缺省值為false。
要知道復(fù)選框是選中狀態(tài)、未選中狀態(tài)還是灰色狀態(tài)。,可以在運(yùn)行的時候,用程序讀取運(yùn)行時態(tài)變量State的值,缺省值為cbUnChecked。
雖然復(fù)選框之間并不互相排斥,也就是說,直接放置在窗體上的每一個復(fù)選按鈕相互之間都不干擾,但是最好還是把復(fù)選框分組使用。這樣做的好處是便于用戶理解。
30)問: CheckBox、RadioButton如何完成動態(tài)改變其按鈕的標(biāo)題? RadioGroup能動態(tài)添加吧?讀取上面三個組件標(biāo)題又如何做呢?
答:CheckBox、RadioButton的屬性里有一個Caption,它的屬性值就是按鈕的標(biāo)題,所以應(yīng)該說對這兩個組件來說很容易做到的:
CheckBox1->Caption=”信息”;
Label1->Caption= CheckBox1->Caption;
RadioButton與CheckBox一樣,這里就不多說了。
而RadioGroup里面有一個Items屬性,這在《閑談BCB》中說過這個問題,所以你要添加按鈕,可以用下面的方法:
RadioGroup1->Items->Add(“我是新來的”);
讀取可以利用ItemsIndex來完成:
Label1->Caption=RadioGroup1->Items->Strings[RadioGroup1->ItemIndex];
String是把選中的序號轉(zhuǎn)換成你需要的文本,因?yàn)镮tems是Tstring對象,這類情況在你以后的學(xué)習(xí)中會經(jīng)??吹降摹?br>
要注意在RadioGroup中也有一個Caption,這是用來給單選分組框設(shè)置標(biāo)題的,這個標(biāo)題與單選的文字無關(guān)。
4.列表類組件 31)問:當(dāng)我需要使用多個選項(xiàng)的時候,使用單選按鈕或復(fù)選框來進(jìn)行選擇不是很恰當(dāng),因?yàn)樵诖绑w上放置大量的按鈕既不利于布局的美觀,又會消耗大量的系統(tǒng)資源,C++Builder有什么解決辦法嗎?
答:可以使用列表框(ListBox、CheckListBox)或組合框(ComboBox)這兩類最常用的列表組件。
32)問:列表框有那些主要屬性?
答:列表組件ListBox在缺省情況下,只能進(jìn)行單項(xiàng)選擇,當(dāng)屬性MultiSelected為True時,可以進(jìn)行多項(xiàng)選擇。這時你只要單擊想要的選項(xiàng),那么這些選項(xiàng)都會被選中。
目資料/市北燃?xì)?網(wǎng)頁資料/青稞學(xué)習(xí)資源-C++%20Builder%20初學(xué)問與答(一~五).files/040727c_1.gif)
Items屬性:列表框中的所有選項(xiàng)都是通過這個屬性來進(jìn)行訪問的。設(shè)置時只要點(diǎn)擊Items右邊的“…”就可以編輯了。
當(dāng)屬性ExtendedSelect也等于True時,有兩種方法可以進(jìn)行多項(xiàng)選擇。一種是單擊選項(xiàng)同時按下Ctrl鍵,這樣可以選中兩個選項(xiàng)之間的所有選項(xiàng)。它的缺省值為False。
Sorted屬性確定列表框中顯示的內(nèi)容書否按照字母順序排列。缺省值為False。
當(dāng)不允許多項(xiàng)選擇時,我們通過屬性ItemIndex就可以返回被選中的選項(xiàng)。但是,如果打開了多項(xiàng)選擇,那么屬性ItemIndex只返回最后個被選中的選項(xiàng)序號(有些書上也說返回選中選項(xiàng)中具有輸入焦點(diǎn)的選項(xiàng)序號,但我覺得這種說法有點(diǎn)不易讓初學(xué)者理解)。
SelCount屬性在MultiSelected屬性為True時,指出了列表框中被選中項(xiàng)目的個數(shù)。當(dāng)MultiSelected屬性為False時,它的值為-1。
Selected屬性指出了列表框中的某個項(xiàng)目是否被選中。
TcheckListBox是從TcustomListBox繼承下來的的,TListBox也是直接從TcustomListBox繼承下來的,因此這兩個組件是兄弟關(guān)系,它們的屬性和使用都非常相似。下面來看看它的不同之處:
AllowGrayed屬性和多選按鈕一樣,當(dāng)屬性值為True時,則列表框中的選項(xiàng)有三種狀態(tài):選中、未選中和選中但變灰;當(dāng)屬性值為False時,列表框只有兩種狀態(tài)。缺省值為false。
Checked其聲明為:_property bool Checked[int Index];這個屬性用來返回或者設(shè)置列表框中的指定選項(xiàng)是否被選中。其中參數(shù)Index表示指定的選項(xiàng)的序號。
32)問:那么,組合框和列表框相比有什么相似之處和不一樣的地方呢?
答:首先,從外觀上來說,列表框占據(jù)了比較大的空間,而組合框只需要一行的空間就可以了。從另一方面來說,組合框還帶有一個編輯框,用戶可以直接在編輯框中輸入文本,組合框在一般情況下只顯示這個編輯框,當(dāng)用戶單擊組合框右邊的下拉箭頭時,就會顯示一個包含所有選項(xiàng)的下拉列表。 組合框和列表框最大的不同是組合框不能進(jìn)行多項(xiàng)選擇。
組合框與列表框有一定的相似之處,就是它們都能夠包含許多的選項(xiàng)。但是組合框還是有不少獨(dú)特的屬性。
33)問:組合框有哪些常用屬性及事件呢?
答:屬性Style決定著組合框的樣式,C++Builder為組合框定義了五種不同的樣式。
CsDropDown:這時為一個標(biāo)準(zhǔn)的組合框,由一個編輯框和下拉列表組成。
CsDropDownList:與標(biāo)準(zhǔn)組合框相似,但不能在編輯框中輸入文本。
CsSimple:沒有下拉列表的組合框,只是一個編輯框,也就是說只能輸入不能選擇。
csOwnerDrawFixed和csOwnerDrawVariable這兩種樣式的組合框常用于需要圖像作為項(xiàng)目時,當(dāng)然你輸入字符串也可以。前面一種樣式組合框中各個項(xiàng)目的高度是固定的,而后面一種樣式的高度可以變化,也就是說,各個項(xiàng)目的高度可以不一樣,此外,在這兩種樣式中,編輯框是不可輸入的。
Text屬性用來設(shè)置或者返回組合框中顯示出來的文本內(nèi)容。
當(dāng)編輯框中的內(nèi)容發(fā)生變化時將觸發(fā)OnChange事件。所以在組合框里我們用的就是它。
注意下面四段兩組語句的區(qū)別與聯(lián)系:
|
//………………第一組
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;
}
也可以用下面的代碼,它們在這里是等價的:
void _fastcall TForm1::ComboBox2Change(TObject *Sender)
{
Edit1->Font->Name= ComboBox2->Items->String[ComboBox2->ItemIndex];
}
|
我想通過對比,你會明白這些語句的區(qū)別與聯(lián)系的,什么時候用什么樣的語句,細(xì)細(xì)品味一下你就會明白了。
目資料/市北燃?xì)?網(wǎng)頁資料/青稞學(xué)習(xí)資源-C++%20Builder%20初學(xué)問與答(一~五).files/040727c_2.gif)
34)問:前面您提到了面板組件,它是一種什么類型的組件?
答:它是一種容器組件,容器組件是可以包含其他組件的組件,最典型的容器組件就是窗體。其他比較常用的容器組件有面板(Panel)、組合框(GroupBox)。
面板組件可以容納其他組件。任何放置在面板上的組件都會成為面板的子組件,當(dāng)你刪除面板組件時,放置在面板上的其他組件也同時被刪除了,這是容器組件的共同特點(diǎn)。
面板組件沒有什么特別的屬性,只有BevelInner(面板內(nèi)部斜面),BevelOuter(面板外部斜面),BevelWidth(斜面寬度,單位像素),BorderStyle(邊界風(fēng)格)和BorderWidth(邊界寬度)幾個屬性有一些特點(diǎn)。這些屬性的任意組合可以生成各種效果的邊框。你可以設(shè)置這幾個屬性的值,可以得到不同的面板效果。
其中BevelInner(面板內(nèi)部斜面),BevelOuter(面板外部斜面)的屬性值是一樣的:bvNone(缺省值)表示沒有斜面;
bvLowered表示為沉降的斜面;
bvRaised表示為上升的斜面。
組合框(GroupBox)屬性中你只要設(shè)置好Caption就可以了,它是標(biāo)題的名稱,表示此組合框類別、功能、選項(xiàng)等。GroupBox1為默認(rèn)名稱。
5.特殊的輸入控制類組件 35)問:C++Builder有哪些輸入控制類組件?
答:C++Builder輸入控制類組件主要包括滾動條(ScrollBar)、軌跡條(TrackBar)、進(jìn)程條(ProgressBar)以及加減組件UpDown,它們都可以實(shí)現(xiàn)邊續(xù)范圍內(nèi)數(shù)值的選擇。
36)問:滾動條主要用在什么地方,它又有哪些常用屬性呢?
答:滾動條是常見的組件,它經(jīng)常出現(xiàn)在列表框、Memo等組件中。這時,它是作為這些組件的一部分而存在的。其實(shí)滾動條還可以單獨(dú)使用,單獨(dú)使用時,滾動條一般用來控制連續(xù)的數(shù)值輸入。象調(diào)節(jié)音量等,都可以使用滾動條輸入。
滾動條有這樣一些常用屬性
1.Position:這個屬性用來設(shè)置或者返回當(dāng)前流動條中滑塊的位置。屬性Max,Min,用來設(shè)置滾動條可以滾動的最大或最小位置。當(dāng)Position等于Max時,滾動塊位于滾動條的最右端;當(dāng)Position等于Min時,滾動塊位于滾動條的最左端。當(dāng)Position等于Max和Min之間的某一個值時,滾動塊位于滾動條中間的某個位置。
2.屬性Kind。屬性Kind有兩個可能的取值:sbHorizontal(缺省值)和sbVertical,分別表示水平滾動條和垂直滾動條。
3.屬性SmallChange決定當(dāng)用戶單擊滾動條兩端的箭頭按鈕時滾動塊移動的距離。
4.屬性LargeChange確定當(dāng)用戶單擊滾動塊兩邊的空白或按下PgUp和PgDn鍵時,滾動塊移動的距離。屬性LargeChange和SmallChange的取值范圍是1到32767。
37)問:滾動條能夠響應(yīng)哪些常用事件呢?
答:滾動條的常用事件是OnChange,只要屬性Position的值發(fā)生改變都會產(chǎn)生這個事件。一般情況下,了解滾動條的這個屬性就可以了。
但是有時候可能需要更詳細(xì)地了解用戶單擊了滾動條的哪個位置,這時就需要響應(yīng)OnScroll事件,其聲明為:-_property TScrollEvent OnScroll;其中TscrollEvent的聲明為:typedef void fastcall (closuer TScrollEvent)(System::Tobject Sender,TscrollCode ScrollCode,int &ScrollPos); OnScroll事件處理程序帶有三個參數(shù):
其中參數(shù)Sender指出了是哪個對象發(fā)送了這個消息,參數(shù)ScrollPos指出了滾動塊的位置,參數(shù)ScrollCode返回滾動條的狀態(tài),這些狀態(tài)是用這樣一些參數(shù)值表示的,
scLineUp 表示用戶單擊了滾動條左端的箭頭按鈕(水平滾動條)或上端的箭頭按鈕(垂直滾動條)。 scLineDown 表示用戶單擊了滾動條右端的(水平滾動條)或下端的箭頭按鈕(垂直滾動條)。 scPageUp 表示用戶單擊了滾動塊左邊(水平滾動條)或上邊(垂直滾動條)的區(qū)域。 scPageDown 表示用戶單擊了滾動塊右邊(水平滾動條)或下邊(垂直滾動條)的區(qū)域。 scPosition 表示用戶移動了滾動條但是已經(jīng)釋放了。 scTrack 表示用戶正在移動滾動塊。 scTop 表示用戶把滾動塊移動到了滾動條的左端(水平滾動條)或頂端(垂直滾動條)。 scBottom 表示用戶把滾動塊移動到了滾動條的右端(水平滾動條)或下端(垂直滾動條)。 scEndScroll 表示用戶結(jié)束了移動滾動塊的操作,釋放了鼠標(biāo)或者鍵盤按鍵。
|