【问题标题】:Programmatically create and remove a label from a form以编程方式在表单中创建和删除标签
【发布时间】:2011-12-19 09:22:36
【问题描述】:

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

这是下面的代码。 它可以很好地创建标签,但不会删除。 没有例外,分配的说假。

我也可以用 TRectangle 重现它。

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;

【问题讨论】:

  • 请显示更多代码(例如uses子句)或指定您使用的不是VCL而是FireMonkey,它(还不是)Delphi的主流框架...
  • 我知道这可以从 Position.X/Y 属性中推断出来,但仍然......
  • 如果你释放了一个TControl 后代(TLabel 是)然后它会自动从它的所有者中删除它并将它的父设置为nil(检查你的版本的 VCL 代码,但是这肯定是 D2007 的情况)。您不需要将 parent 明确设置为 nil ,所以我不确定那里发生了什么。也许尝试使用Lab.Free; Lab := nil; 而不是FreeAndNil()

标签: delphi delphi-xe2 firemonkey


【解决方案1】:

我认为

Lab.Parent:= NIL;
FreeAndNil(Lab);

可以帮忙。

【讨论】:

  • 谢谢,成功了。有什么理由吗?我以为释放对象会从父级释放....
  • @Wizzard 我不知道为什么它不适合你。我在 Delphi 5 下进行了测试,不需要将 Parent 设置为 NIL,因为析构函数将 Parent 设置为 NIL。我可以想象这可能是 FireMonkey 的错误。
  • Lab.Parent := NIL 在 Android 中运行时会产生分段错误
【解决方案2】:

FWIW,使用 Delphi XE(不是 XE2),您的代码按预期工作(经过一些小的修改,例如用 Left 等替换 Position.X)。

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

  • 您的 Parent 真的是 Form1(因为您使用的是 Lab.Parent := Form1 而不是 self)?
  • 您是否尝试在释放 Lab 后添加 Self.Repaint?

【讨论】:

  • 他正在 XE2 中构建 FireMonkey 应用程序。代码按描述工作,punker76 提供的解决方案工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 2014-04-11
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多