wang_80919 发表于 2019-3-27 08:05:39

FMX 动态创建销毁(释放freel)对象 FreeAndNilFmxObject 送 FindChild

FMX 动态创建 和 销毁(释放free) 对象 By FlyingWang V2017-05-12

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

代码如下:**** Hidden Message *****

测试代码。
建一个 Frame 里头放一个 按钮。来测试。
当然 用 其他的 UI 对象也是可以的,例如直接用 Button 效果也是一样的。

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;


wfymqj 发表于 2019-3-29 01:04:04

收藏学习了:lol

红鱼儿 发表于 2019-3-27 08:11:52

:lol
学习了!!!!!

arthur 发表于 2019-3-30 07:17:16

666                   --- :lol

先来一铜大铲 发表于 2020-3-3 08:18:29

偷偷的学习
页: [1]
查看完整版本: FMX 动态创建销毁(释放freel)对象 FreeAndNilFmxObject 送 FindChild