BCB中實現動態建立元件 (轉)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- BCB動態生成控制元件控制元件
- aspx頁面中動態建立控制元件 (轉)控制元件
- 在BCB中使用向量實現控制元件陣列 (轉)控制元件陣列
- BCB:TEdit控制元件右對齊的簡單實現 (轉)控制元件
- Oracle元件實現動態Web資料庫(轉)Oracle元件Web資料庫
- vue 動態建立元件(執行時建立元件)Vue元件
- 在BCB中輕鬆使用ActiveX控制元件 (轉)控制元件
- BCB 窗體透明控制元件 (轉)控制元件
- 在BCB中陣列的妙用和紀錄和改變控制元件的狀態 (轉)陣列控制元件
- Angular動態建立元件之PortalsAngular元件
- 利用OnHelp( )在BCB中實現上下文敏感的html help (轉)HTML
- BCB中用Sender引數實現程式碼重用 (轉)
- MFC動態建立控制元件的訊息處理 (轉)控制元件
- 在 BCB5 中實現永久刪除資料表記錄 (轉)
- 在VB中實現窗體的動態效果 (轉)
- 用BCB在windows桌面建立快捷方式 (轉)Windows
- BCB中用Sender實現程式碼重用(糾正篇) (轉)
- 在VC中,讓動態建立的ActiveX控制元件響應Windows訊息。 (轉)控制元件Windows
- 利用動態建立自動化介面實現VB的函式指標呼叫 (轉)函式指標
- 動態移動控制元件 (轉)控制元件
- 元件能否支援動態建立庫及表元件
- 在VB6.0中實現動態統計報表 (轉)
- 使用iptable實現動態防火牆(轉)防火牆
- C#動態建立介面的實現例項物件C#物件
- 【react】實現動態表單中巢狀動態表單React巢狀
- 菜鳥學SSH(十八)——Hibernate動態模型+JRebel實現動態建立表模型
- 用 PHP 動態建立 Flash 動畫 (轉)PHP動畫
- SQL 如何實現動態的行列轉置SQL
- webwork下面如何實現動態轉發Web
- 運用反射實現ejb動態委派 (轉)反射
- 實現控制元件的移動、改變大小(DELPHI實現) (轉)控制元件
- BCB高手進階 (十)用Sender引數實現程式碼重用 (轉)
- vue 實現tab切換動態載入不同的元件Vue元件
- 如何在iView中動態建立表格View
- Java中動態規則的實現方式Java
- React Native 中實現動態匯入React Native
- WTL中動態選單的實現薦
- ASP.NET動態建立圖象 (轉)ASP.NET