小弟我才学delphi不久,遇到这个问题,想请各位大侠帮忙!小弟感激不尽!
问题就是:我的数据库的字段类型是image,里面包含多个记录,我以tsream流的形式依次从数据库中读取出来,然后想把这些流合并起来,存储到一个tmemorystream流里面,可是发现用copyfrom把分流复制过来后,tmemorystream的size是各个分流的size和,可是它的内容却总是和第一个分流的内容一样!小弟不知道怎么回事?请各位大侠指点下!

解决方案 »

  1.   

    在合并的时候你要控制好stream的Position
    例如stream.Seek(0,soFromEnd);将当前stream的Position移动到最stream的最末端进行附加
      

  2.   

    “size是各个分流的size和”、“内容却总是和第一个分流的内容”
    拼出来大小对了,但是内容不对?
    是什么样的内容,图片?视频?
      

  3.   

    复制前,源流的Position记得先清0(回到起点)
      

  4.   

    我觉得 你起码该写一个buffer描述 流内的结构,比如包含多少个流,各个的大小,procedure TForm1.btn1Click(Sender: TObject);
    var
      S:TMemoryStream;
      T:TMemoryStream;
      M:TMemoryStream;
      P:PInteger;
    begin
      GetMem(P,3);
      P^:=2;
      Inc(P);
      S:=TMemoryStream.Create;
      T:=TMemoryStream.Create;
      M:=TMemoryStream.Create;
      Img1.Picture.Bitmap.SaveToStream(S);
      Img2.Picture.Bitmap.SaveToStream(T);
      T.Position:=0;
      S.Position:=0;
      P^:=S.Size;
      Inc(P);
      P^:=T.Size;
      M.WriteBuffer(P^,3);
      M.CopyFrom(S,S.Size);
      M.CopyFrom(T,T.Size);
      M.SaveToFile('D:\333.MD');
      M.Free;
    end;上面是写
      

  5.   

    procedure TForm1.btn1Click(Sender: TObject);
    var
      S:TMemoryStream;
      T:TMemoryStream;
      M:TMemoryStream;
      P:PInteger;
      PSize:pINTEGER;
    begin
      New(P);
      P^:=2;
      GetMem(PSize,2);
      S:=TMemoryStream.Create;
      T:=TMemoryStream.Create;
      M:=TMemoryStream.Create;
      Img1.Picture.Bitmap.SaveToStream(S);
      Img2.Picture.Bitmap.SaveToStream(T);
      T.Position:=0;
      S.Position:=0;
      PSize^:=S.Size;
      Inc(PSize);
      PSize^:=T.Size;
      M.WriteBuffer(P^,1);
      M.WriteBuffer(PSize^,2);
      M.CopyFrom(S,S.Size);
      M.CopyFrom(T,T.Size);
      M.SaveToFile('D:\333.MD');
      M.Free;
    end;还是这样 容易读,先读出有多少个子流,然后 读 各个的 size 
      

  6.   

    为啥 我总是犯错呢。procedure TForm1.btn1Click(Sender: TObject);
    var
      S:TMemoryStream;
      T:TMemoryStream;
      M:TMemoryStream;
      P:PInteger;
      PSize:pINTEGER;
    begin
      GetMem(PSize,1*Sizeof(Integer));
      P^:=2;
      GetMem(PSize,2*Sizeof(Integer));
      S:=TMemoryStream.Create;
      T:=TMemoryStream.Create;
      M:=TMemoryStream.Create;
      Img1.Picture.Bitmap.SaveToStream(S);
      Img2.Picture.Bitmap.SaveToStream(T);
      T.Position:=0;
      S.Position:=0;
      PSize^:=S.Size;
      Inc(PSize);
      PSize^:=T.Size;
      M.WriteBuffer(P^,1*Sizeof(Integer));
      M.WriteBuffer(PSize^,2*Sizeof(Integer));
      M.CopyFrom(S,S.Size);
      M.CopyFrom(T,T.Size);
      M.SaveToFile('D:\333.MD');
      M.Free;
    end;写  内容
      

  7.   

    jiap1723,不是太明白你的代码,不过感觉上你说的就是我要的结果,我的源代码是:
    procedure TForm4.Button1Click(Sender: TObject);
    var
    bs:tstream;
    i:integer;
    by:tmemorystream;
    begin
    by:=tmemorystream.Create;
    with adoquery1 do
    begin
      close;
      sql.Text:='select * from file_nr';
      open;
      for i := 0 to adoquery1.RecordCount -1 do
      begin
      moveby(i);
       bs:=createblobstream(fieldbyname('nr'),bmread);
       bs.Position:=0;
       by.CopyFrom(bs,0);
       bs.Free;
      end ;
         by.Position:=0;
         olecontainer1.LoadFromStream(by);
         olecontainer1.Update;
         by.Free;
      end;
    end;其中bs就是分流,而by就是总流,你能帮我看看,该怎么才能把by完整的显示出来。
      

  8.   

    [code=Delphi(Pascal)]
    ///写流
    procedure TForm1.btn1Click(Sender: TObject);   
    var  
      S:TMemoryStream;   
      T:TMemoryStream;   
      M:TMemoryStream;   
      P:Pinteger;   
      PSize:Pinteger;   
    begin  
      T:=TMemoryStream.Create;   
      S:=TMemoryStream.Create;   
      M:=TMemoryStream.Create;   
      GetMem(P,Sizeof(Integer));   
      GetMem(PSize,2*Sizeof(Integer));   
      Img1.Picture.Bitmap.SaveToStream(S);   
      Img2.Picture.Bitmap.SaveToStream(T);   
      S.Position:=0;   
      T.Position:=0;   
      PSize^:=S.Size;   
      Inc(PSize);   
      PSize^:=T.Size;   
      P^:=2;   
      Dec(PSize);   
      M.Write(P^,SizeOf(Integer));   
      M.Write(PSize^,2*SizeOf(Integer));   
      M.CopyFrom(S,S.Size);   
      M.CopyFrom(T,T.Size);   
      M.Position:=0;   
      M.SaveToFile('D:\333.MD');   
      S.Free;   
      T.Free;   
      M.Free;   
    end;   
    //读 解析  
    procedure TForm1.btn2Click(Sender: TObject);   
    var  
      FM:TFileStream;   
      P:Pinteger;   
      i:Integer;   
      PSize:Pinteger;   
      Size:Integer;   
      Mm:TMemoryStream;   
      T1,T2:PPointer;   
      Ms:TMemoryStream;   
    begin  
      Mm:=TMemoryStream.Create;   
      Ms:=TMemoryStream.Create;   
      FM:=TFileStream.Create('D:\333.MD',0);   
      FM.Position:=0;   
      GetMem(P,Sizeof(Integer));   
      FM.ReadBuffer(P^,SizeOf(Integer));;   
      GetMem(PSize,2*Sizeof(Integer));   
      FM.ReadBuffer(PSize^,P^*SizeOf(Integer));   
      GetMem(T1,PSize^);   
      FM.ReadBuffer(T1^,PSize^);   
      Mm.WriteBuffer(T1^,PSize^);   
      MM.Position:=0;   
      Img3.Picture.Bitmap.LoadFromStream(Mm);   
      Inc(PSize);   
      GetMem(T2,PSize^);   
      FM.ReadBuffer(T2^,PSize^);   
      Ms.WriteBuffer(T2^,PSize^);   
      Ms.Position:=0;   
      Img4.Picture.Bitmap.LoadFromStream(Ms);   
      FM.Free;   
    end;  
      

  9.   

    先写了一个buffer 写 包含子流数量,然后写一个buffer包含 几个子流的size
    然后读时 读出数量  循环  找到size 然后读取 
      

  10.   

    jiap1723,请问你能不能加我的QQ454145720,由于能力有限,关于代码我不是很懂,想问您些问题,问题解决后,立马给你分!谢谢!