В последнее время приходится довольно много времени проводить в Lazarus’е. Пишем втроем большой программный комплекс для экологов с базой данных, кучей расчётных модулей, импортом/экспортом документов и т.д. В общем работа кипит. Естественно проект рассчитан на работу в разных операционных системах (пока компилируем под Win32 и Linux).
Несмотря на то, что большинство компонентов и модулей в Lazarus соответствуют по своим функциям одноименным компонентам и модулям в Delphi, иногда попадаются и довольно интересные новые решения, которые почему-то не нашли реализации ни у Borland, ни у CodeGear и даже у Embarcadero. Хотя зря.
Вот, например, работа с индивидуальными настройками приложения. Помнится был в блоге пост от Серёги где он разрабатывал компонент для работы с опциями. Довольно актуальная тема для программистов. Компонент позволяет значительно экономить время при разработке, не приходится лишний раз заморачиваться над работой с реестром или Ini-файлами и т.д. Почему это не было реализовано теми же разработчиками Delphi? Остается только гадать. А вот, что предлагают нам разработчики Lazarus’а.
1. Компоненты для сохранения индивидуальных настроек INIPropStorage и XMLPropStorage.
Компоненты предназначены для сохранения и восстановления индивидуальных настроек объектов (это может быть TForm или любой другой контрол на форме).
Как понятно из названия самих компонентов, первый хранит настройки в INI-файлах, второй — в XML. Работают они абсолютно идентично — всё зависит от Ваших предпочтений и потребностей. Например, мы активно используем INIPropStorage.
Рассмотрим как можно воспользоваться компонентом. Например, для сохранения положения и размеров формы.
1. Создаем новый проект. И укладываем на форму компонент INIPropStorage и задаем ему свойство INIFileName, например options.ini.
2. Теперь выбираем в инспекторе объектов нашу форму и переходим к свойству SessionProperties. Перед Вами должен открыться редактор:
Выбираете в списке слева форму или любой другой контрол и справа появится список всех его свойств, доступных для хранения.
3. Выбираем необходимый свойства и жмем кнопку «Добавить»
4. Компилируем и запускаем проект.
Теперь все свойства, которые вы занесли в SessionProperties будут автоматически сохраняться в ini-файле.
Так, например, выглядит содержимое INI-файла с сохраненными свойствами Form1:
После повторного запуска приложения сохраненные свойства будут автоматически применены. Как видите, при такой организации работы практически полностью пропадает необходимость в постоянной работе с настройками. Достаточно один раз определиться с тем, какие свойства хранить и всё — остальное делается автоматически.
Свойство StoredValues
Иногда может потребоваться сохранение свойств, напрямую не имеющих отношения к какому-либо контролу. Например, свойство Checked у CheckBox’а может меняться в зависимости от выбора пользователем тех или иных свойств или ввода данных.
Для таких случаев можно хранить свойства отдельно в StoredValues. Рассмотрим работу со StoredValues на простом примере.
1. Укладываем на форму компонент CheckBox
2. Открываем у INIPropStorage редактор свойств StoredValues и добавляем новой свойство для хранения. Например, я задал следующие параметры: Name=»item0_checked», Value=»-1″
3. Пишем обработчики
procedure TForm1.FormShow(Sender: TObject); begin CheckBox1.Checked:=StrToBool(IniPropStorage1.StoredValue['item0_checked']); end;
На OnClose формы:
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin INIPropStorage1.StoredValue['item0_checked']:= BoolToStr(CheckBox1.Checked); end;
Теперь компилируем и запускаем проект. В запущенном приложении меняем состояние CheckBox’а и после закрытия форму его состояние автоматически запишется в StoredValues. Подобным образом можно хранить абсолютно любые данные в одном файле. Единственное, что приходится всегда учитывать — это то, что все хранимые свойства необходимо приводить к нужному виду.
Работа с INI-файлом напрямую
Если уж Вам не хватит функциональности компонента и потребуется читать/записывать данные в файл самостоятельно, то тут опять же не возникнет никаких сложностей. INIPropStorage может читать/записывать данные в файл напрямую из приложения. Для этого у компонента предусмотрены соответствующие методы Read/Write, которые работают точно также как и у простых объектов TINIFile с которыми Вы, надеюсь, достаточно знакомы по Delphi. Есть только одно изменение — перед записью необходимо отдельно указать секцию. Например так:
with MainForm.IniPropStorage1 do begin IniSection:='LoginInfo'; //указываем секцию WriteBoolean('AutoLogin',CheckBox1.Checked); WriteString('Login',Edit4.Text); WriteString('Password',Edit5.Text); IniSection:='ConnectInfo'; //указываем секцию WriteString('IP',Edit1.Text); WriteString('DBName',Edit2.Text); WriteInteger('Port',StrToInt(Edit3.Text)); end;
Аналогичным образом проводится и чтение данных.
Вот так запросто можно автоматически сохранять необходимые настройки приложения, отдельные данные, информацию о пользователе и т.д. Будем надеяться, что в будущем и у Delphi появятся такие же пусть и мелкие, но полезные компоненты.
Вот зрелое решение для Delphi:http://deepsoftware.ru/rsllib/overview.html
Мдя, штука хорошая…ток за бабло :) Да и, в принципе, мне сейчас особо не пригодится, т.к. пахать приходится на два фронта: Linux и Windows. В целом INIPropStorage легко и не принужденно хранит сразу наборы свойств, например у меня сейчас в одной программе сохраняются в INI настройки столбцов DBGrid’а :) Выглядит страшновато, но работает «на ура»
Абсолютно аналогичная штуковина есть в JVCL. Я даже подозреваю, что именно оттуда она перекочевала в Lazarus.
Скорее наоборот :) в Lazarus эти компоненты уже давненько есть, практически с самого начала, судя по описанию.
[…] поэтому вот ссылки на источники в интернете: http://www.webdelphi.ru http://www.freepascal.ru Теги ini, lazarus, windows Категория Новости, […]
Жаль, что TreeView не умеет сохранять :(
[…] lazarus dbgrid checkbox […]