青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 16, 文章 - 1, 評論 - 4, 引用 - 0
數據加載中……

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

一直以來都想寫一點為BCB初學者快速入門的東西,前不久寫了幾篇《閑談BCB》想把自己學習BCB中如何來解決難點的方法說給大家,沒想到被罵得不成樣子。本想不寫了,但覺得這些東西留下來能做什么呢?還是用另一種方法來重新演譯我的思維吧,最近有些忙,那幾篇沒有寫完的文章,我也會盡快寫完的,至于《深入QR》,我想我一定會用另一種手法來寫,讓你一看就會把QR這個嬌女的所有衣服都脫光,不整理到這個地步,我是不敢輕易再拿出來,還請朋友見諒!

本文分為《基礎入門》、《快速提高》與《成功編程者》三部分。

  第一部分:基礎入門

  1.窗體

  1)問:Windows的編程就是在窗體的基礎上實現的, C++Builder是怎樣處理窗體的呢?

  答:窗體的一部分功能通過窗體的屬性來實現,窗體的屬性非常多,這里只對其中比較重要的屬性進行介紹。

  1.ActiveControl指定窗體上的某個組件為輸入焦點。如下面的語句將窗體上的Label1組件成為輸入焦點:ActiveControl=Label1。在同一時時刻,應用程序只能有一個輸入焦點。

  2.BorderIcons用來設定標題欄上出現哪些系統圖標。它是一個集合,可以設成以下幾個類型:最大化按鈕(biMaximize)、最小化按鈕(biMinimize)、幫助按鈕(biHelp)和系統菜單(biSystemMenu)。

  3.Icon屬性用來指定當窗體最小化時顯示的圖標。

  4.KeyPreview屬性為true時,表示擊鍵事件發生時先傳給窗體,然后再傳給有輸入焦點的組件上,相當于窗體截獲了原本屬于組件的事件。缺省值為false,表示擊鍵事件只送到當前有輸入焦點的組件上。

  5. Menu屬性用來指定窗體的主菜單。

  6.Visible屬性用來確定窗體是否可見。

  此外還有一些運行時態屬性,這些屬性只有在程序運行的時候才能通過編程訪問。這種屬性主要有:

  Active
  屬性用來確定窗體是否獲得輸入焦點。
  
  ActiveMDIChild
  這個函數將返回當前活動的子窗體。
  
  DropTarget
  屬性用來指定窗體是否是拖放操作的對象。
  
  Parent
  屬性用來設定包含窗體的窗口控件,通常是另一個窗體。如果窗體沒有包含它的控件,那么它的Parent屬性為nil。

2)問: Windows窗體有很多樣式,比如對話框,彈出窗口。如果我要控制窗體的邊界樣式,應該怎么辦?





  答:屬性BorderStyle可以指定窗體邊界的外觀和行為。它一共有六種可能的取值。

  bsDialog
  表示大小不可變的標準的對話框邊界。
  
  bsSingle
  表示大小不可變的單線邊界。
  
  bsNone
  表示大小不可變、沒有邊界。
  
  bsSizeable
  表示標準的可改變大小的窗體。
  
  bsToolWindow
  與bsSingle時類似,但是標題較小,用做工具框窗口。
  
  bsSizeToolWin
  與bsSizeable時相似,但是標題較小,做工具框窗口。

  要注意的是,對于MDI子窗體,bsDialog或bsNone將不起作用。

  3)問:同樣是獲得焦點,ActiveControl與SetFocus()有什么不同?

  答: ActiveControl是把焦點交給組件,它是一個屬性。而SetFocus()是組件主動要焦點,是一個方法。書寫格式也不一樣。例如,我們想使同樣的一個Button1獲得焦點,可以下的兩種寫法:

  ActiveControl=Button1或Button1=SetFocus()

  二者作用是一樣的,不過一般都習慣用第一種方式。

  4)問:屬性FormStyle有什么作用?

  答:屬性FormStyle可以確定窗體的類型,它一共有四種屬性值。

  fsNormal
  表示窗體既不是MDI父窗口也不是MDI子窗口,只可能是單文檔SDI窗口或者對話框。這個屬性值是缺省值。
  
  fsMDIChild
  表示這個窗體是一個MDI子窗口。
  
  fsMDIForm
  表示這個窗體是一個MDI父窗口。

  fsStayOnTop
  表示窗體始終保持在窗體所屬工程中其它窗體的上面,除非還有別的窗體的FormStyle屬性也被設置成了fsStayOnTop。

  要特別注意的是,在程序運行期間不要修改窗體的FormStyle屬性。

  5)問:屬性Position有什么作用?

  答:屬性Position可以確定程序運行時出現在屏幕上的窗體的大小和位置,它有五種可能的取值。

  1.poDesigned表示使用設計時指定的尺寸和位置屬性時顯示窗體。尺寸屬性是指Height和Width,位置屬性是指Left和Top。這個屬性值是缺省值。

  2.poDefault表示窗體在屏幕上顯示的位置和大小由Windows決定。每次運行應用程序時,窗體都會稍微向下向右移動。

  3.poDefaultPosOnly表示窗體以設計時的窗體尺寸顯示窗體,但是在屏幕上顯示的位置由Windows確定。每次運行應用程序時,窗體都會稍微向下向右移動。當無法再向下移動時,就又會從屏幕的左上角開始顯示。

  4.poDefaultSizeOnly表示窗體的位置由設計時指定的值確定,而尺寸由Windows確定。

  5.poScreenCenter表示使用設計時指定的尺寸和位置屬性,在屏幕的中央顯示窗體。

  6)問:如何最大化或最小化窗體?

  答:屬性WindowState與窗體的顯示有關,它有三種可能的取值。

  wsNormal
  窗體既不是最大化顯示也不是最小化顯示。這個值是缺省值。
  
  wsMinimized
  窗體最小化顯示。
  
  wsMaximized
  窗體最大化顯示。

  7)問:屬性ClientHeight和ClientWidth有什么作用?

  答:這兩個屬性用來定義窗體用戶區域的高和寬。所謂用戶區域窗體的實際工作區域,就是除了窗體的標題欄、菜單條、工具條和狀態條以及邊框之外的窗體區域。所以對于新創建的窗體,它的用戶區域比窗體的大小要稍微小一些,相對而言,窗體的大小是由屬性Height和Width確定的。

  8)問:如何動態創建一個窗體呢?

  答:我們先創建一個主窗體MainForm,把她的Caption改為“主窗體”,把FormStyle屬性改為fsMDIForm。再創建一個子窗體windows1,把Caption改為“子窗體”,把FormStyle屬性改為fsMDIChild。

  fsStayOnTop
  表示窗體始終保持在窗體所屬工程中其它窗體的上面,除非還有別的窗體的FormStyle屬性也被設置成了fsStayOnTop。

  要特別注意的是,在程序運行期間不要修改窗體的FormStyle屬性。

  5)問:屬性Position有什么作用?

  答:屬性Position可以確定程序運行時出現在屏幕上的窗體的大小和位置,它有五種可能的取值。

  1.poDesigned表示使用設計時指定的尺寸和位置屬性時顯示窗體。尺寸屬性是指Height和Width,位置屬性是指Left和Top。這個屬性值是缺省值。

  2.poDefault表示窗體在屏幕上顯示的位置和大小由Windows決定。每次運行應用程序時,窗體都會稍微向下向右移動。

  3.poDefaultPosOnly表示窗體以設計時的窗體尺寸顯示窗體,但是在屏幕上顯示的位置由Windows確定。每次運行應用程序時,窗體都會稍微向下向右移動。當無法再向下移動時,就又會從屏幕的左上角開始顯示。

  4.poDefaultSizeOnly表示窗體的位置由設計時指定的值確定,而尺寸由Windows確定。

  5.poScreenCenter表示使用設計時指定的尺寸和位置屬性,在屏幕的中央顯示窗體。

  6)問:如何最大化或最小化窗體?

  答:屬性WindowState與窗體的顯示有關,它有三種可能的取值。

  wsNormal
  窗體既不是最大化顯示也不是最小化顯示。這個值是缺省值。
  
  wsMinimized
  窗體最小化顯示。
  
  wsMaximized
  窗體最大化顯示。

  7)問:屬性ClientHeight和ClientWidth有什么作用?

  答:這兩個屬性用來定義窗體用戶區域的高和寬。所謂用戶區域窗體的實際工作區域,就是除了窗體的標題欄、菜單條、工具條和狀態條以及邊框之外的窗體區域。所以對于新創建的窗體,它的用戶區域比窗體的大小要稍微小一些,相對而言,窗體的大小是由屬性Height和Width確定的。

  8)問:如何動態創建一個窗體呢?

  答:我們先創建一個主窗體MainForm,把她的Caption改為“主窗體”,把FormStyle屬性改為fsMDIForm。再創建一個子窗體windows1,把Caption改為“子窗體”,把FormStyle屬性改為fsMDIChild。

選擇“Project|Options…”菜單項,將會彈出一個如圖所示的對話框。

  在這里我們可以通過下拉框選擇主窗體(Main form),在左側的Auto-create forms里列出了所有的窗口,這里面的窗口通常是動態創建,你可以把需要動態創建的窗口(Available forms)通過中間的那四個按鈕調到右側,然后OK就可以了。

  動態的創建的方法如下:

void _fastcall TForm1::Button1Click(TObject *Sender)

{

   Tform2 *Forms;

   try

   {

Form2=new TForm2(Application);//動態創建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);//動態創建Form2

……

}

  你要記住,無論你的子窗體創建是否完成,你都必須運行delete來釋放你剛才創建的子窗體,當然你也可以把釋放的過程寫在OnClose事件函數內,這個函數有一個參數為Action,它有四個取值:caNone為不關閉窗體,什么也不操作;caHide為不關閉窗體,但把它隱藏起來;caFree為關閉窗體,同時釋放內存;caMinimize為最小化窗體,不關閉。所以我們也可以象下面這樣來釋放子窗體。

void _fastcall TForm2::FormClose(Tobject *Sender,TcloseAction &Action)

{

  Action=caFree;

}

  9)問:為什么我們用Close()不能關閉我當前活動的子窗體?

  答:關閉當前活動窗體,很多人會用如下的方法:

void _fastcall TForm1::Button2Click(Tobjcet *Sender)

{

  ActiveMDIChild->Close();//注意這是在主窗體(或者說在其它窗體)中來關閉當前活動的子窗體,這樣做不好,一般的關閉應該象10)問中那樣來做

}

此時窗體并沒有關閉,而是最小化了,因此要在子窗體的OnClose事件中用如下代碼來關閉。

void _fastcall TForm2::FormClose(Tobject *Sender,TCloseAction &Action)

{

  Action=caFree;

}

  這段程序不用多說了,上面都說過了。

  這里有一點要說明一下,就是在調用Close()時,會自動觸發OnClose事件,而由上我們知道窗體沒有關閉,而是最小化,說明在OnClose中Action的此時的值為caMinimize。所以我們要寫上面的方法來關閉。

  10)問:Show()與ShowModal()有什么不同?

  答:我們的程序中不可能就只有一個Form,比如,有Form1和Form2兩個窗口,我們在Form1中調用Form2應該先在Unit1.cpp的開頭部分加入:

#include “Unit2.h”

  在要調用的地方加入:

Form2->Show();//或是Form2->ShowModal();

  兩者的區別在于若使用了ShowModal()則必須關閉Form2,才能處理其它窗口的內容,而Show()則不用。當然你可以直接在Form2直接創建一個Button1來關閉她,程序內容如下:

void _fastcall TForm2::Button1Click(Tobject *Sender)

{

Close();

}

  在Close前,不需要加上Form2,因為這行程序就是在Form2上運行的,所以默認的父組件就是Form2。
2.文本輸入組件
11)問:如果要實現文本輸入,在C++Builder中應該怎么辦?

  答:C++Builder常用文本輸入組件來實現,常用的文本輸入組件有Edit、MaskEdit 、Memo和RichEdit。他們的主要不同在于Edit和MaskEdit用于輸入單行文本,而Memo和RichEdit可以輸入多行文本。此外Label組件也可用來進行文本顯示。

  Edit和MaskEdit是一個窗口控件,它可以獲得輸入焦點。當用戶需要輸入單行文本時,就應該使用編輯框。它通常與標簽組件一起使用。

  12)問:編輯框(Edit)常用的屬性有哪幾個?

  答:編輯框常用的幾個屬性如下:

  Text屬性是一個String類型的數據,它決定了在編輯框中出現的文本字符串。在編程中,我們經常要通過text屬性獲取編輯框中的文本字符串

  MaxLength是一個Integer類型的數據,它指定編輯框所能容納的最大字符數。缺省情況下為0,表示長度不限。

   編輯框還可以用做口令輸入。具體方法是,把PasswordChar屬性設置為除#0之外的任何字符。這時,無論你在編輯框中輸入什么字符,都只顯示PasswordChar包含的字符。我們經常把PasswordChar設置為星號*,當用戶輸入口令時只顯示星號。如輸入#0表示編輯框正常顯示。PasswordChar是一個字符類型的數據。

  如果要限制用戶對編輯框寫的權利。可以使用屬性ReadOnly,當ReadOnly的值為True時只讀。

13)問:標簽控件(Label)起什么作用?

  答:標簽的常用屬性有Caption和FocusControl。

  Caption屬性是字符串類型,用來指定標簽的標題,也就是標簽的顯示內容。

  FocusControl屬性是窗口控件類,用來指定一個與標簽相連的窗口控件。從而允許這個控件使用快捷鍵來獲得輸入焦點。

  標簽是一個典型的非窗口控件,它不能獲得輸入焦點,所以經常被用來給一些沒有Caption屬性的組件做標簽。標簽還能同時給這些組件提供快捷鍵的功能,允許用戶通過快捷鍵獲得輸入焦點。

  14)問:那在Label中如何使用Caption與FocusControl呢?

  答:下面舉個例子說吧(這個例子在第19問中會用到):

  首先在輸入標題時需要指定一個快捷鍵,這可以用在一個字母前面加上一個連字符&來實現。單擊caption屬性輸入欄,輸入&N姓名,這里字母N就被指定為快捷鍵,要注意的是中文是不能被指定為快捷鍵的,只有26個英文字母才可以。

  然后,把標簽的FocusControl屬性與編輯框Edit1相連,選擇FocusControl屬性,從屬性值字段列舉的窗體上所有的窗口控件中選取Edit1。這樣當用戶按下Alt+N時,輸入焦點就會轉移到編輯框Edit1。

  15)問:我遇到一些程序,當在編輯中輸入完文本后,按一下回車鍵,程序就開始執行了,C++Builder應該怎樣實現?

  答:當然可以。當我們按下回車鍵時,產生了OnKeyPress事件。所以如果要在程序中處理這種事件,這就要編寫OnKeyPress事件處理程序。

  還有三種事件是編輯框常用的事件:OnChange事件、OnEnter事件和OnExit事。每當編輯框中的文本發生改變時都會觸發OnChange事件。當編輯框獲得輸入焦點時會觸發OnEnter事件,而失去焦點時會產生OnExit事件。

16)問:簡單說一下Memo組件的重要屬性?

  答: Memo與Edit的屬性有很多相似的,下面只來說一下Memo組件的重要屬性。

  Lines屬性是一個TStrings類的一個對象,它是由多個字符串組成的,每一個字符串就是Lines中的一個 元素。Memo組件的每一行文本都是Lines中的一個字符串。

  在設計階段,如果要給Memo組件增加一些顯示內容,可以在對象編輯器中選擇屬性Lines,單擊Value列上的省略號按鈕,這時會打開一個字符串編輯窗口。

  在這個編輯器中輸入文本。編輯器中顯示的所有內容都會出現在Memo組件中。

  Memo組件屬性中:

  Alignment
   用來確定Memo組件中顯示文本的對齊方式。

  WordWrap
   確定文本到達右邊界時是否自動換行

  WantReturn
   確定用戶是否可以在文本中插入回車符。

  WantTabs
   確定用戶是否可以在文本中插入Tab字符。

  屬性ScrollBar是一個常見的屬性,它確定著滾動組件滾動條的行為。ScrollBar有四種可能的取值:

  SsNone
   表示沒有滾動條;

  ssHorizonal
   表示只有水平滾動條;

  ssVertical
   表示只有垂直條;

  SsBoth
   表示既有水平滾動條也有垂直滾動條。

當顯示的內容比較多時,應該選擇ssBoth,這樣才能夠使用戶看到所有的內容。

17)問:要在程序運行期間修改Memo組件的顯示內容,應該怎么辦?

  答:這就需要使用TStrings類的某些屬性和方法。例如要給Memo組件增加一句話“我來了”,那么可以使用方法Add來完成。

Lines->Add(“我來了”);

  要尋找Memo中的某一行,可以使用Lines->Strings[n]的形式,不過要注意Lines的字符串是從0開始的,所以在與Memo中的實際行號對應時,行號需要減一。

  18)問:如果我要實現文本的剪切、復制和粘貼,應該怎么辦?

  答:Memo組件提供了三個用來完成剪切、復制和粘貼的方法。CutToClipboard用來把Memo組件中被選中的文本剪切到剪切板。

  CopyToClipboard用來把Memo組件中被選中的文本復制到剪切板。

  PasteFromClipboard用來把剪切板的內容粘貼到Memo組件中光標所在的位置。

  19)問:前面講了幾個控件,能把他們綜合起來編制一個程序嗎?

  答:好的,就利用剛才已經放好的組件來編寫一個用戶姓名錄入和顯示的程序。

  這個程序將實現當在編輯框中輸入文本并按下Enter鍵后,文本就被增加到Memo組件中。因此需要給編輯框組件增加事件處理過程。

  當用戶按下Enter鍵時產生了OnKeyPress事件,所以應該編寫這個事件的處理過程。

  選中組件Edit1,

  在對象觀察器上選擇Events標簽頁,

  雙擊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);

}

  當用戶輸入文本并且按下回車鍵后,第三條語句將Temp和用戶輸入的字符串合并后加到Memo控件文本的末尾。

  現在,點擊速度條上Run的按鈕,運行這個程序,在編輯框中輸入一個用戶姓名,然后按回車鍵。用戶的姓名就被自動加到了文本框的末尾。

  用鼠標在Memo控件中點擊一下,將焦點移動到它里面,然后按下Alt+N加速鍵,可以看出,標簽控件將焦點移動到了編輯框中。

20)問:BCB中有一個和寫字板差不多的組件RichEdit,學習她主要注意那幾個屬性的呢?
   答:只要能夠把設置缺省字符格式DefAttributes、設置選中字符格式SelAttributes與設置段落Paragraph三個屬性掌握好就差不多了,因為她的其它屬性與Memo差不多。

    缺省字符格式DefAttributes、設置選中字符格式SelAttributes是TtextAttributes對象,它是用來控制字符格式的,它的Color、Height、Name、Size、Style、Pitch等性性和字體Tfont對象差不多,當然還有一些象CharSet、ConsistentAttributes、Protected等一些不太常用的屬性。

    設置段落Paragraph是TparaAttributes對象,用來設置段落的對齊Alignment、首行縮進FirstIndent、左縮進LeftIndent、右縮進RightIndent、編號方式Numbering、制表位Tab等屬性。

    段落的對齊Alignment的取值是taLeftJustify左對齊、taCenter居中和taRightJustify右對齊。

    編號方式Numbering,用來設置編號方式,取nsNone表示沒有編號,取nsBulet表示采用懸掛縮進方式編號。

    制表位Tab用來設置某個制表位所在的位置。其聲明為:_property int Tab[Byte Index]。第一個制表位為Tab[0],依次類推。

  注:本文的所有例程都在BCB6、WINXP下編譯通過。

3. 按鈕類組件
  
  21)問:在進行Windows程序界面設計中,經常會用到按鈕,在C++Builder中,按鈕一定是通過按鈕組件來實現的嗎?

答:是的,并且C++Builder的按鈕類組件十分豐富。BCB提供了兩類按鈕類組件:一類是執行類按鈕,另一類是信息類按鈕。所謂執行類按鈕是指它們通常用來啟動程序運行的,比如按鈕、位圖按鈕、加速按鈕。而信息類按鈕一般用來獲取信息,包括單選按鈕和復選框。靈活地使用各種按鈕,不僅可以使程序更加豐富多彩,而且可以提高程序的性能。

  22)問:那么按鈕組件有哪些常用的屬性和方法呢?

  答:對于按鈕組件,Caption屬性用來描述按鈕的標題,也就是按鈕上顯示的文本,它與標簽組件很相識,我們同樣可以在這個屬性中為按鈕指定快捷鍵。

  當Cancel屬性值為True時,用戶無論何時按下Esc鍵,都會產生OnClick事件,當窗體上有多個按鈕時,Esc鍵觸發TabOrder值最小的那個按鈕的OnClick事件。它的缺省值為False

  當Default屬性值為true時,用戶無論何時按下Enter鍵時,都會產生OnClick事件,與Cancel屬性不同的是,如果輸入焦點正好在一個按鈕上,那么會產生這個按鈕的OnClick事件。否則,產生TabOrder的值最小的那個按鈕的OnClick事件。它的缺省值為True

  Hint屬性保存著按鈕的提示內容,當用戶把鼠標光標停留在按鈕上時,就會顯示提示信息。

  ShowHint屬性用來確定是否顯示提示文本,缺省值為False。

  按鈕常用的事件就是OnClick事件,OnClick事件在鼠標單擊按鈕時產生,另外,通過快捷鍵、enter鍵和Esc鍵也可以產生OnClick事件,一般情況下,按鈕都需要增加OnClick事件處理程序。

  23)問:那么位圖按鈕又有什么特點呢?

  答:位圖按鈕BitBtn除了可以像普通按鈕那樣顯示文本外,還可以顯示圖形,除了具有一般按鈕所具有的全部屬性外,位圖按鈕還有一個特有的Kind屬性。這個屬性用來設定按鈕為幾種預定義圖形按鈕風格中的哪一種。這是幾種預定義按鈕風格。這些做好的按鈕如下表:
 

Kind屬性值

按鈕外觀

等價屬性設置

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

  當把Kind的屬性值設置為bkCustom時,還可以給位圖按鈕指定其他的圖形,具體的方法是,在對象編輯器中選擇Glyph屬性,然后單擊Value列中的省略號按鈕,這時會出現一個圖形編輯對話框,要求指定位圖的位置。

  單擊Load按鈕,在文件打開對話框中選擇一個位圖文件就可以了。要注意的是,如果選擇的位圖太大,位圖按鈕不會自動調整其尺寸,這時你只能看到一部分的圖形。

  24)問:位圖按鈕組件的NumGlyph屬性有什么作用?

  答:屬性NumGlyph指出位圖按鈕使用的位圖的數目,當你需要位圖按鈕使用多個位圖分別表示按下,彈起等不同狀態時,必須保證這些位圖具有相同的尺寸,并且一個接著一個地水平排列著。

  在C++Builder中,一個位圖按鈕最多可有四個位圖,因此,NumGraph地取值范圍只能是1到4,C++Builder將根據位圖按鈕地狀態確定顯示哪個位圖。

  一般來說,當按鈕未選中時顯示第一個位圖。

  當按鈕不能選擇時,顯示第二個位圖,

  當按鈕被單擊時顯示第三個位圖,

  當用戶釋放鼠標鍵時,又會重新顯示第一個位圖,

  當沒有希望的位圖時,那么所有地狀態都使用第一個位圖。

  25)問:快捷按鈕有哪幾個重要屬性?

  答:快捷按鈕與位圖按鈕很相似,也可以顯示圖像,但也有一些不同之處:快捷按鈕一般都比較小,缺省大小25*25,基本上都是只顯示圖像而不顯示文字,最大差別是,快捷可以保持在按下的狀態,而其它兩類按鈕不能。快捷按鈕一般都是用來制作工具欄按鈕,這時要和Panel配合使用。下面來看一下它的重要屬性:

  AllowAllUp:設置一個組的快捷按鈕是否可以全部處于彈起的狀態。缺省為false,這時可以用來模擬單選按鈕,讓同一個組的總有一個按鈕處在按下狀態。如果一個組中只有一個快捷按鈕,把這個屬性改為true,這時這個按鈕就可以在按下和彈起兩個狀態之間切換,可以用來模擬一個復選按鈕。

  Down:表示按鈕是否按下,若設為true,則處于按下的狀態。

  GroupIndex:用來把幾個這個屬性相同的快捷按鈕編為一組,即相同取值的按鈕為一組。缺省為0,表示這個按鈕不編成組。

  26)問:那么單選按鈕又有什么特點呢?

  答:單選按鈕RadioButton是相互排斥的一種選擇組件,在一組單選按鈕中用戶一次只能選取一個單選按鈕。

  雖然你可以只使用一個單選按鈕,但是那樣單選按鈕也就失去了意義。單選按鈕一般都是成組出現的。

  單選按鈕只有一個比較特殊的屬性Checked,它表示按鈕是否被選中。缺省情況下,Checked的屬性是False,表示按鈕未選中。

  另外單選按鈕也具備Caption屬性,這就意味著它也可以通過快捷鍵來選中。

  單選按鈕在成組使用時有一些特點需要掌握。當你在同一容器(如:Form、Panel、GroupBox等)上直接放置單選按鈕時,這些單選按鈕自成一組,也就是說,無論在容器上放置2個或者幾十個單選按鈕,它們都是一組的,每次只能選中它們中的某一個。

  27)問:如果我想在窗體上放置不止一組按鈕,應該怎么辦?

  答:可以用兩種方法。一種是使用組合框(GroupBox),另一種是使用單選按鈕分組框(RadioGroup)。

  組合框顧名思義就是用來把許多組件組合起來,使窗口變得整齊而有條理,每一組不同的按鈕使用一個組合框。在設計時,首先把組合框放在窗體上,然后再把單選按鈕放在分組框上。要記住的是,放置次序不能顛倒。一旦把單選按鈕放在分組框中,那么這個單選按鈕就屬于這個組合框了,你無法把它從組合框中移走,如果刪除組合框的話,分組框中所有的單選按鈕也會被同時刪除。

  在實際應用中,我們經常使用單選按鈕分組框而不是單選按鈕。因為單選按鈕分組框可以包含多個單選按鈕,而它實際上只是一個組件。這比使用分組框和多個單選按鈕更直觀和簡單。

  28)問:單選按鈕分組框又有哪些特殊的屬性呢?

  答: 單選按鈕分組框有三個屬性是比較特殊的:

  屬性Items是類TStrings的一個對象,這一點與Memo組件中的Lines屬性很相似,但是它們的含義不同,Lines屬性包含Memo組件中顯示的每一行字符串,而Items屬性雖然也包含許多字符串,但是每一個字符串代表單選按鈕組中的一個單選按鈕。

  單擊Items屬性Value列中的省略號按鈕,可以打開一個字符串編輯器,然后在這個編輯器中可以輸入單選按鈕的標題。每個單選按鈕占用一行。

  Columns屬性決定著單選按鈕分組框內分欄的數目,默認是1,最多可以有16欄,即16列。

  ItemIndex屬性為單選分組框中被選中項的序號。-1表示不指向任何一個項。

  29)問:復選按鈕(CheckBox)有什么作用?

  答:復選按鈕與單選按鈕不同,你可以一次選擇多個復選按鈕。復選按鈕有幾個比較重要的屬性。

  Alignment屬性控制復選框標題的位置。

  taRightJustify
  標題出現在復選框的右邊
  
  taLeftJustify
  標題出現在復選框的左邊

  缺省值為taRightJustify。

  AllowGrayed屬性決定復選框是否可以處于灰色的狀態,當屬性值為True時,復選框有三種狀態,選中、未選中、和灰色;當屬性值為False時,復選框只有兩種狀態。缺省值為false。

  Checked屬性確定復選框是否被選中。缺省值為false。

要知道復選框是選中狀態、未選中狀態還是灰色狀態。,可以在運行的時候,用程序讀取運行時態變量State的值,缺省值為cbUnChecked。

  雖然復選框之間并不互相排斥,也就是說,直接放置在窗體上的每一個復選按鈕相互之間都不干擾,但是最好還是把復選框分組使用。這樣做的好處是便于用戶理解。

  30)問: CheckBox、RadioButton如何完成動態改變其按鈕的標題? RadioGroup能動態添加吧?讀取上面三個組件標題又如何做呢?
  答:CheckBox、RadioButton的屬性里有一個Caption,它的屬性值就是按鈕的標題,所以應該說對這兩個組件來說很容易做到的:

  CheckBox1->Caption=”信息”;

  Label1->Caption= CheckBox1->Caption;

  RadioButton與CheckBox一樣,這里就不多說了。

  而RadioGroup里面有一個Items屬性,這在《閑談BCB》中說過這個問題,所以你要添加按鈕,可以用下面的方法:

  RadioGroup1->Items->Add(“我是新來的”);

  讀取可以利用ItemsIndex來完成:

  Label1->Caption=RadioGroup1->Items->Strings[RadioGroup1->ItemIndex];

  String是把選中的序號轉換成你需要的文本,因為Items是Tstring對象,這類情況在你以后的學習中會經常看到的。

  要注意在RadioGroup中也有一個Caption,這是用來給單選分組框設置標題的,這個標題與單選的文字無關。

4.列表類組件
  31)問:當我需要使用多個選項的時候,使用單選按鈕或復選框來進行選擇不是很恰當,因為在窗體上放置大量的按鈕既不利于布局的美觀,又會消耗大量的系統資源,C++Builder有什么解決辦法嗎?

答:可以使用列表框(ListBox、CheckListBox)或組合框(ComboBox)這兩類最常用的列表組件。

  32)問:列表框有那些主要屬性?

  答:列表組件ListBox在缺省情況下,只能進行單項選擇,當屬性MultiSelected為True時,可以進行多項選擇。這時你只要單擊想要的選項,那么這些選項都會被選中。



  Items屬性:列表框中的所有選項都是通過這個屬性來進行訪問的。設置時只要點擊Items右邊的“…”就可以編輯了。

  當屬性ExtendedSelect也等于True時,有兩種方法可以進行多項選擇。一種是單擊選項同時按下Ctrl鍵,這樣可以選中兩個選項之間的所有選項。它的缺省值為False。

  Sorted屬性確定列表框中顯示的內容書否按照字母順序排列。缺省值為False。

  當不允許多項選擇時,我們通過屬性ItemIndex就可以返回被選中的選項。但是,如果打開了多項選擇,那么屬性ItemIndex只返回最后個被選中的選項序號(有些書上也說返回選中選項中具有輸入焦點的選項序號,但我覺得這種說法有點不易讓初學者理解)。

  SelCount屬性在MultiSelected屬性為True時,指出了列表框中被選中項目的個數。當MultiSelected屬性為False時,它的值為-1。

  Selected屬性指出了列表框中的某個項目是否被選中。

  TcheckListBox是從TcustomListBox繼承下來的的,TListBox也是直接從TcustomListBox繼承下來的,因此這兩個組件是兄弟關系,它們的屬性和使用都非常相似。下面來看看它的不同之處:

  AllowGrayed屬性和多選按鈕一樣,當屬性值為True時,則列表框中的選項有三種狀態:選中、未選中和選中但變灰;當屬性值為False時,列表框只有兩種狀態。缺省值為false。

  Checked其聲明為:_property  bool  Checked[int Index];這個屬性用來返回或者設置列表框中的指定選項是否被選中。其中參數Index表示指定的選項的序號。

  32)問:那么,組合框和列表框相比有什么相似之處和不一樣的地方呢?

  答:首先,從外觀上來說,列表框占據了比較大的空間,而組合框只需要一行的空間就可以了。從另一方面來說,組合框還帶有一個編輯框,用戶可以直接在編輯框中輸入文本,組合框在一般情況下只顯示這個編輯框,當用戶單擊組合框右邊的下拉箭頭時,就會顯示一個包含所有選項的下拉列表。
  
  組合框和列表框最大的不同是組合框不能進行多項選擇。

  組合框與列表框有一定的相似之處,就是它們都能夠包含許多的選項。但是組合框還是有不少獨特的屬性。

  33)問:組合框有哪些常用屬性及事件呢?

  答:屬性Style決定著組合框的樣式,C++Builder為組合框定義了五種不同的樣式。

  CsDropDown:這時為一個標準的組合框,由一個編輯框和下拉列表組成。

  CsDropDownList:與標準組合框相似,但不能在編輯框中輸入文本。

  CsSimple:沒有下拉列表的組合框,只是一個編輯框,也就是說只能輸入不能選擇。

  csOwnerDrawFixed和csOwnerDrawVariable這兩種樣式的組合框常用于需要圖像作為項目時,當然你輸入字符串也可以。前面一種樣式組合框中各個項目的高度是固定的,而后面一種樣式的高度可以變化,也就是說,各個項目的高度可以不一樣,此外,在這兩種樣式中,編輯框是不可輸入的。

  Text屬性用來設置或者返回組合框中顯示出來的文本內容。

  當編輯框中的內容發生變化時將觸發OnChange事件。所以在組合框里我們用的就是它。

  注意下面四段兩組語句的區別與聯系:

  //………………第一組

  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];

  }

  我想通過對比,你會明白這些語句的區別與聯系的,什么時候用什么樣的語句,細細品味一下你就會明白了。

  34)問:前面您提到了面板組件,它是一種什么類型的組件?

  答:它是一種容器組件,容器組件是可以包含其他組件的組件,最典型的容器組件就是窗體。其他比較常用的容器組件有面板(Panel)、組合框(GroupBox)。

  面板組件可以容納其他組件。任何放置在面板上的組件都會成為面板的子組件,當你刪除面板組件時,放置在面板上的其他組件也同時被刪除了,這是容器組件的共同特點。

  面板組件沒有什么特別的屬性,只有BevelInner(面板內部斜面),BevelOuter(面板外部斜面),BevelWidth(斜面寬度,單位像素),BorderStyle(邊界風格)和BorderWidth(邊界寬度)幾個屬性有一些特點。這些屬性的任意組合可以生成各種效果的邊框。你可以設置這幾個屬性的值,可以得到不同的面板效果。

  其中BevelInner(面板內部斜面),BevelOuter(面板外部斜面)的屬性值是一樣的:bvNone(缺省值)表示沒有斜面;

  bvLowered表示為沉降的斜面;

  bvRaised表示為上升的斜面。

  組合框(GroupBox)屬性中你只要設置好Caption就可以了,它是標題的名稱,表示此組合框類別、功能、選項等。GroupBox1為默認名稱。

  5.特殊的輸入控制類組件
  35)問:C++Builder有哪些輸入控制類組件?

  答:C++Builder輸入控制類組件主要包括滾動條(ScrollBar)、軌跡條(TrackBar)、進程條(ProgressBar)以及加減組件UpDown,它們都可以實現邊續范圍內數值的選擇。

  36)問:滾動條主要用在什么地方,它又有哪些常用屬性呢?

  答:滾動條是常見的組件,它經常出現在列表框、Memo等組件中。這時,它是作為這些組件的一部分而存在的。其實滾動條還可以單獨使用,單獨使用時,滾動條一般用來控制連續的數值輸入。象調節音量等,都可以使用滾動條輸入。

  滾動條有這樣一些常用屬性

  1.Position:這個屬性用來設置或者返回當前流動條中滑塊的位置。屬性Max,Min,用來設置滾動條可以滾動的最大或最小位置。當Position等于Max時,滾動塊位于滾動條的最右端;當Position等于Min時,滾動塊位于滾動條的最左端。當Position等于Max和Min之間的某一個值時,滾動塊位于滾動條中間的某個位置。

  2.屬性Kind。屬性Kind有兩個可能的取值:sbHorizontal(缺省值)和sbVertical,分別表示水平滾動條和垂直滾動條。

  3.屬性SmallChange決定當用戶單擊滾動條兩端的箭頭按鈕時滾動塊移動的距離。

  4.屬性LargeChange確定當用戶單擊滾動塊兩邊的空白或按下PgUp和PgDn鍵時,滾動塊移動的距離。屬性LargeChange和SmallChange的取值范圍是1到32767。


 37)問:滾動條能夠響應哪些常用事件呢?

  答:滾動條的常用事件是OnChange,只要屬性Position的值發生改變都會產生這個事件。一般情況下,了解滾動條的這個屬性就可以了。

  但是有時候可能需要更詳細地了解用戶單擊了滾動條的哪個位置,這時就需要響應OnScroll事件,其聲明為:-_property TScrollEvent OnScroll;其中TscrollEvent的聲明為:typedef void fastcall (closuer TScrollEvent)(System::Tobject Sender,TscrollCode ScrollCode,int &ScrollPos); OnScroll事件處理程序帶有三個參數:

  其中參數Sender指出了是哪個對象發送了這個消息,參數ScrollPos指出了滾動塊的位置,參數ScrollCode返回滾動條的狀態,這些狀態是用這樣一些參數值表示的,

  scLineUp
  表示用戶單擊了滾動條左端的箭頭按鈕(水平滾動條)或上端的箭頭按鈕(垂直滾動條)。
  
  scLineDown
  表示用戶單擊了滾動條右端的(水平滾動條)或下端的箭頭按鈕(垂直滾動條)。
  
  scPageUp
  表示用戶單擊了滾動塊左邊(水平滾動條)或上邊(垂直滾動條)的區域。
  
  scPageDown
  表示用戶單擊了滾動塊右邊(水平滾動條)或下邊(垂直滾動條)的區域。
  
  scPosition
  表示用戶移動了滾動條但是已經釋放了。
  
  scTrack
  表示用戶正在移動滾動塊。
  
  scTop
  表示用戶把滾動塊移動到了滾動條的左端(水平滾動條)或頂端(垂直滾動條)。
  
  scBottom
  表示用戶把滾動塊移動到了滾動條的右端(水平滾動條)或下端(垂直滾動條)。
  
  scEndScroll
  表示用戶結束了移動滾動塊的操作,釋放了鼠標或者鍵盤按鍵。

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            午夜精品视频在线观看| 亚洲激情图片小说视频| 亚洲黄色片网站| 国产精品美女久久久久久久| 亚洲一区二区三区午夜| 久久精品视频亚洲| 久久久高清一区二区三区| 欧美在线www| 久久香蕉国产线看观看av| 久久精品日韩一区二区三区| 久久婷婷激情| 亚洲第一精品夜夜躁人人爽| 亚洲人成在线播放网站岛国| 亚洲图片在线| 久久永久免费| 欧美日韩亚洲高清| 国产欧美精品一区二区三区介绍| 亚洲一区久久久| 午夜国产不卡在线观看视频| 久久精品国产第一区二区三区最新章节 | 久久久国产精品一区二区三区| 欧美不卡在线| 国产精品亚洲成人| 亚洲国产精品一区二区www在线| 亚洲美女网站| 久久久久久高潮国产精品视| 亚洲高清网站| 欧美一区二区视频在线观看| 欧美成人四级电影| 国产精自产拍久久久久久蜜| 亚洲高清激情| 久久国产手机看片| 亚洲国产日韩一区| 欧美亚洲色图校园春色| 午夜欧美电影在线观看| 久久精品视频一| 国产精品黄色| 亚洲三级毛片| 久久影视三级福利片| 在线亚洲一区| 欧美日本二区| 国产精品电影网站| 亚洲图片你懂的| 欧美电影免费网站| 国产一区二区三区久久久久久久久 | 亚洲成色最大综合在线| 亚洲视频一区二区在线观看| 午夜视频在线观看一区二区| 免费亚洲电影| 欧美一区中文字幕| 欧美午夜电影一区| 亚洲精品女av网站| 欧美a级片网站| 欧美一区二区三区在线| 国产精品国产三级欧美二区| 99xxxx成人网| 欧美超级免费视 在线| 亚洲欧美中文日韩在线| 欧美视频网址| 在线综合+亚洲+欧美中文字幕| 麻豆91精品91久久久的内涵| 性久久久久久久久| 国产伦精品一区二区三区照片91| 亚洲视频免费| 日韩午夜黄色| 欧美日韩亚洲一区二区三区四区| 99精品热视频只有精品10| 亚洲电影在线| 国产精品欧美久久久久无广告| 亚洲欧美日韩网| 国产精品一区二区三区免费观看| 亚洲在线中文字幕| 亚洲一区三区视频在线观看| 国产精品久久九九| 欧美亚洲日本国产| 午夜精品福利一区二区三区av| 国产欧美日韩高清| 久久影院午夜片一区| 久久先锋影音av| 亚洲精品一区二区三区av| 亚洲精品视频在线看| 欧美体内谢she精2性欧美| 亚洲图片欧美一区| 99视频精品免费观看| 国产精品自拍小视频| 久久精品国产欧美亚洲人人爽| 久久久久久久久一区二区| 亚洲人成网站999久久久综合| 亚洲人成久久| 国产精品欧美激情| 老司机精品福利视频| 欧美成人首页| 欧美一区亚洲二区| 久久亚洲综合| 亚洲一区二区伦理| 久久爱www.| 亚洲精品一区二区三区蜜桃久| 久久久久久夜精品精品免费| 欧美理论电影在线观看| 亚洲女与黑人做爰| 久久精品首页| 在线视频欧美日韩| 欧美在线中文字幕| 99国产一区二区三精品乱码| 亚洲欧美中日韩| 亚洲人成网站色ww在线| 亚洲天堂男人| 国产精品女主播一区二区三区| 性欧美8khd高清极品| 免费一级欧美片在线播放| 午夜免费在线观看精品视频| 久久先锋影音| 亚洲一区二区三区高清| 久久先锋资源| 久久精品国产亚洲精品| 欧美—级高清免费播放| 欧美一区二区在线播放| 欧美极品aⅴ影院| 免费成人高清视频| 国产精品二区三区四区| 亚洲黄色免费电影| 国模套图日韩精品一区二区| 一本久久a久久免费精品不卡| 久久大逼视频| 亚洲性视频h| 欧美国产亚洲另类动漫| 久热精品在线视频| 国产日韩欧美精品综合| 一本一本久久a久久精品综合妖精| 亚洲国产成人精品久久| 欧美一级二区| 午夜视频一区| 国产精品日韩精品欧美精品| 亚洲欧洲三级| 日韩视频不卡中文| 欧美国产1区2区| 欧美成人免费一级人片100| 国产曰批免费观看久久久| 亚洲欧美中文日韩在线| 久久黄色级2电影| 国产日韩欧美在线| 性欧美长视频| 久久精品国产综合精品| 国产亚洲欧美日韩精品| 午夜精品久久久久久久男人的天堂| 亚洲欧美一区在线| 国产精品伦理| 午夜欧美视频| 一本久道久久综合中文字幕| 欧美大片在线观看一区| 亚洲激情小视频| 99视频在线精品国自产拍免费观看| 欧美激情bt| 99视频精品在线| 亚洲欧美福利一区二区| 国产九色精品成人porny| 欧美一区二区三区的| 久久国产精彩视频| 激情视频一区| 欧美大尺度在线| 亚洲青涩在线| 午夜精品影院在线观看| 国产日韩av高清| 亚洲主播在线| 亚洲国产精品成人| 欧美成人按摩| 亚洲欧洲日韩在线| 欧美日韩成人综合在线一区二区| 欧美激情无毛| 一区二区三区产品免费精品久久75| 欧美日韩国产在线| 亚洲在线视频观看| 美女网站久久| 亚洲一级在线观看| 国产综合色精品一区二区三区| 免费观看亚洲视频大全| 中文在线资源观看视频网站免费不卡| 欧美亚洲在线| 亚洲人久久久| 国产日韩欧美黄色| 欧美va天堂在线| 亚洲欧美日韩精品久久亚洲区 | 99精品视频一区| 国产精品高潮呻吟视频| 久久久久久久久久久久久久一区| 亚洲精品一区中文| 久久久久高清| 亚洲一区免费网站| 亚洲高清视频在线| 国产精品亚洲美女av网站| 欧美成人亚洲成人| 久久精品99久久香蕉国产色戒| 日韩午夜精品视频| 亚洲国产日韩精品| 亚洲电影自拍| 亚洲激情黄色| 国内外成人免费激情在线视频| 欧美日韩精品一区二区三区| 久久久噜噜噜久久中文字免| 亚洲一区日韩在线|