Naciśnij “Enter” aby skoczyć do treści

Tiny Radio Player #05 – Zapis ustawień aplikacji

Ustawienia aplikacji zapiszemy na dysku w postaci pliku xml. Taki sposób umożliwi nam łatwy dostęp do edycji konfiguracji w dowolnym edytorze tekstu. Jeżeli po uruchomieniu aplikacji plik z ustawieniami nie zostanie znaleziony to zostanie utworzony z domyślnymi wartościami i zapisany w głównym katalogu aplikacji.

Skrócona wersja pliku xml wygląda następująco:

<?xml version="1.0" encoding="UTF-8"?>
<Settings>
  <Item name="Volume">100</Item>
</Settings>

Nazwa pozycji jest dowolna i zależy tylko od nas. Musimy jednak pamiętać, że to właśnie po niej będziemy odwoływać się do danej pozycji.

Przejdźmy teraz do omówienia klasy odpowiedzialnej za zapis i odczyt ustawień.

unit TRPSettings;   

  TTRPSettings = class sealed (TObject)
  private
    // class variables and methods belongs to the class, not to the instance

    class var SettingsHashmap: TStringList;
    // if its true, the settings should be saved before exit
    class var IsUpdated: Boolean;

    class procedure CreateDefaultSettings;
    class function GetSettingsFilePath(): string;
    class procedure Initialize();
    class procedure Finalize();
  public
    // static methods
    class function GetValue(const Item: string;
      const DefaultValue: string = EMPTY_STR; const AddIfNoExists: boolean = false): string;
    class function GetValue(const Item: string;
      const DefaultValue: integer = EMPTY_INT; const AddIfNoExists: boolean = false): integer;
    class function SetValue(const Item: string; const Value: string): ErrorId;
    class function SetValue(const Item: string; const Value: integer): ErrorId;
    class procedure SaveSettings;
    class procedure LoadSettings;
  end;

initialization
  TTRPSettings.Initialize();

finalization
  TTRPSettings.Finalize();

Wszystkie składowe klasy są statyczne więc nie tworzymy instancji tej klasy. Sekcja Initialization jest uruchamiana jeden raz przy tworzeniu Unitu. Nadaje się więc idealnie do podpięcia metody, która załaduje ustawienia aplikacji. Finalization umożliwi natomiast zapis konfiguracji i zwolnienie wcześniej utworzonych zasobów.

Po wczytaniu konfiguracji wszystkie pozycje dodajemy do listy SettingsHashmap. Aby zaktualizować lub dodać nową pozycję używamy metody SetValue. Do pobrania używamy GetValue, gdzie jako drugi parametr możemy podać domyślną wartość, która zostanie zwrócona jeżeli dana pozycja nie zostanie znaleziona. Aby wyeliminować sytuację zapisu ustawień, które nie zostały zmienione stosujemy flagę IsUpdated. Po wywołaniu metody SetValue ustawiamy jej wartość na True co pozwala później określić, czy konfiguracja została zmieniona i powinna zostać zapisana do pliku.

W celu dodania lub pobrania pozycji z konfiguracji odwołujemy się bezpośrednio do klasy TTRPSettings

// dodanie lub zmiana warości
TTRPSettings.SetValue('Volume', sbVolume.Position);

// pobranie warości
sbVolume.Position := TTRPSettings.GetValue('Volume', 100);

Aktualizacja

W ramach dalszych prac nad aplikacją została dodana możliwość grupowania ustawień i zapis ich pod daną nazwą. Służą do tego metody SetGroupValue i GetGroupValue dostępne w TTRPSettings.

Tak jak zwykle cały kod aplikacji dostępny jest na GitHubie. Jeżeli interesują Cię zmiany dotyczące tego wpisu to zapraszam tu.