• 【转】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;
  • 相关阅读:
    POJ3253Fence Repair(优先队列或单调队列)
    POJ3630Phone List(字典树)
    HDU1896Stones(优先队列)
    POJ3468 A Simple Problem with Integers(线段树延时标记)
    HDU3535AreYouBusy(分组背包)
    C++ 学习涨姿势汇总
    [C++] std::vector 使用
    Cocos2dx-3.2 引擎学习(四)之CCScheduler
    Cocos2dx-3.2 引擎学习(三)之AssetsManager
    Cocos2dx-3.2 引擎学习(二)之Director
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/10600995.html
Copyright © 2020-2023  润新知