程序为了美观 用了N多小图片 不过都是重复调用全部放在imagelist里面的.
通过以下函数调用 此函数放在专门放函数的一个unit里面
function 更换图片(d:integer;imglist:TImageList):TBitmap;
var
bmp888:TBitmap;
begin
bmp888:=tbitmap.Create;
imglist.GetBitmap(d,Bmp888);
Result:=bmp888;
// bmp888.Free; //这里不能释放!!!如果释放就会调用失败..而且程序还会挂掉.
end;开始以为不释放应该没事.可是等程序差不多的时候猛然发现内存占用非常之大.视乎调用一次这个函数就加这个图片占用的空间大小...
其中我有一个按钮点一下就要换10多张13*13大小的图片...
然后每点一下就加1兆左右的内存点一百下内存就上升到100多兆...实在郁闷...不知道回事!!!释放写了就马上出问题.不写内存猛占.
高手们 麻烦帮忙发现一下问题所在?
试过将bmp888更换为全局变量 也不行 还是那样猛占内存....
通过以下函数调用 此函数放在专门放函数的一个unit里面
function 更换图片(d:integer;imglist:TImageList):TBitmap;
var
bmp888:TBitmap;
begin
bmp888:=tbitmap.Create;
imglist.GetBitmap(d,Bmp888);
Result:=bmp888;
// bmp888.Free; //这里不能释放!!!如果释放就会调用失败..而且程序还会挂掉.
end;开始以为不释放应该没事.可是等程序差不多的时候猛然发现内存占用非常之大.视乎调用一次这个函数就加这个图片占用的空间大小...
其中我有一个按钮点一下就要换10多张13*13大小的图片...
然后每点一下就加1兆左右的内存点一百下内存就上升到100多兆...实在郁闷...不知道回事!!!释放写了就马上出问题.不写内存猛占.
高手们 麻烦帮忙发现一下问题所在?
试过将bmp888更换为全局变量 也不行 还是那样猛占内存....
var
bmp888:TBitmap;
begin
bmp888:=tbitmap.Create;
imglist.GetBitmap(d,Bmp888);
bmp:=bmp888;
bmp888.Free; //这里不能释放!!!如果释放就会调用失败..而且程序还会挂掉.
end;
还不如直接imagelist1.GetBitmap(1,...);
你那个是一个过程了..我要改的东西就太多了.
和这一句话的功能都一样的.
imagelist1.GetBitmap(1,BMP变量); //我直接用这一句话内存就交给控件处理了.
在回复框中写的,没有测试,自己测试一下。
pImageInfo = ^TImageInfo;
TImageInfo = record
FIndex: Integer; //保存当前对象的索引
FBmp: TBitmap; //图片对象
end; FImageList: TList; // 添加到列表中
procedure AddToList(const AIndex: Integer; const ABmp: TBitmap);
var
tInfo: pImageInfo;
begin
if not Assigned(FImageList) then FImageList:= TList.Create; new(pImageInfo); pImageInfo.FIndex:= AIndex;
pImageInfo.FBmp := ABmp;
FImageList.Add(pImageInfo);
end; // 释放所有对象
procedure ClearList;
begin
//销毁所有图片,省略
end; // 去列表中根据索引查找,如果找到就
function FindImage(AIndex: Integer): TBitmap;
begin
// 简单的列表查找,省略
end;function 更换图片(d:integer;imglist:TImageList):TBitmap;
begin
Result:= FindImage(d); if Result then exit; Result:= tbitmap.Create;
imglist.GetBitmap(d, Result); AddToList(d, Result);
end;
function 更换图片(d:integer;imglist:TImageList):TBitmap;
var
bmp888:TBitmap;
begin
bmp888:=tbitmap.Create;
imglist.GetBitmap(d,Bmp888);
Result:=bmp888;
// bmp888.Free; //这里不能释放!!!如果释放就会调用失败..而且程序还会挂掉.
end;
每次程序会为result在堆中开一块内存,result中保存得只是内存得地址,这块内存一直没有释放。即使你释放bmp888(全局变量),result的内存没有释放。