Serialize application settings #133

Store application settings in a Delphi class and serialize it to a binary file:

unit SettingsU;

interface

uses Classes;

{$M+}

type
  TCustomSettings = class
  public
    procedure LoadFromStream(const Stream: TStream);
    procedure LoadFromFile(const FileName: string);
    procedure SaveToStream(const Stream: TStream);
    procedure SaveToFile(const FileName: string);
  end;

  TSettings = class(TCustomSettings)
  private
    FPropertyString: string;
    FPropertyDate: TDateTime;
    FPropertyInt: Integer;
  published
    property PropertyInt: Integer
      read FPropertyInt write FPropertyInt;
    property PropertyString: string
      read FPropertyString write FPropertyString;
    property PropertyDate: TDateTime
      read FPropertyDate write FPropertyDate;
  end;

var
  Settings: TSettings;

implementation

uses TypInfo, Sysutils;

{ TSettings }

procedure TCustomSettings.LoadFromFile(const FileName: string);
var
  Stream: TStream;
begin
  Stream:= TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;

procedure TCustomSettings.LoadFromStream(const Stream: TStream);
var
  Reader: TReader;
  PropName, PropValue: string;
begin
  Reader:= TReader.Create(Stream, $FFF);
  Stream.Position:= 0;
  Reader.ReadListBegin;

  while not Reader.EndOfList do
  begin
    PropName:= Reader.ReadString;
    PropValue:= Reader.ReadString;
    SetPropValue(Self, PropName, PropValue);
  end;

  FreeAndNil(Reader);
end;

procedure TCustomSettings.SaveToFile(const FileName: string);
var
  Stream: TStream;
begin
  Stream:= TFileStream.Create(FileName, fmCreate);
  try
    SaveToStream(Stream);
  finally
    Stream.Free;
  end;
end;

procedure TCustomSettings.SaveToStream(const Stream: TStream);
var
  PropName, PropValue: string;
  cnt: Integer;
  lPropInfo: PPropInfo;
  lPropCount: Integer;
  lPropList: PPropList;
  lPropType: PPTypeInfo;
  Writer: TWriter;
begin
  lPropCount:= GetPropList(PTypeInfo(ClassInfo), lPropList);
  Writer:= TWriter.Create(Stream, $FFF);
  Stream.Size:= 0;
  Writer.WriteListBegin;
  for cnt:= 0 to lPropCount - 1 do
  begin
    lPropInfo:= lPropList^[cnt];
    lPropType:= lPropInfo^.PropType;
    if lPropType^.Kind = tkMethod then Continue;

    PropName:= lPropInfo.Name;
    PropValue:= GetPropValue(Self, lPropInfo);
    Writer.WriteString(PropName);
    Writer.WriteString(PropValue);
  end;

  Writer.WriteListEnd;
  FreeAndNil(Writer);
end;

initialization

Settings:= TSettings.Create;

finalization

FreeAndNil(Settings);

end.
Author: Shlomo Abuisak
Contributor: Shlomo Abuisak
Added: 2009/11/05
Last updated: 2009/11/05