http://www.2pascal.com/thread-3037-1-1.html这是原文地址。

(* ************************************************ *)
(*                         *)
(*                         *)
(*  编写:爱吃猪头肉 & Flying Wang 2015-12-03   *)
(*      上面的版权声明请不要移除。      *)
(*                         *)
(* ************************************************ *) //本人所在的群(① FireMonkey[移动开发] 165232328) {-------------------------------------------------------------------------------} procedure FDFree(AObj: TObject);
begin
if AObj <> nil then
{$IFDEF AUTOREFCOUNT}
AObj.DisposeOf;
{$ELSE}
AObj.Destroy;
{$ENDIF}
end; {-------------------------------------------------------------------------------} procedure FDFreeAndNil(var AObj);
var
p: Pointer;
begin
if Pointer(AObj) <> nil then begin
p := Pointer(AObj);
Pointer(AObj) := nil;
{$IFDEF AUTOREFCOUNT}
if TObject(p).__ObjRelease > then
TObject(p).DisposeOf;
{$ELSE}
TObject(p).Destroy;
{$ENDIF}
end;
end; //FD 开头的是 官方的 FireDac 专用函数。 function FindChild(Name: string; Parent: TFmxObject): TFmxObject;
var
I: Integer;
Child: TFmxObject;
begin
Result := nil;
if (Parent <> nil) and (Parent.Children <> nil) then
begin
for I := Parent.Children.Count - downto do
begin
Child := TFmxObject(Parent.Children[I]);
if Child.Name = Name then
begin
Result := Child;
break;
end;
end;
end;
end; procedure FreeAndNilFmxObject(var Obj: TFmxObject);
begin
if Obj <> nil then
begin
Obj.Parent := nil;
Obj.SetRoot(nil);
//FreeAndNil(Obj);
FDFreeAndNil(Obj);
end;
end;
var
AIndex : Integer = ;
procedure TForm1.Button1Click(Sender: TObject);
var
A: TButton;
B: TFmxObject;
begin
B := FindChild('A', Self);
if (B <> nil) and (B is TButton) then
begin
A := B as TButton;
B := nil;
FreeAndNilFmxObject(TFmxObject(A));
end;
inc(AIndex);
A := TButton.Create(nil);
A.Name := 'A';
A.Position.Y := AIndex * A.Height;
A.Text := '按钮' + AIndex.ToString;
A.Parent := Self;
end; procedure TForm1.FormDestroy(Sender: TObject);
var
B: TFmxObject;
begin
B := FindChild('A', Self);
//这样写更简单些。
FreeAndNilFmxObject(B);
end;

【转】FMX 动态创建及销毁(释放free)对象的更多相关文章

  1. FMX 动态创建 和 销毁(释放free) 对象

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  2. C#动态创建单例类的对象

    单例类 public class SnappingClass : ISnappingEnvironment, IExtension { // private static readonly Snapp ...

  3. C#动态创建接口的实现实例对象

    本文简单介绍如何动态创建接口interface的实现实例对象,包含两个知识点: 1.如何获取接口interface的所有实现实例对象? 2.如何判断实例对象的构造函数是否有参数? 准备工作 首先新建一 ...

  4. unity3d通过代码动态创建销毁游戏对象

    只能动态创建内部提供的游戏对象,代码如下: //按下C后创建 if (Input.GetKeyDown (KeyCode.C)) { GameObject s1 = GameObject.Create ...

  5. Qt Quick 组件和动态创建的对象具体的解释

    在<Qt Quick 事件处理之信号与槽>一文中介绍自己定义信号时,举了一个简单的样例.定义了一个颜色选择组件,当用户在组建内点击鼠标时,该组件会发出一个携带颜色值的信号,当时我使用 Co ...

  6. Unity进阶技巧 - 动态创建UGUI

    前言 项目中有功能需要在代码中动态创建UGUI对象,但是在网上搜索了很久都没有找到类似的教程,最后终于在官方文档中找到了方法,趁着记忆犹新,写下动态创建UGUI的方法,供需要的朋友参考 你将学到什么? ...

  7. 动态创建html元素的几种方法

    可以通过以下几种方式动态创建html元素: 1.使用jQuery创建元素的语法 2.把动态内容存放到数组中,再遍历数组动态创建html元素 3.使用模版   □ 使用jQuery动态创建元素追加到jQ ...

  8. jQuery动态创建html元素的常用方法汇总

    在使用jQuery进行WEB程序设计的时候非常有用.分享给大家供大家参考.具体方法如下: 一般来说,可以通过以下几种方式动态创建html元素: 1.使用jQuery创建元素的语法 2.把动态内容存放到 ...

  9. 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板

    [源码下载] 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板 作者:webabcd 介绍不可或缺 Window ...

随机推荐

  1. MySQL数据的导出和导入

    MySQL环境变量设置,将%MySQL_HOME%下的MySQL Server 5.1/bin放到Path下. MySQL的mysqldump工具,基本用法是:   shell> mysqldu ...

  2. 什么是DNS攻击?它是如何工作的?

    什么是DNS攻击?它是如何工作的? DNS攻击是一种利用域名系统中的弱点或漏洞的网络攻击.今天,互联网已成为我们生活中不可或缺的一部分.从社交到金融.购物再到旅游,我们生活的方方面面都是互联网.由于互 ...

  3. Heroku 云服务部署流程

    部署操作: heroic create bluefocus mkdir heroku && cd heroku --------------------- git init herok ...

  4. javascript监听按键

    document.addEventListener('keydown',test); function test(e){ var x=e.keyCode; if(x == 49){ console.l ...

  5. event.target.dataset

    dataset并不是典型意义上的JavaScript对象,而是个DOMStringMap对象,DOMStringMap是HTML5一种新的含有多个名-值对的交互变量. 1.event.target.d ...

  6. visual studio中csproj文件中的project guid改为小写

    安装了vs2019之后,发现有的项目中引用的其他项目的源码,但是无法识别了. 最后发现是因为project guid是大写导致的. https://stackoverflow.com/question ...

  7. Learning-Python【13】:迭代器和生成器

    一.什么是迭代器 迭代指的是一个重复的过程,每一次重复都是基于上一次的结果而来的 # 这里的循环也是一个迭代,每次基于上一次的结果而取值 li = 'hello' i = 0 while i < ...

  8. Mock.js 虚拟接口 数据模拟

    Mock.js 是一款前端开发中拦截Ajax请求再生成随机数据响应的工具.可以用来模拟服务器响应. 优点是非常简单方便, 无侵入性, 基本覆盖常用的接口数据类型. 大概记录下使用过程, 详细使用可以参 ...

  9. Windows 用bat脚本带配置启动redis,并用vb脚本使其在后台运行。

    最近,在Windows上用开发PHP程序,需要用到Redis,每天要打开一个运行redis-server.exe的窗口这样比较烦,因为窗口就一直打开着,不能关闭. 所以就想着通过写脚本的方式,让他在后 ...

  10. vue render里面的nativeOn

    vue render里面的nativeOn的解释官方的解释是:// 仅对于组件,用于监听原生事件,而不是组件内部使用 `vm.$emit` 触发的事件. 官方的解释比较抽象 个人理解: 父组件要在子组 ...