为什么这个代码不起作用?
我正在编写一个应用程序,它能够保存和加载自己的文件,并且需要知道如何使用FileStream将对象流到文件中。
procedure TForm1.btnSaveClick(Sender: TObject);
var
fs: TFileStream;
begin
fs := TFileStream.Create('c:\temp\a.my', fmCreate);
try
fs.WriteBuffer(Image1.Picture.Graphic, SizeOf(TGraphic));
finally
fs.Free;
end;
ShowMessage('ok');
Image1.Picture.Graphic := nil;
end;
procedure TForm1.btnLoadClick(Sender: TObject);
var
fs: TFileStream;
g: TGraphic;
begin
fs := TFileStream.Create('c:\temp\a.my', fmOpenRead);
try
fs.ReadBuffer(g, SizeOf(TGraphic));
Image1.Picture.Graphic := g;
finally
fs.Free;
end;
ShowMessage('ok');
end;编辑1:找到了方法,但需要更多帮助:
procedure TForm1.btnSaveClick(Sender: TObject);
var
fs: TFileStream;
s: TMemoryStream;
buf: TBytes;
begin
fs := TFileStream.Create('c:\temp\a.my', fmCreate);
s := TMemoryStream.Create;
try
Image1.Picture.Graphic.SaveToStream(s);
SetLength(buf, s.Size);
s.Position := 0;
s.ReadBuffer(buf[0], s.Size);
//fs.WriteBuffer(, SizeOf(Integer)); <-here how do I save an integer which represents the size of the buffer? (so that when reading back i read this first.)
fs.WriteBuffer(buf[0], s.Size);
finally
s.Free;
fs.Free;
end;
ShowMessage('ok');
Image1.Picture.Graphic := nil;
end;发布于 2011-08-25 09:40:28
您在那里所做的是流引用,即指针。您需要流的是内容。你可以用SaveToFile和LoadFromFile做到这一点。
对于您的更新,将s.Size分配给Integer类型的局部变量,然后使用WriteBuffer保存它。相反,使用ReadBuffer读取局部变量。
如果我是你,我会直接写到文件中,避免记忆条纹。使用TStream的Position属性在文件周围查找。因此,为长度写0,写图形,回到开头,写出长度的4个字节的真实长度。
https://stackoverflow.com/questions/7188098
复制相似问题