怎样判断一个对象已经调用它的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;
释放时用 FreeAndNil(oimage)
Assigned只能判断变量/过程是否为nil
你可以在销毁对象的之后再把对象的引用:=nil.这样就可以了。
或者干脆用FreeAndNil(Obj),FreeAndNil也是为了满足你的这种要求而产生的。
其实你得理解没有错!但是对象调用Create 的方法
的判断应该是用的对象变量来去判断,其他的我也不董。
因为:oImage这个变量就是一个指向对象创建内存的指针,
我们可以通过他去访问我们能够访问的东西。同时又通过他
去释放我们创建对象的内存。如果当我们没有释放我们创建
对象所需的内存,就把变量oImage := nil 的话,这样就
会造成我们经常所说的内存泄漏的问题!所以我们在释放
对象所占用的内存时,应该调用FreeAndNil(oimage)或者
oimage.free; oimage := nil; 通过这样就可以通过Assigned(oimage)
这个方法来判断对象是否Create了!
DFW的barton 兄。好久不见你回去了!真的很怀念。
关于“如何检测指针是否是对象”的深入探讨我们知道,在Delphi中,可以将一个指针强制为对象使用。同时,也可以将对象作为指针来保存和使用。
问题因此而出现。在一个TList中,如果既保存着对象,又保存着无类型指针,那么,我们如何来分辨它们呢? 或者这还不足够说明问题,因为你可以使TList中的元素做到类型单一。但是,如果我们面对的是Delphi的内存分配链表呢?在这个链表中有所有的变量所分配的内存块,当然是指针和对象兼而有之的。那么,我们又如何来分辨它们呢? 一个论坛中的网友light,就遇到了这样的问题。它在写一个用来检测内存泄露的调试工具时,提出了“如何检测指针是否是对象”的问题。 我在论坛发了数篇长文,与gliGordon和light就这个问题进行了深入探讨,并有了一定的结果。 本文整理自我发在该论坛上的文字。