zoukankan      html  css  js  c++  java
  • 【转】FMX 动态创建及销毁(释放free)对象

     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 > 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;
  • 相关阅读:
    数据库MySQL常用命令复习
    09、C语言——构造类型
    06、C语言——数组
    08、C语言——指针
    11、排序【理论篇】
    01、C语言——基础知识
    16、自学——Linux的学习进度与任务【vim编辑器及文件测试】
    15、自学——Linux的学习进度与任务【bash编程之条件判断】
    05、自学——计算机网络学习任务与进度(数据链路层)
    14、自学——Linux的学习进度与任务【正则表达式】
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/10600995.html
Copyright © 2011-2022 走看看