如何将当前状态的对象保存到文件中?这样就可以立即读取并恢复它的所有变量。
您正在寻找的称为对象持久性。这篇文章可能会有所帮助,如果你用谷歌搜索“delphi持久对象”,还有很多其他文章。
如果您从 TComponent 继承对象,则可以使用一些内置功能将对象流式传输到文件。我认为这只适用于简单的物体。
一些帮助您入门的示例代码:
unit Unit1;
interface
uses
Classes;
type
TMyClass = class(TComponent)
private
FMyInteger: integer;
FMyBool: boolean;
FMyString: string;
public
procedure ToFile(AFileName: string);
published
property MyInteger: integer read FMyInteger write FMyInteger;
property MyString: string read FMyString write FMyString;
property MyBool: boolean read FMyBool write FMyBool;
end;
implementation
{ TMyClass }
procedure TMyClass.ToFile(AFileName: string);
var
MyStream: TFileStream;
begin
MyStream := TFileStream.Create(AFileName);
try
Mystream.WriteComponent(Self);
finally
MyStream.Free;
end;
end;
end.
如前所述,最简单的方法是使用 Stream 及其 WriteComponent 和 ReadComponent 方法。
但请注意:
- 它适用于 TComponent 的后代,而不是普通的 TObject;
- 仅适用于已发布的属性(保存在 dfm 中的属性),而不是公共属性或(更不用说)私有属性;
- 恢复组件时必须特别注意Name属性
。
您可能会在这些答案中找到一些可以使用的代码:
解决方案 2. 将对象保存到二进制文件(我的首选解决方案)。相信我,这并不难。 使用 ccStreamMem.pas,或者更好的是我的
LightSaber Core 库中的 ccStreamBuff.pas(缓冲写入)。
您可以在 Delphi in all its pleasure
书中找到一些关于如何做到这一点的代码示例。
PS:LightSaber 是 JVCL 的轻量级替代品。
以下是如何将记录保存到二进制文件的示例。操作与 TObject 相同!
// Supposing you have a record (could be also an object) called RAnimationParams that you want to save to disk:
INTERFACE
USES
System.SysUtils, Vcl.Graphics, ccStreamBuff;
TYPE
TFrameDelayType = (fdAuto, fdUser);
RAnimationParams = record
Color : TColor;
DelayType : TFrameDelayType;
procedure WriteToStream (IOStream: TCubicBuffStream);
procedure ReadFromStream(IOStream: TCubicBuffStream);
end;
IMPLEMENTATION
procedure RAnimationParams.WriteToStream(IOStream: TCubicBuffStream);
begin
IOStream.WriteByte (Ord(DelayType));
IOStream.WriteInteger (Color);
IOStream.WritePadding (32);
end;
procedure RAnimationParams.ReadFromStream(IOStream: TCubicBuffStream);
begin
DelayType := TFrameDelayType(IOStream.ReadByte);
Color := IOStream.ReadInteger;
IOStream.ReadPadding (32);
end;
末尾的填充允许您稍后更改记录/对象结构,而无需更改二进制文件的格式。
要将 RAnimationParams 实际保存到磁盘,您只需执行以下操作:
MyBinFile:= TCubicBuffStream.CreateRead('C:\Test.bin');
AnimationParams.WriteToStream(MyBinFile);
MyBinFile.Free;
当您想要从 Test.bin 加载 RAnimationParams 时使用相同的代码,但您使用 CreateWrite 而不是 CreateRead。
TCubicBuffStream 类甚至具有 ReadHeader/CreateWrite 等专用函数,可让您轻松地将“
文件幻数”和“文件版本号”添加到二进制文件中。 看到了吗?没那么难。它适用于任何对象,而不仅仅是 TComponent。
JVCL 的示例,但它不适用于 TObject,而仅适用于持久派生:
uses
JvAppXMLStorage;
var
Storage: TJvAppXMLFileStorage;
begin
Storage := TJvAppXMLFileStorage.Create(nil);
try
Storage.WritePersistent('', MyObject);
Storage.Xml.SaveToFile('S:\TestFiles\Test.xml');
Storage.Xml.LoadFromFile('S:\TestFiles\Test.xml');
Storage.ReadPersistent('', MyObject);
finally
Storage.Free;
end;
end;
。请记住,您必须具有 RTTI(运行时类型信息)才能使用此方法在运行时保存对象,因此它只会捕获类的 published 属性。