2Pascal-新时代的Pascal

标题: FMX 动态创建销毁(释放freel)对象 FreeAndNilFmxObject 送 FindChild [打印本页]

作者: wang_80919    时间: 2019-3-27 08:05
标题: FMX 动态创建销毁(释放freel)对象 FreeAndNilFmxObject 送 FindChild
FMX 动态创建 和 销毁(释放free) 对象 By FlyingWang V2017-05-12

简单的说 就是用 FindChild 找到 已经建立的对象。然后用 FreeAndNilFmxObject 安全的销毁他。
否则 就算 你 自以为销毁了这个对象,其实还显示在你的窗体上呢。
如果 你新建的对象 和 旧的同名,还会 提示你已存在呢。
当然 如果你已经有对象的 变量,就不需要 FindChild 。

代码如下:

测试代码。
建一个 Frame 里头放一个 按钮。来测试。
当然 用 其他的 UI 对象也是可以的,例如直接用 Button 效果也是一样的。
[mw_shl_code=delphi,true]
var
  AIndex : Integer = 0;
procedure TForm1.Button1Click(Sender: TObject);
var
  A: TFrame2;
  B: TFmxObject;
begin
  ReportMemoryLeaksOnShutdown := True;
  B := FindChild('A', Self);
  if (B <> nil) and (B is TFrame2) then
  begin
    A := B as TFrame2;
    B := nil;
    FreeAndNilFmxObject(TFmxObject(A));
  end;
  inc(AIndex);
  A := TFrame2.Create(nil); // Create(Self); 用 Self 和 nil 是有区别的。
  A.Name := 'A';
  A.Size.Width := A.Button1.Size.Width;
  A.Size.Height := A.Button1.Size.Height;
  A.Button1.Position.X := 0;
  A.Button1.Position.Y := 0;
  A.Position.Y := AIndex * A.Height;
  A.Button1.Text := '按钮' + AIndex.ToString;
  A.Parent := Self;
end;

//procedure TForm1.FormDestroy(Sender: TObject);
//var
//  B: TFmxObject;
//begin
//  B := FindChild('A', Self);
//  //这样写更简单些。
//  FreeAndNilFmxObject(B);
//end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  //这样写更简单些。
  FreeFmxObject(FindChild('A', Self));
end;

[/mw_shl_code]

作者: 红鱼儿    时间: 2019-3-27 08:11

学习了!!!!!

作者: wfymqj    时间: 2019-3-29 01:04
收藏学习了
作者: arthur    时间: 2019-3-30 07:17
666                   ---
作者: 先来一铜大铲    时间: 2020-3-3 08:18
偷偷的学习




欢迎光临 2Pascal-新时代的Pascal (http://2pascal.com/) Powered by Discuz! X3