为什么这段代码不起作用?
我正在编写一个能够保存和加载自己的文件的应用程序,并且需要知道如何使用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;
答案 0 :(得分:3)
你所做的是流引用,即指针。你需要流的是内容。你可以使用SaveToFile和LoadFromFile。
关于更新,请将s.Size分配给Integer类型的局部变量,然后使用WriteBuffer进行保存。相反,使用ReadBuffer读入局部变量。
如果我是你,我会直接写文件并避免记忆条纹。使用TStream的Position属性来搜索文件。所以写0表示当时的长度,写入图形,寻找回头并写出真正的长度,占长度的4个字节。