Публикации Lazarus

Визуальное сохранение свойств объектов

29.04.2009
Лагунов А.А.

1. Введение

В процессе разработки графического интерфейса пользователя очень часто возникает ситуация, когда необходимо в промежутках между сеансами работы оператора сохранять введённые им данные в полях формы.

Классический подход к этой задаче подразумевает написание процедур для сохранения значений выбранных полей ввода при закрытии формы и процедур восстановления значений при повторном открытии окон.

В Delphi разработчики замечательной библиотеки RxLib в своё время реализовали механизм для визуальной автоматизации этого процесса.

В Lazarus эта хорошая мысль получила ожидаемое развитие — теперь механизмы такого сохранения/восстановления состояния компонентов встроены в саму LCL.

Данная статья — это обзор этой возможности и описание примера кода.

Во второй части находится обзор возможностей компонентов, их методов и свойств. В третей части — пошаговое описание создания примера работы.

2. Обзор

2.1. Абстрактно

Для работы с этой возможностью нам дано свойство TForm.SessionProperties. Именно в этом свойстве необходимо указывать список свойств, которые мы будем сохранять во время работы программы.

Формат перечисления — ИмяКомпоненты.ИмяСвойства. Друг от друга отделяются через точку с запятой.

Но чаще всего для заполнения этого списка используется встроенный редактор:


Иллюстрация 2.1: Общий вид проекта в разработке

Сам механизм сохранения реализован через другие компоненты — наследники от TFormPropertyStorage.

В стандартной поставке Lazarus идёт 2 таких компоненты.

По составу свойств и поведению они очень похожи. У обоих есть имя файла и секция или узел. Обе они предназначены для сохранения значения свойств, указанных в Tform.SessionProperties, в файл. Самое главное отличие между ними заключается в том, в каком формате они хранят данные:

  • TIniPropStorage — сохраняет значения в формате Windows ini-файла;
  • TXMLPropStorage — сохраняет значения в xml-файле.

Помимо сохранения значений свойств перечисленных в TForm.SessionProperties эти компоненты умеют сохранять значения произвольных параметров, которые перечислены в свойстве StoredValues. Оно имеется у всех компонентов, которые унаследованы от TformPropertyStorage.

2.2. Описание свойств компоненты TIniPropStorage

property StoredValues;
В данном свойстве указывается список дополнительных значений, которые необходимо сохранять между сеансами работы.

property IniFileName;
В данном свойстве указывается имя файла, в котором будет сохранены значения всех зарегистрированных на разрабатываемой форме свойств компонентов. Файл имеет структуру Windows ini-файла.

Если свойство не заполнено, то файл будет расположен:

  • Windows — в каталоге, рядом с исполняемым модулем программы. Имя файла будет равно имени файла исполняемной программы с расширением «.ini»;
  • Unix-подобные системы — скрытый файл в домашней папке пользователя. Имя файла будет начинаться с точки и равняться имени исполняемого файла программы.

property IniSection;
В данном свойстве указывается имя секции в INI файле. Если имя секции оставить пустым, то при сохранении в качестве имени секции будет использовано имя формы, из который сохраняются значения.

property Active;
Это свойство указывает, будет ли данный компонент производить сохранение данных или нет.

2.3. Описание свойств компоненты TXMLPropStorage

property StoredValues;
В данном свойстве указывается список дополнительных значений, которые необходимо сохранять между сеансами работы.

property FileName;
В данном свойстве указывается имя файла, в котором будет сохранены значения всех зарегистрированных на разрабатываемой форме свойств компонентов. Файл имеет структуру Windows ini-файла.

Если свойство не заполнено, то файл будет расположен:

  • Windows — в каталоге, рядом с исполняемым модулем программы. Имя файла будет равно имени файла исполняемой программы с расширением «.xml»;
  • Unix-подобные системы — скрытый файл в домашней папке пользователя. Имя файла будет начинаться с точки и равняться имени исполняемого файла программы.

property RootNodePath;
В данном свойстве указывается имя узла в XML файле. Если имя узла оставить пустым, то при сохранении в качестве этого имени будет использовано имя формы, из которой сохраняются значения.

property Active;
Это свойство указывает, будет ли данный компонент производить сохранение данных или нет.

3. Пример

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

В главном меню IDE Lazarus выбираем «Проект/Создать проект...». В открывшемся окне выбора типа проекта выбираем «Приложение» - будет создан обычный проект для создания программы с графическим пользовательским интерфейсом.

На форму программы положим компоненты TEdit — строки ввода текста, TLabel — подписи к строкам, TRadioGroup — компонент для выбора одного пункта из списка и несколько TCheckBox — для выбора состояний. Расположим элементы как указано на рисунке 3.1:


Иллюстрация 3.1: Форма во время разработки

После этого откроем редактор свойства SessionProperties главной формы программы (см. рисунок 3.2). Этот редактор состоит из трёх списков.

В верхней части формы слева находится список компонентов, расположенных на форме. При выборе в этом списке компоненты (на рисунке CheckBox1) в правом списке отображается свойства данного компонента, которые мы можем сохранять. Для выбора свойства к сохранению достаточно щёлкнуть кнопку «Добавить» или просто двойной клик мышкой по данному свойству. В результате имя свойства будет перенесено в нижний список.

Именно в нижнем списке находится полный список свойств, которые будут сохраняться между сеансами работы программы.


Иллюстрация 3.2: Редактор свойства SessionProperties

После перечисления всех свойств можно запускать программу на выполнение. Значение всех элементов ввода данных будут сохранены при завершении работы программы. Повторный запуск восстановит эти значения.

Ниже приведён снимок экрана во время выполнения программы:


Иллюстрация 3.3: Вид программы во время работы

Дополнительно все наследники TFormPropertyStorage (в примере TIniPropStorage) обеспечивают функционал сохранения произвольных значений между сеансами работы. Обеспечивается это с помощью свойства StoredValues. В нём предварительно заводятся для каждого сохраняемого значения элемент. Само сохранение удобно делать с помощью события:
property OnSaveProperties.

Восстановление значений можно делать с помощью события:
property OnRestoringProperties.

Более подробно всё это расписано в примере, который идёт с данным руководством.

4. Заключение

Приведённый механизм позволяет значительно облегчить процесс написания программ и экономит массу времени при написании кода.


Исходный код проекта.

Актуальные версии
FPC3.2.2release
Lazarus3.2release
MSE5.10.0release
fpGUI1.4.1release
links