BCB中實現動態建立元件 (轉)

worldblog發表於2008-01-22
BCB中實現動態建立元件 (轉)[@more@]  (僅供CSDN使用,其他使用者請與作者聯絡)

BCB中提供了大量的VCL,有時難免要在中動態建立元件,VCL是用 Pascal寫的,她與C++語言還是存在著一些不同點的,要掌握正確的方法,不防我們先來看一下棧(stack)與堆(heap)的關係。:namespace prefix = o ns = "urn:schemas--com::office" />

棧(stack)是存放的所有動態區域性變數及函式和返回的有關資訊的一塊。棧的記憶體管理嚴格遵循先進後出的順序,這一點正是實現函式呼叫所需要的。從棧中分配記憶體特別高。資料使用棧中的記憶體(如動態區域性變數)比使用堆中記憶體會使程式執行更快。

堆(heap)是供malloc()、calloc()、realloc()和new等函式獲取記憶體空間的一塊記憶體。從堆中獲取記憶體比從棧中要慢得多,但堆的記憶體管理卻比棧靈活得多,任何時候你都可以從堆中獲取(或釋放)記憶體,我們可以按任意順序進行。用來存放遞迴資料結構的記憶體幾乎都要從堆中獲取。用來存放字串的記憶體通常也從堆中獲取,尤其是對那些在程式執行時可能出現的很長的字串。

從堆中獲取的記憶體要用free()、delete來釋放,它本身不會自動釋放。

C編譯的程式能產生如此優質的程式碼、程式執行的與對棧的正確運用是有關的,但Object Pascal中所有的物件都只能建構於堆中,無法和C++一樣,能夠在棧(在函式內建立類的物件)、資料區段(在函式外建立類的物件)、堆(用new等函式來建立類的物件)三種地方建立物件,所以VCL類的物件我們只能在堆中建立。

如建立一個按鈕物件,我們可以這樣來建立:

TButton *btnMy= new Tbutton(From1);

可以寫成如下程式:類名  *物件名=new 類名(…);

注意:()裡面可以是你已建立的該類物件的父類名字、工程的名字、NULL或this。但最好是物件的父類名。

例:動態生成按鈕

我們先在窗體(Form1)上,放一個按鈕Button1,在他的單擊事件中寫上如下程式碼:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

  TButton *my=new TButton(Form1);

  my->Parent=Form1;//最為關鍵的一句,否則你將看不到什麼,但編譯卻是正確的

  my->Top=200;

  my->Left=200;

  my->Height=25;

  my->Width=75;

  my->Caption="I'm Button!";

  //my->Visible=true;此語句可有可無,因為他的父類通常預設他可見

}

透過這個例子我們應該清楚的看出動態建立元件的幾個重要步驟:

1)要一個空間(記憶體);// TButton *my=new TButton(Form1);

2)指定其父元件,說直接了就是我們要建立的這個物件要放在那個容器上;//  my->Parent=Form1;

3)指定元件要出現在父類的那個位置;//my->Top=200;my->Left=200;my->Height=25; my->Width=75;所以這個屬性你一定要設定好位置;

4)其它重要屬性。// my->Caption="I'm Button!";

並且其順序不能反了,否則你的程式會出的。

在動態生成非寶蘭VCL原有的元件時要加上對應的頭。如,我們要動態生成報表元件一定要加入:

#include  “Qrctrls.hpp”//若還有問題,你還要加入:

#include “QuickRpt.hpp”

另外由於BCB對記憶體管理或與、的衝突,你的動態建立程式也許一點錯誤都沒有,但就是編譯不了;有時也許第一次透過了,第二次一樣的程式卻透過不了,出現這樣那樣的提示,最簡單的辦法就是登出一下系統,再試一下,多數就能解決了。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998123/,如需轉載,請註明出處,否則將追究法律責任。

相關文章