从list中取图标,刷新时内存泄漏 如何解决? ( 积分: 100 )

  • 主题发起人 hitman007260
  • 开始时间
H

hitman007260

Unregistered / Unconfirmed
GUEST, unregistred user!
for i:=0 to imagelist.Count-1 do
begin
image:=imagelist.items;
w:= image.Picture .Bitmap.Width ;
h:=image.Picture.Bitmap.Height ;
hdc2:=image.Canvas.Handle;
hdc1:=image.Canvas.Handle ;
bitblt(hdc2,0,0,w,h,hdc1,0,0,notsrccopy);
image.repaint();
end;
imgelist:tlist;
我的是从链表里弄出来的image 每repaint()估计就生成个新的image
我屏壁掉image.repaint() 内存就不泄了
如何解决?
 
先把原来的Image free掉再repaint看看

for i:=0 to imagelist.Count-1 do
begin
///在这里加入把image free的代码
image:=imagelist.items;
w:= image.Picture .Bitmap.Width ;
h:=image.Picture.Bitmap.Height ;
hdc2:=image.Canvas.Handle;
hdc1:=image.Canvas.Handle ;
bitblt(hdc2,0,0,w,h,hdc1,0,0,notsrccopy);
image.repaint();
end;
 
这个imagelist别的地方还得用啊
begin
///在这里加入把image free的代码
image:=imagelist.items;
你是指FREE掉IMAGELIST里的IMAGE?? 还是指repaint之后然后又循环回来的IMAGE??

这两种情况都不行 FREE了 就不显示了
 
不是呀 你先把TImage里面的内容清空掉然后再传东西进去呀
 
你是指清掉IMAGE里面的BITMAP 然后再传进取BITMAP吧??
试了 repaint 还是不行
 
用Image.refresh试试看
 
晕 我都用了refresh,Invalidate 试过了
不行
 
不大懂你这段代码到底要实现什么
Image是TImage类型吧?
是动态生成的,还是直接拖控件的?
怎么会每repaint()估计就生成个新的image??
 
Image是TImage类型
动态生成的
生成很多
都存在tlist中
其中的一些需要闪烁
那就是部分闪烁代码
 
符合条件的就从imagelist中取出让他闪烁
不只一个闪
所以就在refresh泄漏了
 
没人知道吗??
 
看来你这问题要等年后 高手们回来了 才能解决了[:)]
 
取出的时候不要直接复制引用
使用assign函数复制到一个临时的list里
再操作临时list
这样即不会影响原有的list,还可以控制其生命周期
 
不行啊 还是泄漏
那个list 保存的是地址指针 当refresh时还是指向image;
还是增长
 
我的意思是复制里面的image
既然复制出来了,那就跟原来的list没有关系了啊
不明白哪里来的泄漏
 
你的意思是创建个临时的image 然后让tmpimage.assign(image)??????
timage 不能复制timage
 
那可以复制里面的picture或者bitmap吧
总之是避开原有的list
 
我试过复制 bitmap 结果是一样的
不知道什马原因
 
还没搞定??唉~~~~~~感觉你这个代码问题很大
内存没有释放掉~~
我想你还是直接换个思想重新想代码~~
我年过后继续~想~~[:)]
 
各位大侠指导一下
 
顶部