C ++ Builder的 - 枚举TPanel组件(C++ builder - enumerate

2019-11-01 12:08发布

这是很简单枚举窗体组件

         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;

仅仅是零,而对面板几个组件。 所以,我怎么能列举面板的子组件?

Answer 1:

ComponentCountComponents[]有设置为自己的组件组成部分-属性拥有访问组件的组件列表Owner具有传递给其构造该组件。 在设计时创建的所有组件都有父TForm (或TFrameTDataModule设置为自己的) Owner 。 您的第一个循环是通过TForm的的既有组件迭代,这就是为什么它的工作原理。 您TPanel不拥有任何组件,这就是为什么第二循环失败。

你要找的是ControlCountControls[]属性,而不是。 他们访问孩子的视觉控制的名单,而不是控制-有设置为自己的父控件控制Parent的视觉表现的目的。 只有TWinControl派生的控件(如TPanel )可以有子控件:

for (int i = 0; i < Panel1->ControlCount; ++i)
{
    ShowMessage(Panel1->Controls[i]->Name);
    //.....
}


Answer 2:

枚举形式,面板,组箱等的所有的控制子控制(即控制的子控件):

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:如何遍历窗体上控件?



文章来源: C++ builder - enumerate components on TPanel