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

  • 主题发起人 hitman007260
  • 开始时间
刚才测试有误,
只一句,
Bitblt(Image1.Canvas.Handle, 0, 0, Image1.Picture.Bitmap.Width, Image1.Picture.Bitmap.Height, Image1.Canvas.Handle, 0, 0, notSRCCOPY);
图片不能刷新,还是要调用repaint();才能刷新。
另外内存是增加了约4k,且只增加一次,多次调用不会反复增加。

原先取反操作后内存减少且不需手工调用 repaint的代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
BMP : TBitmap;
begin
Bmp := TBitmap.Create;
try
Bmp.Width := Image2.Picture.Bitmap.Width;
Bmp.Height := Image2.Picture.Bitmap.Height;
Bitblt(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, Image2.Canvas.Handle, 0, 0, notSRCCOPY);
Image1.Picture.Bitmap.Assign(Bmp);
finally
Bmp.Free;
end;
end;
 
我这里 还是增加 每个周期36k 痛苦啊
 
你试试新建一个程序,然后就放一个image1控件,然后试试这个代码:
Bitblt(Image1.Canvas.Handle, 0, 0, Image1.Picture.Bitmap.Width, Image1.Picture.Bitmap.Height, Image1.Canvas.Handle, 0, 0, notSRCCOPY);
image1.repaint();

看内存是否持续增加。
 
试过 不增加
[:(]
 
都不知道怎马办才好
 
试试 Timagelist吧
有add功能的,可以动态增加图片。
 
1。载入图片到imagelist
2。用其draw方法绘图到image上显示
3。对image取反操作。
 
imagelist添加上image如何获得image?? 好像只有.getimagebitmap方法
 
imagelist虽然有FileLoad功能,但效果不好,
推荐用如下方法加载图片:
var bitmap:tbitmap;
begin
bitmap:=tbitmap.Create;
bitmap.LoadFromFile('C:/1.bmp');
imagelist1.AddMasked(bitmap,clwhite);
bitmap.free;
end;
 
2。用其draw方法绘图到image上显示
这个image得重新创建是吧,可惜我这里得image不能重新创建 image里面有大量的动作 和hint
 
从imagelist绘图代码如下:
imagelist1.Draw(image1.Canvas,0,0,1);
image1.Repaint;
 
timagelist 能保存timage控间马??
 
可以使用原有的image啊,不用重建的,如果有图且大小不一,可以清空一下
image1.picture:= nil;
另外,我是建议你用imagelist来代替tlist
至于你在tlist里面保存了很多带有事件和代码的timage
我不知道你的具体情况,如果这些图都是要在一个地方显示的,那么完全可以只用一个timage,然后设置变量来判断并自行不同的代码。
 
timagelist只能保存图,不能保存控件。
而且,缓存太多的控件,势必影响程序的运行效率,消耗更多的资源。
 
要同时显示多个image得
 
下班了 明天在试吧 谢谢你
 
显示多个image没问题,用timagelist程序运行效率更高,而且编程难度也不大。
假设20个图片,并同时显示5个image,
5个image同时指向一个处理过程。
然后在给image装入图片的同时,把图片的编号赋值给image的tag属性。
鼠标点击触发处理过程时,根据tag值的不同调用相应的过程。
 
其实需要的图片很少,也许就一、两个,但是同时显示的同样外观的image很多
你所说的‘假设20个图片,并同时显示5个image',那五个image得从新创建吧
一样很耗资源
 
我不知道你的界面是如何处理的,我这里有个软件的界面图:
http://hi.baidu.com/3030/album/item/3b87a3cc975b0e1101e928ba.html
是我去年编的一个小游戏,上面的图标都是用imagelist在listbox上画的,然后鼠标点击listbox的不同行,还可以执行不同的操作。
不是你要的效果是否类似?
 
不是的
是在地图上显示很多的 交通工具的图标(timage),每个不同的图标对应着大量不同的信息及动作 同一种交通工具 只用一个bitmap
 
顶部