程序为了美观 用了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更换为全局变量 也不行 还是那样猛占内存....

解决方案 »

  1.   

    procedure 更换图片(d:integer;imglist:TImageList;var bmp:Tbitmap) ; 
    var 
      bmp888:TBitmap; 
    begin 
      bmp888:=tbitmap.Create; 
      imglist.GetBitmap(d,Bmp888); 
      bmp:=bmp888; 
      bmp888.Free;  //这里不能释放!!!如果释放就会调用失败..而且程序还会挂掉. 
    end; 
      

  2.   

    这样不行的哦...
    还不如直接imagelist1.GetBitmap(1,...);
      

  3.   

    主要这样子改的东西太多了 .......
    你那个是一个过程了..我要改的东西就太多了.
    和这一句话的功能都一样的.
    imagelist1.GetBitmap(1,BMP变量); //我直接用这一句话内存就交给控件处理了.
      

  4.   

        创建一个列表,把每个对象保存起来。下次要更换的时候,先去列表中查找,如果已经创建了,就不要再去Get,直接返回就OK了。
        在回复框中写的,没有测试,自己测试一下。
     
    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; 
      

  5.   

    我认为不入就这样用得了imagelist1.GetBitmap(1,BMP变量);这样用 
    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的内存没有释放。 
      

  6.   

    这个问题你不是在“DELPHI修炼炉”群里面问了吗?不是已经解决了吗?