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

use*_*097 -1 delphi controls

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

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)

这种控制保持在形式上.

Dav*_*nan 9

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

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