panel控件问题,前面的帖子我看过了,没解决问题,高手请进! (10分)

  • 主题发起人 主题发起人 huayf
  • 开始时间 开始时间
H

huayf

Unregistered / Unconfirmed
GUEST, unregistred user!
我动态生成一些控件显示在Panel上,
我想通过对panel的操作,让panel重新呈空白状。如何作?
 
for i:=panel.compoments.count-1 downto 0 do
begin
panel.compoments.free;
end;
 
for i:=panel.Controls.Count-1 downto 0 do
begin
panel.Controls.Visible := False;
end;
注意Components与Controls是有差别的。

Components是TComponent实现并维护的组件列表,记录把该组件作为Owner的子组件。
Controls是TWinControl实现并维护的TWinControl列表,记录把该TWinControl作为Parent
的TWinControl。
在他们释放的时候会自动释放他们的Components与Controls
 
同意楼上。
同时一定要注意那个for循环的顺序!如果是释放的话,
一定要从大到小!
 
有分大家分点:
var
I: Integer;
Instance: TControl;
begin
I := ControlCount;
while I <> 0 do
begin
Instance := Controls[I - 1];
RemoveControl(Instance);
Instance.Destroy;
Instance:=nil;
I := ControlCount;
end;
end;

另外对compoents的释放是没有用的,因为panel.contorls[].owner一般是所在的窗体
不会是panel.
components与owner对应
controls与parent对应
 
//sorry,miss with sentence:
var
I: Integer;
Instance: TControl;
begin
I := ControlCount;
with panel1 do
begin
while I <> 0 do
begin
Instance := Controls[I - 1];
RemoveControl(Instance);
Instance.Destroy;
Instance:=nil;
I := ControlCount;
end;
end;
end;

 
你只要生成成控件的时候是这样写的tcompoment.create(panel),控件的owner就是panel.
用control有时会有问题的。
如一个labeledit控件你用contorls访问的话会是两个控件,建议还是用compoment。
 
上面的帖子我都看过了,加上这段代码执行结果与没有这段代码一样,有些控件可以被覆盖
有些不行,
 
先释放控件,再repaint panel就行了。谢谢大家!
 
后退
顶部