如何清空TIMAGE的内容?(100分)

  • 主题发起人 主题发起人 donkey
  • 开始时间 开始时间
D

donkey

Unregistered / Unconfirmed
GUEST, unregistred user!
我要清空IMAGE的图象(不是涂白,是清空),这样有没有问题?
IMAGE。PICTURE.BITMAP:=NIL;
这样会不会引起内存泄漏或是GUI资源没有释放之类的问题[:(]
(我要反复执行清空IMAGE的操作的0
 
IMAGE.PICTURE.BITMAP:=NIL
你只是把Image.picture.bitmap这个指针指向0(空指针),而它以前所指向的内存空间并
没有回收(除非你还有另外的指针指向该空间,不然你永远无法回收)。

正确的写法:
IMAGE.PICTURE.BITMAP.Free;
IMAGE.PICTURE.BITMAP:=NIL;

 
这个问题我答过:
Image.Picture.Assign(nil)
 
从Graphics.pas源码来看,Image.Picture.Bitmap := nil;这样的写法应该没有问题。
代码:
procedure TPicture.SetGraphic(Value: TGraphic);
var
  NewGraphic: TGraphic;
begin
  NewGraphic := nil;
  if Value <> nil then
  begin
    NewGraphic := TGraphicClass(Value.ClassType).Create;
    NewGraphic.Assign(Value);
    NewGraphic.OnChange := Changed;
    NewGraphic.OnProgress := Progress;
  end;
  try
    FGraphic.Free;//[red]在这儿已经把旧有的Bitmap给Free掉了[/red]
    FGraphic := NewGraphic;
    Changed(Self);
  except
    NewGraphic.Free;
    raise;
  end;
end;
——与吕雪松大侠的说法不一致,不知别处哪里还会对此有不同的影响,还请吕大侠指教。
 
我觉得和我的说法是一致的。
TGraphic在赋新值的时候,要把老的内存Free掉,而不是直接设为nil

上面的代码,如果你把
FGraphic.Free;
改成
FGraphic := nil;

就不对了。
 
不不不,吕大侠小有误会了,上面那段code可不是俺写的啊,[:D]
那是$(Delphi)/Source/Vcl/Graphics.pas里3725行处的一段Delphi源码。
也就是说Delphi本身已经替用户处理了释放工作,所以我们在使用的时候完全可以
放心地用Image.Picture.Bitmap := nil;这样的语句而不用考虑Free了。
 
>完全可以放心地用Image.Picture.Bitmap := nil;

是 完全可以放心地用Image.Picture.Graphic := nil; 吧
 
我没有看这段代码(我的机器上没有Delphi),

你说的也有可能,就是TGraphic中的Bitmap属性
是这样写的

Bitmap : TBitmap read ... Write SetGraphic(...);

 
to Huzzz:
为什么非要改成Graphic?donkey的问题里也是用的Bitmap呀。
不过其实这两个是一回事,用哪个的效果是一样的。
都是代表的TPicture.FGraphic变量,执行的也都是SetGraphic函数,看看源码就知道了。
 
to 吕雪松:
对,是这样的——
...
property Bitmap: TBitmap read GetBitmap write SetBitmap;
...
procedure TPicture.SetBitmap(Value: TBitmap);
begin
SetGraphic(Value);
end;
 
达成协议。
 
多人接受答案了。
 
谢谢各位!
 
后退
顶部