Var DanJu : TFrame;   Danju := TFrame1.Create(Owner); 
  DanJu.Parent := Panel1;   Danju 在建立之后,如果重复建立就会出错,如何判断Danju 是否已经建立,如果建立的话,先释放。

解决方案 »

  1.   

    if Danju = nil then 
    begin
      Danju := TFrame1.Create(Owner);
      Danju.Parent := Panel1;
    end;
      

  2.   

    不行啊,我还没有建立的时候,Danju 就已经不等于Nil 了,不知道为什么。
      

  3.   

    if not assigned(Danju) then 
    begin
      Danju := TFrame1.Create(Owner);
      Danju.Parent := Panel1;
    end
    else
      FreeAndNil(Danju);
      

  4.   

    当定义了变量Danju 
        Var DanJu  : TFrame;   之后,assigned(Danju)的返回值就是真值了,但是还没有创建啊.
      

  5.   

    定义完之后,先给它初始化为nil好了,然后再判断
      

  6.   

    Var 
      DanJu  : TFrame; 
    把这个定义成全局变量就ok拉 对象会初始化danju为nil
    如果定义成局部变量danju的值是不可预知的
      

  7.   

    不行的话就定义一个标识吧,当初始一个Frame时就标记一下。
      

  8.   

    在你的工程中是不是已经有了这个danju这个frame,先从工程中remove掉tframe1试试
      

  9.   

    procedure TForm1.btn1Click(Sender: TObject);
    var
      ddd:TFrame;
    begin
      ddd:=TFrame2.Create(Self);
      ddd.Name:='fframe'+FormatDateTime('yyyymmddhhnnsszzz',now);
      ddd.Parent:=Self.pnl1;
      ddd.Visible:=True;
      ddd.Align:=alClient;
    end;
      

  10.   

    第一次说的不对,没看清题目问题是动态创建的两个frame的name不能重复,否则就出问题了创建时的owner设置为tfrom1,就不用考虑释放的问题了,在窗口释放时会自动释放的
      

  11.   

    问题解决,我定义成全局就可以了,初始值是nil 
      然后里边判断<> nil  then freeandnil(danju).谢谢各位!
      

  12.   

    if assigned(Danju) then 
    begin
      freeandnil(Danju);
      Danju := TFrame1.Create(Owner);
      Danju.Parent := Panel1;
    end
    else
    begin
      Danju := TFrame1.Create(Owner);
      Danju.Parent := Panel1;
    end;