如何将一个对象以其当前状态保存到文件中,以便可以立即读取并恢复其所有变量?
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.
// 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;
MyBinFile:= TCubicBuffStream.CreateRead('C:\Test.bin');
AnimationParams.WriteToStream(MyBinFile);
MyBinFile.Free;
当您想从Test.bin加载RAnimationParams时,使用相同的代码,但是使用CreateWrite而不是CreateRead。
TCubicBuffStream类甚至还有专门的函数,如ReadHeader/CreateWrite,可让您轻松地向二进制文件中添加“file magic numbers”和“file version numbers”。
看到了吗?并不难。而且它适用于任何对象,不仅限于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;
E2010 Incompatible types: 'TPersistent' and 'TSomething.TElse<TYetAnother>'
- user30478