VCL用了这么久,却没想到被一个不是难题的难题难倒了。。。。

zwjchina 2004-11-27 08:51:39
用TImage装载了一个图片(使用LoadFromFile),请问如何释放该图片,使TImage中不显示任何图片!
...全文
415 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
surpassable 2004-11-30
  • 打赏
  • 举报
回复
学习,学习~~~

mark~~
zwjchina 2004-11-28
  • 打赏
  • 举报
回复
把TImage的Picture直接设置为nil应该可以,VCL源代码已表明了一切

但是:
var
a: TBitmap;
begin
a := TBitmap.Create;
a.LoadFromFile('...');
//这里怎么释放呢?

如果用TBitmap进行loadfromFile之后,如何释放TBitmap中图片

即在TBitmap 之前TBitmap.Empty是True
LoadFromFile之后TBitmap.Empty是False

如何恢复到TBitmap是True
nongen 2004-11-28
  • 打赏
  • 举报
回复
指针指向NIL后,图片断链,系统会将其释放~~~~~~~~~~~~
lyguo 2004-11-28
  • 打赏
  • 举报
回复
学习
zzlingaaa 2004-11-28
  • 打赏
  • 举报
回复
使用Image.Picture下的各种图片格式都不用Create,想来Free也是自动的
huyuhua 2004-11-28
  • 打赏
  • 举报
回复
越搞越复杂,好象进入了C++世界
yinzhiw 2004-11-28
  • 打赏
  • 举报
回复
学习
Demogodyou 2004-11-28
  • 打赏
  • 举报
回复
置为nil 后,Delphi或操作系统会自动回收它。这些都不用你来亲自管理。
zwjchina 2004-11-28
  • 打赏
  • 举报
回复
如何去满足?

是否需要这样:
TBitmap.FreeImage;
TBitmap.ReleaseHandle;
TBitmap.ReleaseDIBHandle;
...
bee2518 2004-11-28
  • 打赏
  • 举报
回复
function TBitmap.GetEmpty;
begin
with FImage do
Result := (FHandle = 0) and (FDIBHandle = 0) and (FSaveStream = nil);
end;

满足以上条件就可以把TBitmap.Empty变成True
ehom 2004-11-28
  • 打赏
  • 举报
回复
楼主和楼上一些朋友的理解错了~~~

var
Bitmap: TBitmap;

这里的Bitmap是个对象

var
Picture: TPicture;

这里的Picture.Bitmap是属性

同样

Image.Picture也是属性

当然不能混为一谈~~~

把一个对象赋为nil,当然不行,这不会释放任何内存,也就是造成内存泄漏.像楼上朋友说的指针指向nil就会释放当然是不可能的.

而属性当然不一样,这里的属性赋值会调用write关键字后面跟的相应的函数,最终都是调用Graphic.SetGraphic,里面是会对相应的对象进行释放,不用担心内存泄漏

语言层面上的东西还是应该都了解透的
todouwang 2004-11-27
  • 打赏
  • 举报
回复
学习
aiirii 2004-11-27
  • 打赏
  • 举报
回复
property Picture: TPicture read FPicture write SetPicture;

以上都是摘自 VCL 源码
aiirii 2004-11-27
  • 打赏
  • 举报
回复
直接用
image1.Picture := nil;
就可,系统会帮你释放的,看如下源码:

procedure TImage.SetPicture(Value: TPicture);
begin
FPicture.Assign(Value);
end;

procedure TPicture.Assign(Source: TPersistent);
begin
if Source = nil then
SetGraphic(nil)
...
end;

procedure TPicture.SetGraphic(Value: TGraphic);
var
NewGraphic: TGraphic;
begin
...
FGraphic.Free; // 这里先将原来的释放,再赋值
FGraphic := NewGraphic;
Changed(Self);
...
end;
lybingyu 2004-11-27
  • 打赏
  • 举报
回复
var
a: TBitmap;
begin
a := TBitmap.Create;
freeandnil(a);
end

这样应没问题了
zzlingaaa 2004-11-27
  • 打赏
  • 举报
回复
image1.Picture := nil;
image1.Picture.Bitmap := nil;
image1.Picture.Graphic := nil;
都可以让Empty=True;
cloudtarget 2004-11-27
  • 打赏
  • 举报
回复
impage1.picture.graphic:=nil
zzlingaaa 2004-11-27
  • 打赏
  • 举报
回复
impage1.picture.graphic:=nil我一直这么用
wxjh 2004-11-27
  • 打赏
  • 举报
回复
Image1.Picture.Assign(nil);能实现,但是会出现内存泄露
wxjh 2004-11-27
  • 打赏
  • 举报
回复
用loadfile过程来夹在一个图片,对impage1.picture.graphic:=nil,这样是对的,我记得好像TPICTURE类的loadfromfile函数里面,只是在栈上创建一个临时的graphic对象,然后使用深度复制将原文件的属性复制近俩,然后将该对象直接引用传递给全局的graphic对象,所以,要释放的时候只要指针指向空就好了,不用那么复杂的,呵呵
加载更多回复(26)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧