• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 16, 文章 - 1, 評論 - 4, 引用 - 0
            數(shù)據(jù)加載中……

            C++ Builder 初學(xué)問與答(一~五)

            一直以來都想寫一點(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的開頭部分加入:

            #include “Unit2.h”

              在要調(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來完成。

            Lines->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)移動到了編輯框中。

            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

            缺省值

            用來給用戶制定

            bkOK

            Caption=”OK”

            ModalResult=mrOK

            Default=true

            bkCancel

            Caption=”Cancel”

            ModalResult=mrCancel

            Cancel=true

            bkYes

            Caption=”&Yes”

            ModalResult=mrYes

            Default=true

            bkNo

            Caption=”&No”

            ModalResult=mrNo

            Cancel=true

            bkHelp

            Caption=”&Help”

            bkClose

            Caption=”&Close”

            bkAbort

            Caption=”Abort”

            ModalResult=mrAbort

            bkRetry

            Caption=”&Retry”

            ModalResult=mrRetry

            bkIgnore

            Caption=”&Ignore”

            ModalResult=mrIgnore

            bkAll

            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)都會被選中。



              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ì)品味一下你就會明白了。

              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)或者鍵盤按鍵。

            posted on 2007-06-29 11:13 東東會會 閱讀(3910) 評論(0)  編輯 收藏 引用 所屬分類: C++Builder 基礎(chǔ)

            久久精品国产亚洲AV久| 国产亚洲精久久久久久无码77777| 亚洲国产另类久久久精品小说 | 浪潮AV色综合久久天堂| 国产精品欧美久久久天天影视| 日本免费久久久久久久网站| 精品国产青草久久久久福利| 亚洲精品久久久www| 91精品国产91久久久久久蜜臀| 亚洲国产精品综合久久网络| 人妻少妇久久中文字幕| 久久免费99精品国产自在现线| 久久久久AV综合网成人| 亚洲婷婷国产精品电影人久久 | 国产免费久久精品丫丫| 一本久道久久综合狠狠爱| 99久久精品免费看国产| 久久久久久久人妻无码中文字幕爆| 久久久久免费视频| 久久亚洲高清观看| 99国产欧美久久久精品蜜芽| 狠狠色婷婷久久综合频道日韩| 久久久久国色AV免费看图片| 2021少妇久久久久久久久久| 久久天堂电影网| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久精品国产亚洲av麻豆蜜芽| 久久国产热这里只有精品| 青青草原综合久久大伊人| 欧美丰满熟妇BBB久久久| 亚洲精品无码成人片久久| 日韩一区二区久久久久久| 国内精品伊人久久久久AV影院| 中文字幕无码久久人妻| 亚洲国产一成久久精品国产成人综合 | 久久久久国产一区二区| 久久一区二区免费播放| 欧美伊人久久大香线蕉综合69| 亚洲伊人久久成综合人影院| 香蕉久久AⅤ一区二区三区| 性高朝久久久久久久久久|