原本是一个grid中显示一些数据,没有问题
后来在grid上显示图片之后,刷新几次就有错误提示“存储空间不足...”的错误图片是从数据库读取的,从一个流中获得
function GetGraphFromStream(AStream: TStream; AImageType: string): TGraphic;
var
  APng: TPNGObject;
  AJpeg: TJPEGImage;
begin
  Result := nil;
  if AStream.Size = 0 then Exit;  AStream.Position := 0;
  if AImageType = '.jpg' then
  begin
    AJpeg := TJPEGImage.Create;
    try
      AJpeg.LoadFromStream(AStream);
      Result := AJpeg;
    except
      on E: Exception do
      begin
        Exit;
      end;
    end;
  end
  else if AImageType = '.png' then
  begin
    APng := TPNGObject.Create;
    try
      APng.LoadFromStream(AStream);
      Result := APng;
    except
      on E: Exception do
      begin       
        Exit;
      end;
    end;
  end;
end;然后通过btimap的assign方法,将结果赋给bitmap并且最终显示,同时会将结果free掉如此而已,请指教

解决方案 »

  1.   

    function GetGraphFromStream(AStream: TStream; AImageType: string): TGraphic;
    var
      APng: TPNGObject;
      AJpeg: TJPEGImage;
    begin
      Result := nil;
      if AStream.Size = 0 then Exit;  AStream.Position := 0;
      if AImageType = '.jpg' then
      begin
        AJpeg := TJPEGImage.Create;
        try
          try
            AJpeg.LoadFromStream(AStream);
            Result := AJpeg;
          except
            on E: Exception do
            begin
              Exit;
            end;
          end;
        finally
          AJpeg.Free;   //这个要释放
        end;
      end
      else if AImageType = '.png' then
      begin
        APng := TPNGObject.Create;
        try
        try
          APng.LoadFromStream(AStream);
          Result := APng;
        except
          on E: Exception do
          begin       
            Exit;
          end;
        end;
        finally
          APng.free;///同样要释放
        end;
      end;
    end;
      

  2.   

    2楼我觉得你的思路不对
    这个APng或者AJpeg是我通过result传递出去的部分,如果在方法里面释放,那么传递出去的result还正常?我的释放是放在转换成bitmap之后AGraph = GetGraphFromStream(AStream, AImageType);
    ABitmap.assing(AGraph);
    AGraph.free;
      

  3.   

    这个我也不确定result:=这个值之后是将什么传递到了栈顶(输出的对象是指针还是重新申请的一块对象内存),不过你可以先试试我找找以前别的区说的这个result的问题
      

  4.   

    http://topic.csdn.net/u/20090511/12/159315BC-366F-4231-9DB7-13FA4727F178.html看看这个不过我对于返回 TGraphic的对象类型,也不知道具体会是怎么样的处理
      

  5.   

    因为涉及到PNG和JPEG两种类型,所以我就用他们的父类,也就是TGraphic作为返回值了这个问题我通过别的方式解决了,我将创建好的TBitmap保存到系统中,第二次调用的时候不重新创建,采用类似缓存的机制,之后没出错怀疑是多次创建对象造成感谢楼上悉心解答