gpt4 book ai didi

delphi - 使用 TFileStream 将对象流式传输到文件

转载 作者:行者123 更新时间:2023-12-02 03:27:36 28 4
gpt4 key购买 nike

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

我正在编写一个应用程序,该应用程序能够保存和加载自己的文件,并且需要知道如何使用 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;

最佳答案

您所做的就是流式传输引用,即指针。您需要流式传输的是内容。您可以使用 SaveToFile 和 LoadFromFile 来实现。

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

如果我是你,我会直接写入文件并避免内存条纹。使用 TStream 的 Position 属性在文件中查找。所以把then length写成0,写图形,寻回开头,写出真正的长度,占长度的4个字节。

关于delphi - 使用 TFileStream 将对象流式传输到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7188098/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com