В последнее время приходится довольно много времени проводить в 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 появяться такие же пусть и мелкие, но полезные компоненты.
Мой блог находят по следующим фразам
- ecxel обновить WorkSheet Calculate
- Программа для пингов
- rad 2010 help update 1 скачать
- клавиатурный шпион пример на Delphi
- webbrowser вставка текста в html delphi
- сохранение настроек приложения в Lazarus
Нашел в Сети довольно интересный новый проект для блоггеров Bloggers.su - форум блоггеров. Всем советую зарегистрироваться в проекте - очень многообещающий проект, а ворум - только одна из составных частей.
| Делись! | Загружай! | Плюсуй! |
| | |









28 Ноя 2009 в 12:48 пп
Вот зрелое решение для Delphi:
28 Ноя 2009 в 3:36 пп
Мдя, штука хорошая…ток за бабло :) Да и, в принципе, мне сейчас особо не пригодится, т.к. пахать приходится на два фронта: Linux и Windows. В целом INIPropStorage легко и не принужденно хранит сразу наборы свойств, например у меня сейчас в одной программе сохраняются в INI настройки столбцов DBGrid’а :) Выглядит страшновато, но работает «на ура»
17 Янв 2010 в 5:29 пп
Абсолютно аналогичная штуковина есть в JVCL. Я даже подозреваю, что именно оттуда она перекочевала в Lazarus.
17 Янв 2010 в 5:35 пп
Скорее наоборот :) в Lazarus эти компоненты уже давненько есть, практически с самого начала, судя по описанию.