unit UAutoRegistry;

interface

uses
  Windows, Registry;

type
  TAutoRegistry = class
  private
    FItems: array of record
      Nazev: string;
      Typ: Integer;
      Data: Pointer;
    end;
    FPath: string;
  public
    Update: Boolean;
    constructor Create(Path: string);
    procedure SaveToRegistry; // Uloží všechny proměnné do registrů
    procedure LoadFromRegistry;                 // Načte proměnné z registrů
    // Metody vloží do vnitřní tabulky odkaz na zadanou proměnnou, která má být uchována v registrech
    procedure Include(NovyNazev: string; var NovaData: string; DefaultValue: string); overload;
    procedure Include(NovyNazev: string; var NovaData: Integer; DefaultValue: Integer); overload;
    procedure Include(NovyNazev: string; var NovaData: Boolean; DefaultValue: Boolean); overload;
    procedure Include(NovyNazev: string; var NovaData: Real; DefaultValue: Real); overload;
    procedure Delete;
    destructor Destroy; override;               // Uloží proměnné a uvolní se
  end;

implementation

uses
  Dialogs, SysUtils;

constructor TAutoRegistry.Create(Path: string);
begin
  FPath:= Path;
end;

destructor TAutoRegistry.Destroy;
//var
//  I: Integer;
begin
//  for I:= 0 to High(FItems) do FItems[I].Free;
end;

procedure TAutoRegistry.LoadFromRegistry;
var
  I: Integer;
begin
  with TRegistry.Create do begin
    try
      RootKey := HKEY_CURRENT_USER;
      if not KeyExists(FPath) then SaveToRegistry;
      OpenKey(FPath, True);
      for I:= 0 to High(FItems) do with FItems[I] do begin
        if Typ=1 then begin
          if ValueExists(Nazev) and not Update then Integer(Data^):= ReadInteger(Nazev)
          else WriteInteger(Nazev, Integer(Data^));
        end else if Typ=3 then begin
          if ValueExists(Nazev) and not Update then Boolean(Data^):= ReadBool(Nazev)
          else WriteBool(Nazev,Boolean(Data^));
        end else if Typ=4 then begin
          if ValueExists(Nazev) and not Update then Real(Data^):= ReadFloat(Nazev)
          else WriteFloat(Nazev,Real(Data^));
        end else if Typ=2 then begin
          if ValueExists(Nazev) and not Update then string(Data^):= ReadString(Nazev)
          else WriteString(Nazev,string(Data^));
        end;
      end;
    finally
      Free;
    end;
  end;
end;

procedure TAutoRegistry.SaveToRegistry;
var
  I: Integer;
begin
  with TRegistry.Create do begin
    try
      RootKey := HKEY_CURRENT_USER;
      OpenKey(FPath, True);
      for I:= 0 to High(FItems) do with FItems[I] do begin
        if Typ = 1 then WriteInteger(Nazev,Integer(Data^)) else
        if Typ = 3 then WriteBool(Nazev,Boolean(Data^)) else
        if Typ = 4 then WriteFloat(Nazev, real(Data^)) else
        if Typ = 2 then WriteString(Nazev, string(Data^));
      end;
    finally
      Free;
    end;
  end;
end;

procedure TAutoRegistry.Include(NovyNazev: string; var NovaData: string; DefaultValue: string);
begin
  if not Update then NovaData:= DefaultValue;
  SetLength(FItems,Length(FItems)+1);
  with FItems[High(FItems)] do begin
    Nazev:= NovyNazev;
    Data:= Pointer(@NovaData);
    Typ:= 2;
  end;
end;

procedure TAutoRegistry.Include(NovyNazev: string; var NovaData: Integer; DefaultValue: Integer);
begin
  if not Update then NovaData:= DefaultValue;
  SetLength(FItems,Length(FItems)+1);
  with FItems[High(FItems)] do begin
    Nazev:= NovyNazev;
    Data:= Pointer(@NovaData);
    Typ:= 1;
  end;
end;

procedure TAutoRegistry.Include(NovyNazev: string; var NovaData: Boolean; DefaultValue: Boolean);
begin
  if not Update then NovaData:= DefaultValue;
  SetLength(FItems,Length(FItems)+1);
  with FItems[High(FItems)] do begin
    Nazev:= NovyNazev;
    Data:= Pointer(@NovaData);
    Typ:= 3;
  end;
end;

procedure TAutoRegistry.Include(NovyNazev: string; var NovaData: Real; DefaultValue: Real);
begin
  if not Update then NovaData:= DefaultValue;
  SetLength(FItems,Length(FItems)+1);
  with FItems[High(FItems)] do begin
    Nazev:= NovyNazev;
    Data:= Pointer(@NovaData);
    Typ:= 4;
  end;
end;

procedure TAutoRegistry.Delete;
begin
  with TRegistry.Create do begin
    try
      RootKey := HKEY_CURRENT_USER;
      DeleteKey(FPath);
    finally
      Free;
    end;
  end;
  SetLength(FItems,0);
  //LoadFromRegistry;
end;

end.
