|  | 
 
| 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]
 
 | 
 |