怎样判断一个对象已经调用它的Create方法创建过。  
如:  
var  
    oImage:TImage;  
begin  
    ShowPicture(oImage);  
end;  procedure ShowPicture(oObject:TImage);  
begin  
    在此怎样判断 oObject 是否创建?没有创建先创建它  
    {  
        以下这句不行,因为Assigned只能判断变量是否为nil,而不能判断是否被创建。  
        if not Assigned(oObject) then  
            oObject:=TImage.Create(nil);  
    }  
    oObject.Picture.LoadFromFile('******.***');  
end;  

解决方案 »

  1.   

    先初使化 oImage := nil
    释放时用 FreeAndNil(oimage)
      

  2.   

    你说的没错。
      Assigned只能判断变量/过程是否为nil
      你可以在销毁对象的之后再把对象的引用:=nil.这样就可以了。
    或者干脆用FreeAndNil(Obj),FreeAndNil也是为了满足你的这种要求而产生的。
      

  3.   

    楼主:
         其实你得理解没有错!但是对象调用Create 的方法
     的判断应该是用的对象变量来去判断,其他的我也不董。
     因为:oImage这个变量就是一个指向对象创建内存的指针,
     我们可以通过他去访问我们能够访问的东西。同时又通过他
     去释放我们创建对象的内存。如果当我们没有释放我们创建
     对象所需的内存,就把变量oImage := nil 的话,这样就
     会造成我们经常所说的内存泄漏的问题!所以我们在释放
     对象所占用的内存时,应该调用FreeAndNil(oimage)或者
     oimage.free; oimage := nil; 通过这样就可以通过Assigned(oimage) 
     这个方法来判断对象是否Create了!
      

  4.   

    楼上所说的FreeAndNil当然是最好的办法!另外你也可以试试用InstanceSize,在对象从没有创建时(也就是对象为nil)访问InstanceSize会抛出一个异常,你可以捕获这个异常然后自己做处理,在对象创建后它会正确的返回对象的大小。在对象创建过一次后,又释放了,但没有被设置为nil,它一般会是一个很大的随机数(因为那时的对象指针已经代表了另外的内容)不过使用FreeAndNil是一个应该的习惯
      

  5.   

    楼上的 : hkbarton(→Beginner←) 的这位兄弟是不是
    DFW的barton 兄。好久不见你回去了!真的很怀念。
      

  6.   

    http://aiming.ynxx.com/PtrIsObj.htm
    关于“如何检测指针是否是对象”的深入探讨我们知道,在Delphi中,可以将一个指针强制为对象使用。同时,也可以将对象作为指针来保存和使用。
      问题因此而出现。在一个TList中,如果既保存着对象,又保存着无类型指针,那么,我们如何来分辨它们呢?  或者这还不足够说明问题,因为你可以使TList中的元素做到类型单一。但是,如果我们面对的是Delphi的内存分配链表呢?在这个链表中有所有的变量所分配的内存块,当然是指针和对象兼而有之的。那么,我们又如何来分辨它们呢?  一个论坛中的网友light,就遇到了这样的问题。它在写一个用来检测内存泄露的调试工具时,提出了“如何检测指针是否是对象”的问题。  我在论坛发了数篇长文,与gliGordon和light就这个问题进行了深入探讨,并有了一定的结果。  本文整理自我发在该论坛上的文字。