有这么一段程序,但不能实现我要的结果
Memo1.Lines.Add(Inttostr(form1.ComponentCount));   //此处能显示出form1上的组件个数
  for i:=0 to Panel1.ComponentCount-1 do //可此处却不能显示出Panel1的组件个数,值却为0
  begin
    Memo1.Lines.Add(Panel1.Components[i].ClassName);
  end;
怎么回事?

解决方案 »

  1.   

    那是因为窗体上所有的组件的Owner默认上都是Form的原因,用下面的方法可以得到
    var
      i:integer;
      Result:integer;
    begin
      Result:=0;
      for i:=0 to Self.ComponentCount-1 do
      begin
        if Self.Components[i].GetParentComponent = Panel1 then
      begin
          Memo1.Lines.Add(Self.Components[i].ClassName);
          Inc(Result);
        end;
      end;
      edit1.Text := IntToStr(Result);end;
      

  2.   

    for i:=0 to Panel1.ControlCount-1 do 不过不能得到子控件中控件的个数。
    (你在这个panel 上又放了几个panel,其他控件放在这几个panel上,只能得到这几个panel的个数。)
      

  3.   

    下列方法可以得了Panel中所有子控件的名称:
    function TForm1.IsParentComponent(Child,Parent:TComponent):boolean;
    begin
      if Child.GetParentComponent = Parent then
        Result := true
      else if (Child.GetParentComponent = Self)or(Child.GetParentComponent = nil) then
        Result := false
      else
        Result := IsParentComponent(Child.GetParentComponent,Parent);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      i:integer;
      Result:integer;
    begin
      Result:=0;
      for i:=0 to Self.ComponentCount-1 do
      begin
        if IsParentComponent(Self.Components[i], Panel1) then
        begin
          Memo1.Lines.Add(Self.Components[i].Name);
          Inc(Result);
        end;
      end;
      edit1.Text := IntToStr(Result);end;