程序员必知:【转】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;

相关文章
|
JSON 前端开发 JavaScript
|
缓存 前端开发 数据格式
构建前端防腐策略问题之保证组件层的代码不受到接口版本变化的问题如何解决
构建前端防腐策略问题之保证组件层的代码不受到接口版本变化的问题如何解决
|
Kubernetes Go 网络架构
Golang热重载和优雅地关闭
Golang热重载和优雅地关闭
|
存储 算法 Go
这么简单的问题都不会,那还面试什么!?
gozero如何自定义goctl?本文详解和实战,通过本文你将了解goctl的妙用,提高你的开发效率。介绍如何使用goctl工具实现模板定制化,并根据实际项目业务需求进行模板定制化实现。
这么简单的问题都不会,那还面试什么!?
|
Java API
【并发编程】吃透Synchronized
【并发编程】吃透Synchronized
80 1
|
Web App开发 XML 传感器
VSCode 开发Vue必备插件
VSCode 开发Vue必备插件
436 0
|
前端开发 JavaScript Java
Swagger-UI 介绍及基本使用指南
Swagger-UI 介绍及基本使用指南
14859 2
Swagger-UI 介绍及基本使用指南
|
Ubuntu Linux Shell
嵌入式最强调试终端神器—MobaXterm
现今软件市场上有很多终端工具,比如:secureCRT、Putty等等。secureCRT其实也是一款很强大的终端工具,但它是收费软件,一般公司不允许使用。Putty,非常小巧,免费软件,但是不支持标签,开多个会话的话就需要开多个窗口,窗口切换不方便。这两个软件的界面都不太美观。
899 0
嵌入式最强调试终端神器—MobaXterm
|
JavaScript
Notification.description(ant-design) 和 $notify.message(element-ui) 通知内容自定义
Notification.description(ant-design) 和 $notify.message(element-ui) 通知内容自定义
687 0