一直以來都想寫一點為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++技術專題專題,或