程序员必知:【转】FMX动态创建及销毁(释放free)对象

简介: 程序员必知:【转】FMX动态创建及销毁(释放free)对象

这是原文地址。

( ** )

(                          )

(                         )

(  编写:爱吃猪头肉 Flying Wang 2015-12-03   )

(      上面的版权声明请不要移除。      )

(                         )

( ** )

//本人所在的群(① FireMonkey【移动开发】 165232328)

{---}//代码效果参考:http://www.ezhiqi.com/bx/art_105.html

procedure FDFree(AObj: TObject);

begin

if AObj nil then

{$IFDEF AUTOREFCOUNT}//代码效果参考:http://www.ezhiqi.com/zx/art_3210.html

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 > 0 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 - 1 downto 0 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 = 0;

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;

相关文章
|
缓存 安全 数据建模
https证书是什么,怎么申请,以及作用是什么一篇文章告诉你
HTTPS超文本传输安全协议,是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。所以说 的https证书也叫做ssl证书。
19448 0
|
XML API Android开发
android S 上 安装apk出现android.os.FileUriExposedException
android S 上 安装apk出现android.os.FileUriExposedException
416 6
|
JavaScript
Vue 自定义全局UI组件
Vue 自定义全局UI组件
217 0
|
监控 网络协议 iOS开发
程序退到后台的时候,所有线程被挂起,系统回收所有的socket资源问题及解决方案
程序退到后台的时候,所有线程被挂起,系统回收所有的socket资源问题及解决方案
523 0
|
存储 关系型数据库 Apache
Apache Doris 实时数据仓库的构建与技术选型方案
Apache Doris 实时数据仓库的构建与技术选型方案
2031 32
|
Web App开发 XML 传感器
VSCode 开发Vue必备插件
VSCode 开发Vue必备插件
466 0
|
存储
【NI Multisim 14.0原理图环境设置——电路总体设计流程】
一、电路板总体设计流程 为了让用户对电路设计过程有一个整体的认识和理解,下面这里介绍一下电路板设计的总体设计流程。 电路原理图的绘制是 Multisim 电路仿真的基础,其基本设计流程如图所示: 1.创建电路文件 运行NI Multisim 14.0,它会自动创建一个默认标题的新电路文件,该电路文件可以在保存时重新命名。 2.规划电路界面 进入 NI Multisim 14.0 后,需要根据具体电路的组成来规划电路界面,如图纸的大小及摆放方向、电路颜色、元器件符号标准、栅格等。 3.放置元器件 NI Multisim 14.0不仅提供了数量众多的元器件符号图形,而且还设计了元器件的模型,并
627 0
【NI Multisim 14.0原理图环境设置——电路总体设计流程】
88.合并两个有序数组(LeetCode)
88.合并两个有序数组(LeetCode)
102 0
|
关系型数据库 MySQL 测试技术
探索MySQL间隙锁的奥秘
MySQL中的间隙锁(Gap Lock)是一种锁机制,用于在多个事务中保护数据的一致性。它主要用于防止并发事务插入新数据或者修改已有数据时,导致其他事务读取到不一致的结果。
探索MySQL间隙锁的奥秘