小弟我才学delphi不久,遇到这个问题,想请各位大侠帮忙!小弟感激不尽!
问题就是:我的数据库的字段类型是image,里面包含多个记录,我以tsream流的形式依次从数据库中读取出来,然后想把这些流合并起来,存储到一个tmemorystream流里面,可是发现用copyfrom把分流复制过来后,tmemorystream的size是各个分流的size和,可是它的内容却总是和第一个分流的内容一样!小弟不知道怎么回事?请各位大侠指点下!
问题就是:我的数据库的字段类型是image,里面包含多个记录,我以tsream流的形式依次从数据库中读取出来,然后想把这些流合并起来,存储到一个tmemorystream流里面,可是发现用copyfrom把分流复制过来后,tmemorystream的size是各个分流的size和,可是它的内容却总是和第一个分流的内容一样!小弟不知道怎么回事?请各位大侠指点下!
例如stream.Seek(0,soFromEnd);将当前stream的Position移动到最stream的最末端进行附加
拼出来大小对了,但是内容不对?
是什么样的内容,图片?视频?
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;上面是写
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
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;写 内容
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完整的显示出来。
///写流
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;
然后读时 读出数量 循环 找到size 然后读取