我遇到了麻烦。 我创建了一个标签对象。
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);
此控件保持不变。
答案 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;
为您提供一些一般性建议。当您遇到问题时,请简化它。为什么尝试使用多个控件调试对象销毁?创建一个空白的应用程序,并添加一个控件。然后尝试删除该单个控件。然后转到多个控件。不要对复杂版本进行故障排除,总是尽量简化。