一个内存流
我需要顺序存储不同的东西
比如:1、 ……(前面存储的一系列数据)
2、 一个integer型的数值,为后面的数据长度
3、 从Bitmap对象写入的图片信息
4、 ……(后面存储的其他数据)我程序中,写数据都完成了,通过内存流的游标知道,这里的Bitmap数据大约有300K左右。读取代码中
(1)部分读取完全成功
(2)部分读取正确,长度数值正确
(3)部分报错。可能是我的方法有误,有高手能帮帮我么?大致代码如下:
TForm1 = class(TForm)
public
  obj:TMemoryStream;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
  obj:=TMemoryStream.Create;
end;procedure TForm1.Button1Click(Sender: TObject);
var k,iLen:integer;  bmp:TBitmap;
begin
  bmp:=TBitmap.Create;
  obj.Clear;
  //obj.Write(.....);//前面存储了很多数据
  k:=obj.Position;
  obj.Write(iLen,sizeof(iLen));
  bmp.Assign(image1.Picture.Bitmap);
  bmp.SaveToStream(obj);
  iLen:=obj.Position-k-4; //int型的长度有4个字节
  //obj.Write(.....);//后面也存储了很多数据
  obj.Position:=k;
  obj.Write(iLen,sizeof(iLen));  //重些bmp数据长度
  freeAndNil(bmp);
end;procedure TForm1.Button2Click(Sender: TObject);
var k,iLen:integer;  bmp:TBitmap;
begin
  bmp:=TBitmap.Create;
  obj.Position:=0;
  //obj.Read(....) //读取前面存储的数据等语句
  obj.Read(iLen,sizeof(iLen));
  obj.Read(bmp,iLen);   //////////////////////////////【这里报错】
  //obj.Read(....) //读取后面存储的数据等语句
  image2.Picture.Bitmap:=bmp;
end;

解决方案 »

  1.   

    使用如下方法读数据,虽不报错,但在image2中看不到结果。 ms:=TMemoryStream.Create;
      bmp:=TBitmap.Create;
      obj.Position:=0;
      //obj.Read(....) //读取前面存储的数据等语句
      obj.Read(iLen,sizeof(iLen));
      edit2.Text:=inttostr(iLen);
      ms.CopyFrom(obj,iLen);
      bmp.LoadFromStream(ms);但是,若无图片数据以外的其余部分,图片能正常通过内存流复制到image2中。
    通过代码发现流内图片区域的数据长度是正确的。请问哪里错了 该如何处理?
      

  2.   

    是的,我之前也发现了 就是copy后没移到0不过,还是不知道
    obj.Read(iLen,sizeof(iLen));
    obj.Read(bmp,iLen);
    这种方式为啥不行。呵呵 明天结贴。
    看看能不能有人知道这个问题。
      

  3.   

    bitmap是格式化的图形不是内存流,不能obj.Read(bmp,iLen);这么赋值,
    bmp.SaveToStream(obj);你跟代码进去就会发现了,代码太多,这里我就不给你贴了
      

  4.   

    TMemoryStream 中方法定义如下:
    function Read(var Buffer; Count: Longint): Longint;
    procedure WriteBuffer(const Buffer; Count: Longint);注意上面的读写中与 stream 交换数据的 Buffer 是一块内存空间, 可以为基本数据类型: byte, Integer, string[20], 指定长度(setLength)的动态字节(或char)数组, 或已知size 的 struct 等.
    再对照检查一下代码中使用到的 read和 wirte 中的 Buffer 是否符合.
      

  5.   

    为何要一个内存流存这么多东西?
    可不可以用TLIST?
      

  6.   

    TBitmap用SaveToStream,然后把保存的流插入到现有的内存流,
    读的时候把对应部分弄到单独的流中,然后让TBitmap来LoadFromStream
      

  7.   

    obj.Read(bmp,iLen);   //////////////////////////////【这里报错】
    这里要通过一个缓存区转换:
    先定义一个流对象:
    var
      objtemp: TMemoryStream;
    ..
    objtemp := TMemoryStream.Create;
    objtemp.CopyFrom(obj, iLen);
    bmp.LoadFromStream(objtemp);