首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用TFileStream将对象流到文件

使用TFileStream将对象流到文件
EN

Stack Overflow用户
提问于 2011-08-25 09:36:04
回答 1查看 30.3K关注 0票数 2

为什么这个代码不起作用?

我正在编写一个应用程序,它能够保存和加载自己的文件,并且需要知道如何使用FileStream将对象流到文件中。

代码语言:javascript
复制
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:找到了方法,但需要更多帮助:

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-25 09:40:28

您在那里所做的是流引用,即指针。您需要流的是内容。你可以用SaveToFile和LoadFromFile做到这一点。

对于您的更新,将s.Size分配给Integer类型的局部变量,然后使用WriteBuffer保存它。相反,使用ReadBuffer读取局部变量。

如果我是你,我会直接写到文件中,避免记忆条纹。使用TStream的Position属性在文件周围查找。因此,为长度写0,写图形,回到开头,写出长度的4个字节的真实长度。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7188098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档