Edit.Free;
Edit:=nil;if assigned(edit1) then ....
delphi中,一个类的对象类型的变量不是指针而是一个引用。

解决方案 »

  1.   

    assigned(...) 有时一点也不好用,见如下的代码,
    var
      edt,edt2:TEdit;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      edt:=Edit1;//edit1,edit2都是设计时从组件板上拉进Form1的
      edt2:=edit1;
      edt.Free;
      if Assigned(edt) then//在这里,edit1=nil but edt<>nil why???
      begin
         edt.Text:='Exist';//ok
         edt2.Text:=edt.Text; //ok
         edit2.text:=edt.text;  //ok
         edt.Vusible:=True;//error
      end
    end;procedure TForm1.Button2Click(Sender: TObject);
    // if you press button1 before press button2...
    begin
      if assigned(edt) then  //edt exist
         showmessage('edt exist');
      edit1.Visible:=true;  //error
      showmessage(edt2.text);  //ok
    end;
    另外,很多资料上都说类变量是指针,倒是没有说是引用的,如果真是引用,它有引用计数吗?
      

  2.   

    问题在于你只EDT.FREE
    还缺一句edt := nil;
    edt这个变量依然存在
      

  3.   

    1)delphi中free不会给变量赋nil,所以要自己赋空
    edit1.Free;
    edit1 := nil;//一定要自己加这句话。
    2)在C++中 int &C; c是一个引用,它有引用计数吗?
      

  4.   

    引用和引用计数不是同一个概念。
    delphi中string使用引用计数(reference counting)的技术。
    var s:string; s有引用计数,那s 是引用吗?
      

  5.   

    delphi 中obj.Free是不能把obj置为nil但下面的代码却相反的Edit1置为nil了,这是什么原因?还请赐教。
    edt:=Edit1;//edit1,edit2都是设计时从组件板上拉进Form1的
    edt.Free;//注意,我是调用了edt.Free,
    if Assigned(edt) then//在这里,edit1=nil but edt<>nil 为什么Edit1成了nil了???我的问题是:如果Edit1在另外的地方Free掉了,但edt并没有在对象被释放的同时置为nil--因此对edt而言,Assigned(edt)是返回True的,因为edt仍指向了一个地址,(可用Integer(edt)查看它的值),那么我怎样才能知道edt指向的对象已经不存在了呢?也就是说怎样判断edt的合法性这个问题我花了不少时间研究,但仍不得其解,
      

  6.   

    edit1变成nil是form1做的,好像tedit在free的时候通知它的owner把自己设置成nil.
    如果edit1是自己代码里面新create的一个tedit对象而不是设计时拉进来的就没这种情况
    我不知道怎么判断变量指向的对象是否存在,这一点java好多了,根本不用考虑这些问题