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

相关文章
|
4月前
|
安全 程序员 编译器
C++中的RAII(资源获取即初始化)与智能指针
C++中的RAII(资源获取即初始化)与智能指针
64 0
|
4月前
|
算法 Java 程序员
JVM-如何判断对象可以回收
JVM-如何判断对象可以回收
|
3月前
|
安全 C++ 开发者
C++一分钟之-RAII资源获取即初始化
【6月更文挑战第24天】RAII是C++中一种关键的资源管理技术,它利用对象生命周期自动获取和释放资源,减少内存泄漏。通过构造函数获取资源,析构函数释放资源,确保异常安全。优势包括自动性、异常安全和代码清晰。使用智能指针如`std::unique_ptr`和`std::shared_ptr`,以及标准库容器,可以避免手动管理。自定义RAII类适用于非内存资源。代码示例展示了智能指针和自定义RAII类如何工作。掌握RAII能提升程序的可靠性和可维护性。
48 6
|
4月前
|
安全 编译器 C++
C++类与对象【对象的初始化和清理】
C++类与对象【对象的初始化和清理】
C++类与对象【对象的初始化和清理】
|
4月前
|
算法 Java
JVM中判断对象是否需要回收的方法
JVM中判断对象是否需要回收的方法
|
安全 编译器 数据安全/隐私保护
对象的动态创建和销毁以及对象的复制,赋值
🐰对象的动态创建和销毁 🐰对象的复制 🐰对象的赋值
|
C语言
动态内存的释放与回收函数:free()的详解与使用
动态内存的释放与回收函数:free()的详解与使用
180 0
动态内存的释放与回收函数:free()的详解与使用
|
安全 编译器 C++
C++对象的初始化和清理之构造函数和析构函数分析与实例(一)
对象的初始化和清理 • 生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全 • C++中的面向对象来源于生活,每个对象也都会有初始设置以及 对象销毁前的清理数据的设置。 构造函数和析构函数 对象的初始化和清理也是两个非常重要的安全问题 一个对象或者变量没有初始状态,对其使用后果是未知
358 0
C++对象的初始化和清理之构造函数和析构函数分析与实例(一)
|
缓存 算法 Java
对象的创建与内存分配
当 JVM 收到一个 new 指令时,会检查指令中的参数在常量池是否有这个符号的引用,还会检查该类是否已经被加载过了,如果没有的话则要进行一次类加载。
|
程序员 C# C++
C++栈对象,堆对象,静态对象的理解
C++栈对象,堆对象,静态对象的理解
147 0