程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ Builder 初學問與答(一)

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

編輯:C++入門知識
  一直以來都想寫一點為BCB初學者快速入門的東西,前不久寫了幾篇《閒談BCB》想把自己學習BCB中如何來解決難點的方法說給大家,沒想到被罵得不成樣子。 <!-- frame contents --> <!-- /frame contents --> 本想不寫了,但覺得這些東西留下來能做什麼呢?還是用另一種方法來重新演譯我的思維吧,最近有些忙,那幾篇沒有寫完的文章,我也會盡快寫完的,至於《深入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。
  
  
  

   更多內容請看C/C++技術專題專題,或
  2)問: Windows窗體有很多樣式,比如對話框,彈出窗口。假如我要控制窗體的邊界樣式,應該怎麼辦?  答:屬性BorderStyle可以指定窗體邊界的外觀和行為。它一共有六種可能的取值。 <!-- frame contents --> <!-- /frame contents -->   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父窗口。
  
  
  

   更多內容請看C/C++技術專題專題,或
  
  fsStayOnTop
  表示窗體始終保持在窗體所屬工程中其它窗體的上面,除非還有別的窗體的FormStyle屬性也被設置成了fsStayOnTop。  要非凡注重的是,在程序運行期間不要修改窗體的FormStyle屬性。 <!-- frame contents --> <!-- /frame contents -->   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。
  
  
  

   更多內容請看C/C++技術專題專題,或   選擇“ProjectOptions…”菜單項,將會彈出一個如圖所示的對話框。  在這裡我們可以通過下拉框選擇主窗體(Main form),在左側的Auto-create forms裡列出了所有的窗口,這裡面的窗口通常是動態創建,你可以把需要動態創建的窗口(Available forms)通過中間的那四個按鈕調到右側,然後OK就可以了。  動態的創建的方法如下:
  void _fastcall TForm1::Button1Click(TObject *Sender){   Tform2 *Forms;   try   {Form2=new TForm2(Application);//動態創建Form2Form2->ShowModal();delete Form2;//把Form2釋放   }   catch(Exception &exception)   {delete Form2;Application->ShowException(&exception);}}
   
  
  
  

   更多內容請看C/C++技術專題專題,或   要注重一般你可能不喜歡用上面的那種形式,而寫成如下格式:
  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)問中那樣來做}
  
  
  

   更多內容請看C/C++技術專題專題,或   此時窗體並沒有關閉,而是最小化了,因此要在子窗體的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。
  
  
  
  

   更多內容請看C/C++技術專題專題,或
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved