0

枚举Form组件非常简单

         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;

在 Panel 上有多个组件时,它只是零。那么,如何枚举 Panel 的子组件呢?

4

2 回答 2

2

ComponentCountComponents[]属性访问组件的拥有组件列表-通过Owner将该组件传递给其构造函数来将该组件设置为它们的组件。在设计时创建的所有组件都将父级TForm(或TFrameTDataModule)设置为它们的Owner. 您的第一个循环是遍历 TForm 拥有的组件,这就是它起作用的原因。您的 TPanel 不拥有任何组件,这就是第二个循环失败的原因。

您正在寻找的是ControlCountandControls[]属性。他们改为访问可视控件的控件列表 - 将父控件设置为Parent用于可视化表示的控件。只有TWinControl- 派生控件(如TPanel)可以有子控件:

for (int i = 0; i < Panel1->ControlCount; ++i)
{
    ShowMessage(Panel1->Controls[i]->Name);
    //.....
}
于 2013-02-03T22:59:00.473 回答
0

枚举窗体、面板、组框等的所有控件子控件(该控件的子控件):

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:如何迭代表单上的控件?

于 2018-10-10T08:04:41.153 回答