首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ Builder 動態建立元件完整教學:從記憶體模型到實戰範例

     編輯:關於C++

記憶體基礎:堆疊 vs 堆

  • 堆疊:LIFO、分配極快、自動回收、空間小 (~2MB)、存區域變數與呼叫資訊
  • 堆:malloc/new 分配、較慢但靈活、空間大、手動釋放 (free/delete)、存遞迴結構/長字串

Object Pascal (Delphi/VCL) 物件只能建構於堆,不像 C++ 可置於堆疊、資料段、堆三處。因此 VCL 元件必須用 new 動態建立。

動態建立元件四步驟法

// 1. 取得記憶體空間
TButton *myBtn = new TButton(Form1);  // 參數為 Owner (負責釋放)

// 2. 指定父容器 (關鍵!否則不會顯示)
myBtn->Parent = Form1;

// 3. 設定幾何屬性 (位置與大小)
myBtn->Top = 200;
myBtn->Left = 200;
myBtn->Height = 25;
myBtn->Width = 75;

// 4. 設定其他重要屬性
myBtn->Caption = "I'm Button!";
// Visible 預設 true,通常可省略

順序不可顛倒:Parent 必須在幾何屬性之前設定,否則座標系統錯誤。

完整實戰範例:按鈕點擊動態生成按鈕

void __fastcall TForm1::Button1Click(TObject *Sender) {
    TButton *myBtn = new TButton(Form1);
    myBtn->Parent = Form1;
    myBtn->Top = 200;
    myBtn->Left = 200;
    myBtn->Height = 25;
    myBtn->Width = 75;
    myBtn->Caption = "I'm Button!";
}

非標準元件的額外處理

動態建立第三方元件 (如 QuickReport) 需包含對應標頭:

#include "Qrctrls.hpp"
#include "QuickRpt.hpp"  // 若仍有問題再加入

BCB 特有問題與因應

  • 編譯時通過、執行時失敗:記憶體管理或硬體衝突,嘗試「登出重登」或重開機
  • 第一次成功、第二次失敗:同樣嘗試重啟 IDE/系統
  • Owner 參數選擇:Form1 (表單)、this (當前物件)、NULL (手動管理) —— 推薦用表單/父容器,利用 Ownership 機制自動釋放

進階:動態建立容器與子元件

// 動態建立 Panel 並在其中放入元件
TPanel *pnl = new TPanel(Form1);
pnl->Parent = Form1;
pnl->Top = 100; pnl->Left = 100; pnl->Width = 300; pnl->Height = 200;

TEdit *edt = new TEdit(pnl);  // Owner = Panel
edt->Parent = pnl;            // Parent = Panel
edt->Top = 10; edt->Left = 10;

記憶體管理最佳實務

  • 善用 Owner 機制:表單銷毀時自動釋放所擁有元件
  • 需手動釋放時:delete component; (會自動從 Owner 移除)
  • 避免循環參考:Parent 與 Owner 概念不同,勿混淆
  • 大量動態元件考慮 TComponentList 或智慧指標管理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved