-1

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

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

好的,但是在销毁它之后,它仍然保持形式。有我的代码:

lbl.free;
lbl := nil;

执行后,控件保持在窗体上。有解决办法吗?我需要销毁这个组件,这应该从表单中消失。谢谢。

编辑:删除控制(AControl:TControl);程序不工作。编辑2:

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);

此控件保持在窗体上。

4

1 回答 1

10

销毁控件与销毁任何其他对象没有什么不同。只需在对象上调用 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;

给你一些一般性的建议。当您遇到问题时,请简化它。为什么要尝试使用多个控件来调试对象破坏?创建一个空白应用程序,并添加一个控件。然后尝试删除该单个控件。然后移动到多个控件。不要对复杂的版本进行故障排除,始终尝试简化。

于 2013-01-26T14:43:09.150 回答