如果我申明一个类
var 
  TmpFrm :TForm1;
begin
  TmpFrm := TForm1.Create(application);
  TmpFrm.Free;此时
  TmpFrm指针指向的哪里啊,他好像不是Nil啊,要怎么才能知道tmpFrm已经被释放了呢

解决方案 »

  1.   

    判断窗体是否打开
    //检查窗体是否已经打开过了
      for i:=0 to screen.FormCount-1 do
      begin
        if screen.Forms[i].Name=formname then //证明该窗体已经被打开过了,把它BringToFront就行了
        begin
          screen.Forms[i].BringToFront;
          exit;
        end;
      end;
    //没有打开,就重新打开
    .....
      

  2.   

    用freeandnil(TmpFrm);tmpfrm就是nil了
      

  3.   

    西门吹雪Assign(TmpFrm)是不行的
    Assing(TmpFrm)为true
      

  4.   

    回冰雨
    如果这个Tmpfrm是全局的呢
      

  5.   

    bee2518的办法也确实是个办法,但是偶总觉得太勉强了
    和偶的办法也差不多,偶现在的判断是
    if (not assing(TmpFrm)) or (not (TmpFrm is TForm)) then 
      TmpFrm := TForm1.Create(); getit911(Windows转Linux中)所说FreeAndNil
    那么假如
      TmpFrm := TForm1.Create(Form2);当Form2被Free之后,TmpFrm又是指到哪里呢
      

  6.   

    Free了后,TmpFrm := nil;这样Assign(TmpFrm)就可以了。
      

  7.   

    流亡帅哥的办法不行
    因为这个TmpFrm是通过Owener释放而释放的,所以代码没有地方写
      

  8.   

    一个变量指向一个对象后,如果不是明确的用variable := nil或用FreeAndNil(variable)释放,用Assigned(variable)一定是True,因为variable还指向实例的首地址。用variable is TClass也会有问题,如果这是该实例所占用的内存还没被使用,那么variable is TClass也是True。
        全局变量就更不要用了,你永远不能确定有没人给全局变量重新赋值了,要记住,变量实质上只是指针,不代表任何实例。
        如果你对某个特定的Form进行操作,那么用Screen.Forms或Application.MainForm.MDIChildren来查找特定的Form,再进行操作。
      

  9.   

    TmpFrm 釋放後, 應該說指向的不定的內容, 一般是指向原來的地方, 但那地方是被釋放了!所以, 有時,有些實例, 釋放後, 還能訪問到! 但這樣操作是危險的
      

  10.   

    就是上面的最正确!http://lysoft.7u7.net
      

  11.   

    偶现在是改EhLib控件,他的findDialg就是这样一个全局的变量,现在要动大手术已经不可能了,看来,还是只能从Screen.Form列表中去查找了