Delphi 以编程方式从窗体中创建和删除标签

Delphi 以编程方式从窗体中创建和删除标签,delphi,delphi-xe2,firemonkey,Delphi,Delphi Xe2,Firemonkey,我这里有一些代码,它创建了一个标签,但是当我释放标签时,它仍然显示在表单上。即使它已被删除且不再“分配” 下面是代码。 它创建的标签很好,但不会删除。 没有例外,分配的值为false 我也可以用三棱角复制这个 type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(

我这里有一些代码,它创建了一个标签,但是当我释放标签时,它仍然显示在表单上。即使它已被删除且不再“分配”

下面是代码。 它创建的标签很好,但不会删除。 没有例外,分配的值为false

我也可以用三棱角复制这个

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
      Lab : TLabel;
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Lab := TLabel.Create(Self);
  Lab.Parent := Form1;
  Lab.Text := 'Hello!';
  Lab.Position.X := 30;
  Lab.Position.Y := 40;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  FreeAndNil(Lab);
  ShowMessage(BoolToStr(Assigned(Lab), true));
end;
我想

Lab.Parent:= NIL;
FreeAndNil(Lab);
可能会有帮助。

FWIW,使用Delphi XE(而不是XE2),您的代码可以按预期工作(在进行一些小的修改后,例如用Left等替换Position.X)

需要检查/尝试的几件事:

  • 您的家长真的是Form1吗(因为您使用的是Lab.Parent:=Form1而不是self)
  • 你试过在释放实验室后添加Self.Repaint吗

他正在XE2中构建FireMonkey应用程序。代码如所述工作,punker76提供的解决方案工作。请显示更多代码(例如uses子句)或指定您使用的不是VCL而是FireMonkey,FireMonkey不是Delphi的主流框架。。。我知道这可以从Position.X/Y属性推断出来,但仍然。。。如果您释放一个
t控件
子体(它是
TLabel
),则它将自动从其所有者中删除它,并将其父项设置为
nil
(检查您版本的VCL代码,但D2007的情况确实如此)。您不需要显式地将parent设置为nil,所以我不确定那里发生了什么。可以尝试使用
Lab.Free;实验室:=零
而不是
FreeAndNil()
?谢谢,这就成功了。有什么原因吗?我以为释放对象会从父对象中释放…@Wizzard我不知道为什么它对你不起作用。我在Delphi5下进行了测试,不需要将父级设置为NIL,因为析构函数将父级设置为NIL。我可以想象这可能是FireMonkey.Lab.Parent的错误:=NIL在Android中运行时会生成分段错误