【问题标题】:C++ builder - enumerate components on TPanelC++ builder - 枚举 TPanel 上的组件
【发布时间】:2013-01-18 11:31:18
【问题描述】:

枚举Form组件非常简单

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

但如果我只想枚举位于 Panel 上的组件,则同样的事情不起作用。

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

因为

            Panel1->ComponentCount;

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

【问题讨论】:

    标签: components c++builder enumerate


    【解决方案1】:

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

    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 : how to iterate over controls on a form?

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-06-28
        • 2010-11-26
        • 1970-01-01
        • 2012-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多