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

相关文章
|
3月前
|
C++
析构造函数就是为了释放内存,就是在局部指针消失前释放内存,拷贝构造函数就是以构造函数为模块,在堆里面新开一块,同一个变量在堆里面的地址
本文讨论了C++中构造函数和析构函数的作用,特别是它们在管理动态内存分配和释放中的重要性,以及如何正确地实现拷贝构造函数以避免内存泄漏。
46 2
|
8月前
|
存储 安全 Java
Python中的引用和赋值机制允许变量引用内存中的对象,并通过引用计数来管理对象的生命周期
【5月更文挑战第14天】Python中的变量是对象引用,不存储数据,而是在内存中创建对象。赋值操作创建新变量并使其指向已有对象。引用计数用于管理对象生命周期,引用数为0时对象被回收。理解这些机制对编写高效Python代码很重要。
69 6
|
8月前
|
安全 编译器 C++
C++类与对象【对象的初始化和清理】
C++类与对象【对象的初始化和清理】
|
8月前
|
Java 程序员 编译器
【C/C++析构函数 】C++中的“垃圾回收”机制_析构
【C/C++析构函数 】C++中的“垃圾回收”机制_析构
93 0
|
8月前
函数(四)——栈帧创建与销毁
函数(四)——栈帧创建与销毁
43 0
|
安全 编译器 数据安全/隐私保护
对象的动态创建和销毁以及对象的复制,赋值
🐰对象的动态创建和销毁 🐰对象的复制 🐰对象的赋值
|
C语言
动态内存的释放与回收函数:free()的详解与使用
动态内存的释放与回收函数:free()的详解与使用
208 0
动态内存的释放与回收函数:free()的详解与使用
|
C++
变量被析构函数释放的时候的注意事项
变量被析构函数释放的时候的注意事项
142 0
变量被析构函数释放的时候的注意事项
|
安全 编译器 C++
C++对象的初始化和清理之构造函数和析构函数分析与实例(一)
对象的初始化和清理 • 生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全 • C++中的面向对象来源于生活,每个对象也都会有初始设置以及 对象销毁前的清理数据的设置。 构造函数和析构函数 对象的初始化和清理也是两个非常重要的安全问题 一个对象或者变量没有初始状态,对其使用后果是未知
377 0
C++对象的初始化和清理之构造函数和析构函数分析与实例(一)