如果要查的控件是某个控件的子控件,那直接FindComponent好像就查不到了,请问有没有方法能直接根据控件名称查出控件是否存在的

解决方案 »

  1.   

    再问一个问题,如果你在Form上放1个Panel1,然后在Panel1上放1个Panel2,
    这样直接用 FindComponent('Panel2');就可以找到Panel2但如果动态创建就找不到了
    procedure TForm1.Button4Click(Sender: TObject);
    var
      Panel: TPanel;
    begin
      Panel:= TPanel.Create(Panel1);
      Panel.Parent:= Panel1;
      Panel.Name:= 'Panel2';
      Panel.Visible:= True;
    end;这样的话一定要 Panel1.FindComponent('Panel2')才可以,,请问为什么会这样?
      

  2.   

    var
      i:integer;begin
      for i:=0 to componentcount-1 do
      begin
        if (components[i] is tpanel) then
          if components[i].name='panel1' then
          .
          .
          .
      end;
    end;
      

  3.   

    大家帮帮小弟啊。
    还有如果创建时是 
    Panel:= TPanel.Create(nil);这样之后用FindComponent怎么也找不到了,那要如何找呢?
    Parent属性到底是用来做什么的?
      

  4.   

    //参考VCL代码就可以找到答案
    {}constructor TComponent.Create(AOwner: TComponent);
    {}begin
    {}  FComponentStyle := [csInheritable];
    {}  if AOwner <> nil then AOwner.InsertComponent(Self);
    {}end;
    //Panel := TPanel.Create(Panel1); //相当于:Panel1.InsertComponent(Panel);{}function TComponent.FindComponent(const AName: string): TComponent;
    {}var
    {}  I: Integer;
    {}begin
    {}  if (AName <> '') and (FComponents <> nil) then
    {}    for I := 0 to FComponents.Count - 1 do
    {}    begin
    {}      Result := FComponents[I];
    {}      if SameText(Result.FName, AName) then Exit;
    {}    end;
    {}  Result := nil;
    {}end;{}procedure TControl.SetParent(AParent: TWinControl);
    {}begin
    {}  if FParent <> AParent then
    {}  begin
    {}    if AParent = Self then
    {}      raise EInvalidOperation.CreateRes(@SControlParentSetToSelf);
    {}    if FParent <> nil then
    {}      FParent.RemoveControl(Self);
    {}    if AParent <> nil then
    {}    begin
    {}      AParent.InsertControl(Self);
    {}      UpdateAnchorRules;
    {}    end;
    {}  end;
    {}end;
      

  5.   

    Panel:= TPanel.Create(nil);把这句改下 你要指定你创建的panel的owner是谁
    findcomponent方法是找当前元件的子元件
    Panel:= TPanel.Create(self);
    这样就指明了你创建的panel的父元件是form1
    然后再调用form1.findcomponent方法就可以找到你的panel啦
      

  6.   

    1.要知道owner和parent的区别。
    create后面有个参数,其实就是指明了该控件的owner。
    parent就是通过parent属性来设置的。这个不用解释了。
    2.FindComponent其实就是查找当前组件的所有子控件而已。
    其实,你直接使用FindComponent('Panel2'),其实是Self.FindComponent('Panel2')。也就是说他只查找Owner为当前form的所有控件而已。如果一个控件的Owner不是当前form,那么他不在查找范围之内。所以出现了你动态创建Panel:= TPanel.Create(Panel1)时,找不到的现象,因为这时Panel的owner根本不是当前form。
    3.直接拉控件(即设计时创建)和动态创建(即运行时创建)的区别。在设计时创建的所有控件的owner都为当前form,不论谁在谁里面。所以你直接拉控件时能找到,因为这时panel的owner为当前form。
      

  7.   

    至于你所说的直接用FindComponent('Panel2'),自己想办法解决吧。
    再了解到一定程度的时候,你就能解决了!