unit RegistryEx;

{ V této unitě je implementován objekt TRegistryEx, který usnadňuje načítání
  z registrů Windows. V "klasickém" TRegistry se totiž vyvolává vyjímka, pokud
  načítaná hodnota neexistuje. Moje třída umožňuje jako parametr načítací funkce
  předat defaultní hodnotu, která se v tom případě použije a vyjímka se nedostane
  ven z načítací funkce.

  Z důvodů lenosti jsem doopravdy implementoval jen funkce, které jsem opravdu
  potřeboval -- zbytek vyvolá vyjímku ENotImplemented. }

interface

uses
  Registry, SysUtils;

type
  ENotImplemented = class(Exception);
  
  TRegistryEx = class(TRegistry)
    function ReadBool(const name: string; default: Boolean): Boolean;
    function ReadCurrency(const name: string; default: Currency): Currency;
    function ReadDate(const name: string; default: TDateTime): TDateTime;
    function ReadDateTime(const name: string; default: TDateTime): TDateTime;
    function ReadFloat(const name: string; default: Double): Double;
    function ReadInteger(const name: string; default: Integer): Integer;
    function ReadString(const name: string; default: string): string;
    function ReadTime(const name: string; default: TDateTime): TDateTime;
  end;

implementation

function TRegistryEx.ReadBool(const name: string; default: Boolean): Boolean;
begin
  try
    Result := inherited ReadBool(name);
  except
    Result := default;
  end;
end;

function TRegistryEx.ReadCurrency(const name: string; default: Currency): Currency;
begin
  raise ENotImplemented.Create('Method not implemented. You can do it yourself :-)');
end;

function TRegistryEx.ReadDate(const name: string; default: TDateTime): TDateTime;
begin
  raise ENotImplemented.Create('Method not implemented. You can do it yourself :-)');
end;

function TRegistryEx.ReadDateTime(const name: string; default: TDateTime): TDateTime;
begin
  raise ENotImplemented.Create('Method not implemented. You can do it yourself :-)');
end;

function TRegistryEx.ReadFloat(const name: string; default: Double): Double;
begin
  try
    Result := inherited ReadFloat(name);
  except
    Result := default;
  end;
end;

function TRegistryEx.ReadInteger(const name: string; default: Integer): Integer;
begin
  try
    Result := inherited ReadInteger(name);
  except
    Result := default;
  end;
end;

function TRegistryEx.ReadString(const name: string; default: string): string;
begin
  Result := inherited ReadString(name);
  { Hnusná nekonzistence: Pokud hodnota typu string v registech neexistuje,
    nevyvolá se vyjímka, ale vrátí se prázdný řetězec. Na případ, že by
    prázdný řetězec mohla být i správná hodnota klíče, Borland jaksi nemyslel. }
  if Result = '' then Result := default;
end;

function TRegistryEx.ReadTime(const name: string; default: TDateTime): TDateTime;
begin
  raise ENotImplemented.Create('Method not implemented. You can do it yourself :-)');
end;

end.
