DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: snarv12
今日帖子: 5
在线用户: 8
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 joinsense (joinsense) ★☆☆☆☆ -
盒子活跃会员
2004/7/27 11:10:43
标题:
请教用BLOB字段存、取图象,为何产生内存泄露? 浏览:1579
加入我的收藏
楼主:     我有以前的一个程序,Delphi 4,InterBase 5 环境,在一个表中用BLOB字段存图象,存图象没有问题,但是显示图象时发现有内存泄露问题(用MEMPROOF查得),我的图片是*.jpg格式,大约32K,每次显示一下图象,就会增加32K的内存占用,当程序运行时间长了,就会出现内存存取冲突的提示,重新进入程序后就正常了。
显示图象的程序片段如下:G_LastPhoto是一个路径及文件名的公用变量。

  with TBlobField(QYCustInfo.FieldByName('CustPhoto')) do
     if BlobSize > 0 then begin
        SaveToFile(G_LastPhoto);//经实验发现这句占用内存不释放,不明白?
        IGPhoto.Picture.LoadFromFile(G_LastPhoto);
     end;
  end;

    我用这种方法合适不合适?用别的方法怎样显示BLOB图象?有没有相关的函数?是不是用了BLOB字段就自动分配了内存?如果是的话如何释放?
    此问题困扰我一个多月了,最后发现是SaveToFile导致,但不知如何处理,请各位帮忙解答一下。不胜感激! 再次感谢。

----------------------------------------------
-
作者:
男 sephil (NAILY Soft) ★☆☆☆☆ -
盒子中级会员
2004/7/27 15:25:47
1楼: var
  Stream: TBlobStream;
begin
  Stream := TBlobStream.Create( TBlobField(QYCustInfo.FieldByName('CustPhoto')) , bmRead);
  try
    Stream.Seek(0, 0);
    IGPhoto.Picture.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;

----------------------------------------------
Copyright 2008 ? NAILY Soft

Click here to redirect to my home
Click here to redirect to my blog
作者:
男 joinsense (joinsense) ★☆☆☆☆ -
盒子活跃会员
2004/7/28 14:19:11
2楼: 谢谢sephil的耐心解答!这是一个很好的方法,可是DELPHI 4没有LoadFromStream()方法,由于很多原因又不能升级DELPHI版本,如何?有没有别的办法?再次感谢!
----------------------------------------------
-
作者:
男 sephil (NAILY Soft) ★☆☆☆☆ -
盒子中级会员
2004/7/28 14:21:00
3楼: 这就难办了
偶也没Delphi4...
----------------------------------------------
Copyright 2008 ? NAILY Soft

Click here to redirect to my home
Click here to redirect to my blog
作者:
男 joinsense (joinsense) ★☆☆☆☆ -
盒子活跃会员
2004/7/28 16:07:18
4楼: 谢谢sephil!我是第一次到这个论坛,才知道你是这里的高手。能得到你的帮助非常感谢,希望以后能得到你的指教。不过刚才我用Delphi 6试了一下,好象也没有啊。D7、D8有?
----------------------------------------------
-
作者:
男 sephil (NAILY Soft) ★☆☆☆☆ -
盒子中级会员
2004/7/28 16:33:01
5楼: 我也不是什么高手
只是用Delphi的时间长写而已

不好意思,是我记错了

var
  Stream: TBlobStream;
  Jpg: TJpegImage;
begin
  Stream := TBlobStream.Create( TBlobField(QYCustInfo.FieldByName('CustPhoto')) , bmRead);
  try
    Stream.Seek(0, 0);
    Jpg := TJpegImage.Create;
    try
      Jpg.LoadFromStream(Stream);
      IGPhoto.Picture.Assign(Jpg);
    finally
      Jpg.Free;
    end;
  finally
    Stream.Free;
  end;
end; 

记得引用Jpeg
----------------------------------------------
Copyright 2008 ? NAILY Soft

Click here to redirect to my home
Click here to redirect to my blog
作者:
男 joinsense (joinsense) ★☆☆☆☆ -
盒子活跃会员
2004/7/29 14:09:03
6楼: 谢谢sephil! 
    用你第二次的方法试验,程序可正常编译,但运行时还是有的32K的内存积累,好象Jpg.Free; 及Stream.Free;语句都不起作用,一执行Jpg.LoadFromStream(Stream);这句就产生了垃圾,屏蔽掉这句就没问题了。联想到一开始用的SaveToFile()语句,只是存一下盘也不该有问题呀!问题到底出在哪儿?帮我找找吧。非常感谢你这样认真给我解答,使我受益非浅。谢谢!
----------------------------------------------
-
作者:
男 sephil (NAILY Soft) ★☆☆☆☆ -
盒子中级会员
2004/7/29 14:14:46
7楼: 这个应该是和系统有关的
内存有没有真正释放应该是系统处理的

----------------------------------------------
Copyright 2008 ? NAILY Soft

Click here to redirect to my home
Click here to redirect to my blog
作者:
男 joinsense (joinsense) ★☆☆☆☆ -
盒子活跃会员
2004/7/29 16:17:53
8楼: 你是说DELPHI环境?还是WINDOWS? 谢谢!
----------------------------------------------
-
作者:
男 sephil (NAILY Soft) ★☆☆☆☆ -
盒子中级会员
2004/7/29 16:18:51
9楼: Windows
----------------------------------------------
Copyright 2008 ? NAILY Soft

Click here to redirect to my home
Click here to redirect to my blog
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行58.59375毫秒 RSS