我遇到了麻烦.我创建了一个标签对象.
var lbl:Tlabel;
begin
lbl:=TLabel.Create(nil);
....
Run Code Online (Sandbox Code Playgroud)
好的,但是在摧毁它之后,它仍然在形式上.有我的代码:
lbl.free;
lbl := nil;
Run Code Online (Sandbox Code Playgroud)
执行后,控件保持在窗体上.有解决方案吗?我需要销毁这个组件,这应该从形式上消失.谢谢.
编辑: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);
Run Code Online (Sandbox Code Playgroud)
这种控制保持在形式上.
销毁控件与销毁任何其他对象没有什么不同.只需在对象上调用Free即可完成.
遇到问题的唯一时间是在运行事件处理程序的对象上调用Free.例如,释放该按钮的OnClick处理程序中的按钮.在这种情况下,您需要向表单发布消息,然后在处理排队消息时释放按钮.
你的问题是你在错误的对象上调用Free.您创建了5个标签,但仅保留对其中一个标签的引用.您需要释放所有5个标签.您需要一个数组或一个列表来保存标签引用.然后你就可以释放它们了.
在您的表单中声明一个数组:
FLabels: array of TLabel;
Run Code Online (Sandbox Code Playgroud)
当你创建它们时:
SetLength(FLabels, 5);
for i := 0 to high(FLabels) do
begin
FLabels[i] := TLabel.Create(Self);
.......
end;
Run Code Online (Sandbox Code Playgroud)
像这样毁灭:
for i := 0 to high(FLabels) do
FLabels[i].Free;
FLabels := nil;
Run Code Online (Sandbox Code Playgroud)
一些一般性的建议.当您遇到问题时,请简化它.为什么尝试使用多个控件调试对象销毁?创建一个空白的应用程序,并添加一个控件.然后尝试删除该单个控件.然后转到多个控件.不要对复杂版本进行故障排除,总是尽量简化.