如何在delphi中以编程方式销毁可视化控件?

如何在delphi中以编程方式销毁可视化控件?,delphi,controls,Delphi,Controls,我有麻烦了。 我创建了一个标签对象 var lbl:Tlabel; begin lbl:=TLabel.Create(nil); .... 好的,但在销毁它之后,它仍然保持在形式上。 这是我的代码: lbl.free; lbl := nil; 执行后,控件保持在窗体上。 有解决办法吗?我需要摧毁这个组件,它应该从形式上消失。 谢谢 编辑:删除控制(A控制:T控制);程序不起作用。 编辑2: 此控件保持在窗体上。销毁控件与销毁任何其他对象没有区别。只要在对象上调用Free,您就完成了 遇到问题

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

var lbl:Tlabel;
begin
lbl:=TLabel.Create(nil);
....
好的,但在销毁它之后,它仍然保持在形式上。 这是我的代码:

lbl.free;
lbl := nil;
执行后,控件保持在窗体上。 有解决办法吗?我需要摧毁这个组件,它应该从形式上消失。 谢谢

编辑:删除控制(A控制:T控制);程序不起作用。 编辑2:


此控件保持在窗体上。

销毁控件与销毁任何其他对象没有区别。只要在对象上调用Free,您就完成了


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

你的问题是你打错了免费电话。您创建了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;


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

表单上已销毁的标签下面难道没有其他标签吗?这应该可以正常工作(并且实际工作)。您的
lbl
不能保留在表单上,因为它从未出现在表单上form@Serg,可能这就是代码的
部分…@TLama中发生的情况-如果是这样,问题可能是“这是我的代码:
”。它不起作用。谢谢。免费就够了。和往常一样,show代码演示了问题。谢谢。请举个例子。我一直试图释放所有4个控件。“在这种情况下,您需要将消息发布到表单中,然后在处理排队的消息时释放按钮。”--值得注意的是:如果需要释放的是表单本身,则
Release
方法与您描述的完全相同。我得到一个错误:acces-invalition at-address。。。。设定长度(FLabels,5);对于i:=0到4的dobeginflabels[i]:=TLabel.Create(Self);襟翼[i]。顶部:=100+z*i;FLabels[i]。左:=88。。。。。。是时候启动调试器并找出错误所在了。你已经找到了你所问问题的答案。那密码是错的。看看你能不能看出它和我的有什么不同。您正在循环内将FLabels设置为零。我强烈要求你们按照我答案最后一部分的建议去做。您询问了在运行时销毁控件的问题。为什么还要把它与您试图学习如何使用数组混为一谈呢。一次解决一个问题。
for i := 0 to high(FLabels) do
  FLabels[i].Free;
FLabels := nil;