Как использовать OmniXML для сохранения настроек приложения в XML-файле - PullRequest
6 голосов
/ 22 января 2010

Я рассматриваю сохранение настроек своего приложения в формате xml вместо использования реестра, но мне трудно разобраться и использовать OmniXML.

Я знаю, что некоторые из вас здесь используют и рекомендуют OnmiXML, поэтому я надеюсь, что кто-то может дать мне несколько советов.

Я привык использовать TRegistry для создания нового ключа, если он не существует, но я не могу найти подобную опцию в OmniXML.

По сути, я хочу сохранить настройки на разных уровнях XML, примерно так:

<ProgramName version="6">
  <profiles>
    <profile name="Default">
      <Item ID="aa" Selected="0" />
      <Item ID="bb" Selected="1" />
    </profile>
  </profiles>
  <settings>
    <CheckForUpdates>1</CheckForUpdates>
    <CheckForUpdatesInterval>1</CheckForUpdatesInterval>
    <ShowSplashScreen></ShowSplashScreen>
  </settings>
</ProgramName>

Теперь при первом запуске программы у меня не будет xml-файла, поэтому мне нужно будет создать все подуровни. С TRegistry это было легко, просто вызовите OpenKey (pathtokey, True), и ключ будет создан, если он не существует. Есть ли сопоставимый способ сделать то же самое с OmniXML? Что-то вроде:

SetNodeStr('./settings/CheckForUpdates', True);

Что бы создать "путь", если он еще не существует.

1 Ответ

10 голосов
/ 22 января 2010

Простой способ сохранить настройки приложения с помощью OmniXML - использовать OmniXMLPersistent .

Как объяснено на Образце страницы OmniXML , вы просто определяете объект с опубликованными свойствами и с помощью класса TOmniXMLWriter сериализуете объект в файл или строку (загрузка с помощью TOmniXMLReader класс)

Сериализация поддерживает вложенные объекты, поэтому у вас могут быть сложные структуры, например, ваш xml может быть представлен следующими объектами:

type
  TAppProfiles = class(TCollection)
    ...
  end;

  TAppProfile = class(TCollectionItem)
    ...
  end;

  TAppSettings = class(TPersistent)
  private
    FCheckForUpdates: Integer;
    FCheckForUpdatesInterval: Integer;
    FShowSplashScreen: Boolean;
  published
    property CheckForUpdates: Integer read FCheckForUpdates write FCheckForUpdates;
    property CheckForUpdatesInterval: Integer read FCheckForUpdatesInterval write FCheckForUpdatesInterval;
    property ShowSplashScreen: Boolean read FShowSplashScreen write FShowSplashScreen;
  end;

  TAppConfiguration = class(TPersistent)
  private
    FProfiles: TAppProfiles;
    FSettings: TAppSettings;
  published
    property Profiles: TAppProfiles read FProfiles write FProfiles;
    property Settings: TAppSettings read FSettings write FSettings;
  end;

//Declare an instance of your configuration object
var
  AppConf: TAppConfiguration;

//Create it
AppConf := TAppConfiguration.Create;

//Serialize the object!
TOmniXMLWriter.SaveToFile(AppConf, 'appname.xml', pfNodes, ofIndent);

//And, of course, at the program start read the file into the object
TOmniXMLReader.LoadFromFile(AppConf, 'appname.xml');

Вот и все ... без написания ни одной строки xml самостоятельно ...

Если вы все еще предпочитаете «ручной» способ, взгляните на модули OmniXMLUtils или Fluent интерфейс с OmniXML (написанный Примозом Габриелчичем, автором OmniXML)

Ах .. публичное спасибо Primoz за эту превосходную библиотеку Delphi!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...