C++ Builder 參考手冊 ? 枚舉窗口內(nèi)所有的控件
- 枚舉窗口內(nèi)所有的控件的方法
枚舉所有的控件顯示在 Memo1 里面
枚舉所有的控件顯示在樹形結(jié)構(gòu)里面
窗口上所有的編輯框都清空
枚舉窗口內(nèi)所有的控件的方法
從 TWinControl 繼承過來的控件可以當(dāng)作容器控件嗦锐,例如 TPanel轮锥、TGroupBox 和 TScrollBox 等,窗口 TForm 也是從 TWinControl 繼承過來的邻耕,所以只要可以枚舉 TWinControl 里面的控件,就可以做一個(gè)通用的枚舉控件的函數(shù)。
TWinControl 類里面的 ControlCount 屬性是這個(gè)容器控件或窗口里面有多少個(gè)控件科盛,Controls[i] 是第 i 個(gè)控件,是 TControl 類型的菜皂。
TControl 是所有的控件都共有的父類贞绵,這個(gè)類的 Name 屬性是控件的名稱,例如 Edit1恍飘,Button1 或 Memo1 等榨崩,如果改成其他名字,這里看到的是改名之后的名稱章母;這個(gè)類的 ClassName() 方法可以得到控件的類名母蛛,例如 TEdit,TButton 或 TMemo 等乳怎。
枚舉到的 TControl 可以通過 dynamic_cast 類型轉(zhuǎn)換到對應(yīng)的類型彩郊,同時(shí)可以判斷是否是這個(gè)類型的控件,如果是 TWinControl 說明這個(gè)控件可能是容器控件,遞歸調(diào)用枚舉控件函數(shù)可以得到這個(gè)容器內(nèi)的其他控件秫逝。
例1. 枚舉所有的控件顯示在 Memo1 里面
void TForm1::EnumAllControls(TWinControl *pWinCtrl)
{
int iCtrlCount = pWinCtrl->ControlCount; // pWinCtrl 里面的控件個(gè)數(shù)
for(int i = 0; i < iCtrlCount; i++)
{
TControl *pControl = pWinCtrl->Controls[i]; // pWinCtrl 里面的第 i 個(gè)控件
Memo1->Lines->Add(pControl->Name + L": " + pControl->ClassName());
TWinControl *pwc = dynamic_cast<TWinControl *>(pControl); // 這個(gè)控件是不是容器恕出?
if(pwc) // 如果這個(gè)控件是容器
{
EnumAllControls(pwc); // 遞歸顯示這個(gè)容器控件里面的控件
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
EnumAllControls(this); // 顯示 this 里面所有的控件
}
//---------------------------------------------------------------------------
運(yùn)行結(jié)果:
例2. 枚舉所有的控件顯示在樹形結(jié)構(gòu)里面
void TForm1::EnumAllControls1(TWinControl *pWinCtrl, TTreeNode *pTreeNode)
{
int iCtrlCount = pWinCtrl->ControlCount; // pWinCtrl 里面的控件個(gè)數(shù)
for(int i = 0; i < iCtrlCount; i++)
{
TControl *pControl = pWinCtrl->Controls[i]; // pWinCtrl 里面的第 i 個(gè)控件
TTreeNode *pNode = TreeView1->Items->AddChild(pTreeNode, pControl->Name);
TWinControl *pwc = dynamic_cast<TWinControl *>(pControl); // 這個(gè)控件是不是容器?
if(pwc) // 如果這個(gè)控件是容器
{
EnumAllControls1(pwc, pNode); // 遞歸顯示這個(gè)容器控件里面的控件
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
EnumAllControls1(this, NULL);
}
例3. 窗口上所有的編輯框都清空
void TForm1::ClearAllEdits(TWinControl *pWinCtrl)
{
int iCtrlCount = pWinCtrl->ControlCount; // pWinCtrl 里面的控件個(gè)數(shù)
for(int i = 0; i < iCtrlCount; i++)
{
TControl *pControl = pWinCtrl->Controls[i]; // pWinCtrl 里面的第 i 個(gè)控件
TEdit *pEdit = dynamic_cast<TEdit *>(pControl); // 這個(gè)控件是不是 TEdit 編輯框
if(pEdit) // 這個(gè)控件是 TEdit 編輯框
{
pEdit->Clear(); // 清空編輯框
}
TWinControl *pwc = dynamic_cast<TWinControl *>(pControl); // 這個(gè)控件是不是容器违帆?
if(pwc) // 如果這個(gè)控件是容器
{
ClearAllEdits(pwc); // 遞歸顯示這個(gè)容器控件里面的控件
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
ClearAllEdits(this);
}
//---------------------------------------------------------------------------
運(yùn)行結(jié)果:點(diǎn)擊 Button3 之前編輯框里面都有內(nèi)容浙巫,點(diǎn)擊 Button3 之后清空所有的編輯框。
相關(guān):
C++ Builder 參考手冊 ? 枚舉窗口內(nèi)所有的控件