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

BCB 動態建立 VCL 控制項與自訂元件類別完整指南

     編輯:VC 教學

核心步驟四部曲

在 C++Builder 中動態建立控制項(無論是內建或繼承類別),只需遵循固定流程:

  1. 定義類別(可選,繼承既有 VCL 類別)
  2. 宣告指標成員於視窗類別中
  3. 建構函數中 new 實例,指定 Owner
  4. 設定 Parent 屬性納入視覺樹

完整程式碼範例:自訂 TMemoEx 並動態建立

1. 類別定義 (MemoEx.h)

#ifndef MemoExH
#define MemoExH
#include 
#include 

class TMemoEx : public TMemo {
public:
    __fastcall TMemoEx(TComponent* Owner);
    // 可在此擴充自訂屬性/方法/事件
    void __fastcall AppendTimestamp();
};
#endif

2. 類別實作 (MemoEx.cpp)

#include 
#pragma hdrstop
#include "MemoEx.h"

__fastcall TMemoEx::TMemoEx(TComponent* Owner) : TMemo(Owner) {
    // 建構時可預設屬性
    Font->Name = "Consolas";
    Font->Size = 10;
    Color = clInfoBk;
}

void __fastcall TMemoEx::AppendTimestamp() {
    Lines->Add(FormatDateTime("yyyy-mm-dd hh:nn:ss", Now()));
}

3. 主視窗宣告與建立 (MainForm.h/.cpp)

// MainForm.h
#include "MemoEx.h"
class TForm1 : public TForm {
__published:
    // IDE 管理元件...
private:
    TMemoEx* MemoEx; // 指標成員
public:
    __fastcall TForm1(TComponent* Owner);
};

// MainForm.cpp
#include 
#pragma hdrstop
#include "MainForm.h"
#pragma package(smart_init)
#pragma resource "*.dfm"

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
    // 動態建立於 FormShow 或建構函數中
    MemoEx = new TMemoEx(this);     // 1. Owner = this,自動釋放
    MemoEx->Parent = this;          // 2. 關鍵:加入視覺父層
    MemoEx->Left = 10;
    MemoEx->Top  = 10;
    MemoEx->Width = 300;
    MemoEx->Height = 200;
    MemoEx->Align = alClient;       // 選填:自動填滿客戶區
    MemoEx->Visible = true;         // 預設 true,可省略
}

關鍵細節解析

步驟代碼作用常見錯誤
建立實例new TMemoEx(this)Owner 設為視窗,視窗銷毀時自動 delete傳 NULL 導致記憶體洩漏
設定 ParentMemoEx->Parent = this納入視覺樹,處理繪製/訊息/Tab 順序忘記此行 → 控制項不顯示但編譯通過
設定幾何屬性Left/Top/Width/Height/Align決定位置大小未設定 → 位置 (0,0) 大小 (0,0) 不可見
事件綁定MemoEx->OnChange = MemoExChange動態掛載事件處理函數函數簽名必須符合 VCL 事件類型

進階:完全在執行期建立無 DFM 視窗

// 獨立函數建立帶自訂控制項的視窗
TForm* CreateDynamicForm() {
    TForm* frm = new TForm(Application);
    frm->Caption = "Dynamic Form";
    frm->Position = poScreenCenter;

    TButton* btn = new TButton(frm);
    btn->Parent = frm;
    btn->Caption = "Click Me";
    btn->SetBounds(50, 50, 100, 30);
    btn->OnClick = [](TObject* Sender) {
        ShowMessage("Dynamic Button Clicked!");
    };
    return frm; // 呼叫端負責 ShowModal / 釋放
}

總結

動態建立 VCL 控制項的核心口訣:「Owner 管理生命,Parent 管顯示,幾何定位置,事件加行為」。掌握此模式,即可在執行期靈活構建複雜介面、實現插件化 UI、減少 DFM 檔案耦合。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved