这是很简单枚举窗体组件
for (int i=0;i<ComponentCount;i++)
{
ShowMessage(Components[i]->Name);
//.....
}
但如果我想列举仅位于面板的组件一样的东西不起作用。
for (int i=0;i<Panel1->ComponentCount;i++)
{
ShowMessage(Panel1->Components[i]->Name);
//.....
}
因为
Panel1->ComponentCount;
仅仅是零,而对面板几个组件。 所以,我怎么能列举面板的子组件?
该ComponentCount
和Components[]
有设置为自己的组件组成部分-属性拥有访问组件的组件列表Owner
具有传递给其构造该组件。 在设计时创建的所有组件都有父TForm
(或TFrame
或TDataModule
设置为自己的) Owner
。 您的第一个循环是通过TForm的的既有组件迭代,这就是为什么它的工作原理。 您TPanel不拥有任何组件,这就是为什么第二循环失败。
你要找的是ControlCount
和Controls[]
属性,而不是。 他们访问孩子的视觉控制的名单,而不是控制-有设置为自己的父控件控制Parent
的视觉表现的目的。 只有TWinControl
派生的控件(如TPanel
)可以有子控件:
for (int i = 0; i < Panel1->ControlCount; ++i)
{
ShowMessage(Panel1->Controls[i]->Name);
//.....
}
枚举形式,面板,组箱等的所有的控制和子控制(即控制的子控件):
void ExtractAll_Structure(TWinControl *container, int &indent)
{
// Enumarate its children
for (int i = 0; i < container->ControlCount; i++)
{
// extract the control at index i
TComponent *child2 = container->Controls[i];
if (child2->InheritsFrom (__classid(TComponent)) ) // this check if optional
{
Memo->Lines->Add(child2->Name);
// Is this a container for other controls
TWinControl *winctrl = dynamic_cast<TWinControl *>(child2);
if (winctrl)
{
indent++;
ExtractAll_Structure(winctrl, indent);
indent--;
}
}
}
}
另请参阅: BCB:如何遍历窗体上控件?