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