//参考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;
这样直接用 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')才可以,,请问为什么会这样?
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;
还有如果创建时是
Panel:= TPanel.Create(nil);这样之后用FindComponent怎么也找不到了,那要如何找呢?
Parent属性到底是用来做什么的?
{}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;
findcomponent方法是找当前元件的子元件
Panel:= TPanel.Create(self);
这样就指明了你创建的panel的父元件是form1
然后再调用form1.findcomponent方法就可以找到你的panel啦
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。
再了解到一定程度的时候,你就能解决了!