VB 的控制項陣列提供共享事件處理、動態建立、群組管理三大優勢。C++Builder 雖無原生控制項陣列,但 TList 配合動態建立即可實現更靈活的異構控制項集合管理。本文展示完整實作範例。
TList 儲存控制項指標 (void*),支援任意型別混合new 建立控制項,設定 Parent、位置、屬性TList 統一管理
class TForm1 : public TForm {
__published:
TPanel *Panel1, *Panel2;
TButton *Button1, *Button2, *Button3, *Button4;
private:
TList *MyVCL; // 控制項集合
public:
__fastcall TForm1(TComponent* Owner);
virtual __fastcall ~TForm1();
};
void __fastcall TForm1::FormCreate(TObject *Sender) {
MyVCL = new TList;
}
__fastcall TForm1::~TForm1() {
delete MyVCL; // 僅釋放 List 容器,控制項由 Owner (Form) 自動釋放
}
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;
}
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;
}
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;
}
| 技術點 | 說明 |
|---|---|
| 異構支援 | TList 存 void*,可混合任意 TControl 衍生類 |
| 強制轉型 | 使用 dynamic_cast 或 C 風格轉型 (TImage*),建議前者安全 |
| 索引規律 | 依建立順序固定索引,或用 Tag 屬性標記邏輯 ID |
| 事件共享 | 不同型別控制項可指向同一事件處理函數 (Object Inspector 設定) |
| 動態增減 | Add/Delete/Insert/Remove 隨時調整集合 |
| 記憶體管理 | 控制項 Owner = Form,Form 銷毀時自動釋放,TList 僅管指標 |