Controls好像进不了子层,如组中的控件就扫描不到了.
Components好像用在Self上还可以,但在子层上就不对了.如在Groupbox上,我用了Groupbox.ComponentCount即告诉我总是0,有谁知道怎么用,
我现在只想用在Groupbox中所包的控件,或者在Form中所有可视的控件,当前包括GroupBox中的下层的控件,

解决方案 »

  1.   

    控件被放置于GroupBox当中,其实只是控件的Parent属性为GroupBox,而GroupBox的ComponentCount仍然为0,反倒是Form.Components包含了所有控件,即这个控件的Owner还是Form。
      

  2.   

    TControl是所有可视控件的父类。而TComponent也包括非可视控件。一般来说,所有在设计状态下添加的控件(无论可视或者非可视)的Owner都是Form。而且当一个Control的Owner不是Form时,它将不能在设计状态下被选定并进行编辑。而其相关属性也不会保存到DFM文件中。
      

  3.   

    TControl是所有可视控件的父类。而TComponent也包括非可视控件。//我觉得tcontrol应该含非可视控件,control是控件,component翻译是组件,tcontrol范围该大些
      

  4.   

    控件会添加到其Parent属性所指控件Controls数组,Owner属性所指的Components数组。默认情况下设计期添加的控件其Parent属性就是其容器控件,而Owner为其所属Form。所以默认情况下会出现你所述情况。
      

  5.   

    那我该怎么办?我只想得到Groupbox中所包的控件,或者在Form中所有可视的控件,当然包括GroupBox中的下层的控件.该怎么做?有谁知道?
      

  6.   

    controls数组递归调用procedure SetControl(AControl: TControl);
    var
      i: integer;
    begin
      for i := 0 to AControl.ControlCount - 1 do
      begin
        AControl.Controls[i].tag := i;
        SetControl(AControl.Controls[i]);
      end;
    end;
      

  7.   

    procedure TForm1.FormCreate(Sender: TObject);
      procedure pScanWinControl(mWinControl: TWinControl);
      var
        I: Integer;
      begin
        for I := 0 to mWinControl.ControlCount - 1 do
        begin
          Memo1.Lines.Add(mWinControl.Controls[I].Name); //try
          { TODO }
          if mWinControl.Controls[I] is TWinControl then
            pScanWinControl(mWinControl.Controls[I] as TWinControl);
        end;
      end;
    begin
      pScanWinControl(Self);
      Memo1.Lines.Add('--'); //try
      pScanWinControl(GroupBox1);
    end;