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

C++Builder 實現控制項陣列功能:TList 動態管理異構控制項集合

     編輯:關於C++

VB 的控制項陣列提供共享事件處理、動態建立、群組管理三大優勢。C++Builder 雖無原生控制項陣列,但 TList 配合動態建立即可實現更靈活的異構控制項集合管理。本文展示完整實作範例。

核心設計

  • 使用 TList 儲存控制項指標 (void*),支援任意型別混合
  • 動態 new 建立控制項,設定 Parent、位置、屬性
  • 加入 TList 統一管理
  • 使用時 強制轉型 回具體型別存取屬性/方法

完整範例:建立 8 個 TEdit + 4 個 TImage 控制項陣列

1. 表單宣告 (Unit1.h)


class TForm1 : public TForm {
__published:
    TPanel *Panel1, *Panel2;
    TButton *Button1, *Button2, *Button3, *Button4;
private:
    TList *MyVCL;  // 控制項集合
public:
    __fastcall TForm1(TComponent* Owner);
    virtual __fastcall ~TForm1();
};

2. 生命週期管理


void __fastcall TForm1::FormCreate(TObject *Sender) {
    MyVCL = new TList;
}

__fastcall TForm1::~TForm1() {
    delete MyVCL;  // 僅釋放 List 容器,控制項由 Owner (Form) 自動釋放
}

3. 動態建立控制項陣列 (Button1:「建立控制項陣列」)


void __fastcall TForm1::Button1Click(TObject *Sender) {
    int top = 5;
    for (int i = 0; i < 4; i++) {
        // TEdit: 序號
        TEdit *editNo = new TEdit(this);
        editNo->Parent = Panel1;
        editNo->Text = IntToStr(i);
        editNo->ReadOnly = true;
        editNo->SetBounds(10, top, 24, 24);
        MyVCL->Add(editNo);

        // TImage: 狀態圖示
        TImage *img = new TImage(this);
        img->Parent = Panel1;
        img->Picture->LoadFromFile("None.BMP");
        img->SetBounds(editNo->Left + editNo->Width, top, 24, 24);
        MyVCL->Add(img);

        // TEdit: 狀態文字
        TEdit *editStatus = new TEdit(this);
        editStatus->Parent = Panel1;
        editStatus->Font->Name = "Arial";
        editStatus->Font->Size = 12;
        editStatus->Text = "禁止存取";
        editStatus->ReadOnly = true;
        editStatus->SetBounds(img->Left + img->Width, top, 80, 24);
        MyVCL->Add(editStatus);

        top += 24 + 5;  // 下一行
    }
    Button1->Enabled = false;
    Button2->Enabled = true;
}

4. 批次操作:移動 TImage 到 Panel2 (Button2:「改變控制項位置」)


void __fastcall TForm1::Button2Click(TObject *Sender) {
    for (int i = 0; i < 4; i++) {
        // 每組 3 個控制項,索引 1 為 TImage
        TImage *img = dynamic_cast(MyVCL->Items[i * 3 + 1]);
        if (img) img->Parent = Panel2;
    }
    Button2->Enabled = false;
    Button3->Enabled = true;
}

5. 還原 (Button3:「還原到原位置」)


void __fastcall TForm1::Button3Click(TObject *Sender) {
    for (int i = 0; i < 4; i++) {
        TImage *img = dynamic_cast(MyVCL->Items[i * 3 + 1]);
        if (img) img->Parent = Panel1;
    }
    Button3->Enabled = false;
    Button2->Enabled = true;
}

關鍵技術要點

進階擴展方向

  • 封裝為 TComponentArray 模板類,提供型別安全介面
  • 加入 Tag 索引映射 std::map,支援邏輯 ID 查找
  • 實作 ForEach 訪問者模式,統一批次操作
  • 支援框架式佈局 (如 TFlowPanel) 自動定位

以 TList 實現控制項集合管理,不僅補足 VB 控制項陣列功能,更因異構支援、動態靈活、型別擴展性,成為 C++Builder 動態 UI 建構的標準模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
技術點說明
異構支援TList 存 void*,可混合任意 TControl 衍生類
強制轉型使用 dynamic_cast 或 C 風格轉型 (TImage*),建議前者安全
索引規律依建立順序固定索引,或用 Tag 屬性標記邏輯 ID
事件共享不同型別控制項可指向同一事件處理函數 (Object Inspector 設定)
動態增減Add/Delete/Insert/Remove 隨時調整集合
記憶體管理控制項 Owner = Form,Form 銷毀時自動釋放,TList 僅管指標