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

  • 主题发起人 hitman007260
  • 开始时间
ufo! 程序不小 是用dephi7和bcb 6编得
 
试试这样:
hdc2:=image.Canvas.Handle;
hdc1:=TCanvas.create;
不要都引用同一个image,create一个tcanvas
然后从image拷贝图到新的canvas
bitblt(hdc2,0,0,w,h,hdc1,0,0,notsrccopy);
然后释放新创建的canvas
思路就是这样,代码自行补充。
 
hdc1:=TCanvas.create;
hdc1 是TCanvas类型吗???
 
这只是个思路
实际需要申明一个tcanvas类型的局部变量,然后create
 
你可以把hdc1申明为 tcanvas
然后hdc1:=TCanvas.create;
然后使用 hdc1.handle
 
这个思路我用了多次了
一次是bitmap
甚至还有 image
都不行
我时试tcanvas吧
 
报错 canvas does not allow drewing
 
你是不是在tlist内保存了很多的动态创建的Timage?
 
canvas是封装了系统的gdi绘图,需要申请设备上下文的,如:
ACanvas := TCanvas.Create;
ACanvas.Handle := getdc(groupbox3.Handle);//可以用getdc(0)试试

ReleaseDC(0,ACanvas.Handle);
ACanvas.Free;
 
我觉得你把问题搞复杂了。
其实,只需一个imagelist控件,设置好图片大小,然后把图片装入。
再在桌面image上draw一个图片,然后对此image处理图片效果就是了。
 
动态生成的image 多少不固定
还能响应单双击动作
imagelist 好像没有add方法把?
另外
canvas是封装了系统的gdi绘图,需要申请设备上下文的,如:
ACanvas := TCanvas.Create;
ACanvas.Handle := getdc(groupbox3.Handle);//可以用getdc(0)试试
申请设备上下文是什么意思?
 
假设image1是一个在桌面上显示的控件。
如果你简单的一句 image1:=tlist1.items;
那么现在image1的对象指针指向了tlist1.items的内存地址
而image1原先的内存虽然不再被使用到了,但内存不会被释放,就造成了内存泄漏。
因为,在delphi内对image1引用或者赋值,操作的只是一个32位的指针,指向了一块在image1.create时申请好的内存。
 
设备上下文,你可以理解为系统资源的一种。
可以看看一些老的帖子,有解释的:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3002409
 
但是我是对显示的image1里的canvas.bitmap取反 并更新,应该是改变内存里的值,image
得内存大小 地址应该到不会改变把 这种情况为什么内存泄露那?
 
然后从image拷贝图到新的canvas
bitblt(hdc2,0,0,w,h,hdc1,0,0,notsrccopy);

如何把canvas弄回到image哪?直接image.canvas.assign(canvas)报错
bitblt(hdc1,0,0,w,h,hdc2,0,0, srccopy);则还是不行 内存还长
 
image:=imagelist.items;
很可能问题出在这里
因为你只是简单的把tlist里面的一个对象赋值给了image,
在delphi内,对象的赋值,只是简单的指向对象的指针赋值。
这样处理不好就会造成内存泄漏。
建议这样做:
Image.Picture.Bitmap.Assign((imagelist.items as timage).picture.Bitmap);
现在,窗体的image上应该有图片显示了
然后对此image进一步处理
 
这种方法我试过了
是不是类似这样啊
w:= image.Picture.Bitmap.Width ;
h:=image.Picture.Bitmap.Height ;

ximage:=Timage.create(self);
ximage.Parent:=image.Parent;
ximage.Tag:=image.Tag;
ximage.Width:=image.Width;
ximage.Height:=image.Height;
ximage.top:=image.top;
ximage.left:=image.left;
ximage.Transparent :=true;
ximage.Stretch:=true;
tmp:=tbitmap.create;
tmp.assign(t4image.Picture .Bitmap);
tmp.Canvas.CopyMode:=cmNotSrcCopy;
TheRect.Left:=0;
TheRect.Top:=0;
TheRect.Right:=w;
TheRect.Bottom:=h;
tmp.Canvas.CopyRect(TheRect,t4image.Canvas,TheRect);
ximage.Picture.Bitmap.assign(tmp);

还是不行的
 
而且 好像 tlist 不能
(list.items as timage)
 
image:=imagelist.items; //就把这一句改掉,
改为Image.Picture.Bitmap.Assign(timage(imagelist.items).picture.Bitmap);
其他还是照你在本帖最开始的代码,试试看
 
顶部