如何以编程方式破坏delphi中的可视化控件?

时间:2013-01-26 14:25:40

标签: delphi controls

我遇到了麻烦。 我创建了一个标签对象。

var lbl:Tlabel;
begin
lbl:=TLabel.Create(nil);
....

好的,但是在摧毁它之后,它仍然存在。 有我的代码:

lbl.free;
lbl := nil;

执行后,控件保持在窗体上。 有解决方案吗?我需要销毁这个组件,这应该从形式上消失。 感谢。

编辑:RemoveControl(AControl:TControl);程序不起作用。 EDIT2:

for I := 0 to 4 do begin
 lbl:=TLabel.Create(nil);
lbl.Top :=  100+z*i;
 lbl.Left := 88;
 Lbl.Width := 80;
  Lbl.Height := 14;
  lbl.Font.Size := 9;
 lbl.Caption := nm[i];
 Form1.InsertControl(lbl);

此控件保持不变。

1 个答案:

答案 0 :(得分:9)

销毁控件与销毁任何其他对象没有什么不同。只需在对象上调用Free即可完成。

遇到问题的唯一时间是在运行事件处理程序的对象上调用Free。例如,释放该按钮的OnClick处理程序中的按钮。在这种情况下,您需要向表单发布消息,然后在处理排队消息时释放按钮。

你的问题是你在错误的对象上调用Free。您创建了5个标签,但仅保留对其中一个标签的引用。您需要释放所有5个标签。您需要一个数组或一个列表来保存标签引用。然后你就可以释放它们了。

在表单中声明一个数组:

FLabels: array of TLabel;

创建时:

SetLength(FLabels, 5);
for i := 0 to high(FLabels) do
begin
  FLabels[i] := TLabel.Create(Self);
  .......
end;

像这样摧毁:

for i := 0 to high(FLabels) do
  FLabels[i].Free;
FLabels := nil;

为您提供一些一般性建议。当您遇到问题时,请简化它。为什么尝试使用多个控件调试对象销毁?创建一个空白的应用程序,并添加一个控件。然后尝试删除该单个控件。然后转到多个控件。不要对复杂版本进行故障排除,总是尽量简化。