Опубликован: 07.04.2008 | Уровень: специалист | Доступ: платный
Лекция 18:

Сохранение параметров программы

< Лекция 17 || Лекция 18 || Лекция 19 >
Аннотация: В этой лекции вы познакомитесь с возможностью сохранять различные настройки программы в специальные ini-файлы.

Очень часто, особенно в крупных проектах, бывает необходимо сохранить некоторые настройки программы, чтобы потом их применить при повторной загрузке. Представьте себе такую ситуацию – вы написали программу для клиента. Он ее запустил, и она появилась в центре окна, как вы и планировали. Однако ему показалось это неудобным, и он сдвинул ее в сторону и уменьшил размеры окна, чтобы параллельно работать еще с каким-то приложением. Все прекрасно, программа делает свое дело и пользователь доволен. Однако, когда на следующий день он снова загрузит эту программу, она опять окажется по центру экрана, и будет иметь первоначальные размеры. Пользователю снова придется сдвигать ее в сторону и уменьшать размеры формы. Пустячок? Однако из таких вот пустячков и складывается мнение о программисте, и если мнение это будет плохим, заказчиков у вас не будет! Программист должен предусмотреть в своей программе все требования и желания пользователя, даже такие, о которых он и сам еще не догадывается. Ну скажите, как пользователь, заказавший вам программу может знать, что форма при программировании может занимать разное положение – по центру экрана или рабочего стола, или положение при разработке? Пока он не столкнется с вашей программой на практике, ему и в голову не придет указать вам, что программа должна запоминать свои настройки!

В самом простейшем случае требуется сохранить только 5 параметров – состояние окна (свернутое, развернутое), его положение от левой и верхней границы рабочего стола, его ширину и высоту. А если вы будете создавать более сложную программу, с панелью настроек, где есть куча чекбоксов и радиокнопок? Там пользователь может изменить ваши настройки "по умолчанию", и поставить собственные. Представьте, если пользователь потратил полчаса на то, чтобы настроить вашу программу "под себя", а при повторном запуске обнаружил, что все его настройки не сохранились!

Для сохранения пользовательских настроек существует два способа – ini-файлы и системный реестр Windows. Каждый из этих способов имеет свои плюсы и минусы.

Если вы сохраняете настройки в реестр Windows, то они скрыты от пользователя, следовательно, он ничего не сможет в них испортить. С другой стороны, если на компьютере зарегистрированы несколько пользователей, то каждый сможет изменить настройки программы "под себя". Минус в том, что если Windows будет переустановлена, придется переустанавливать и программу, так как она будет отсутствовать в реестре.

Если же вы сохраняете настройки в ini-файл, программа сохранит настройки и при переустановке операционной системы. Кроме того, сохранение настроек в ini-файл реализовать проще. В этой лекции мы научимся работать только с ini-файлами.

INI-файлы

У INI – файлов есть много преимуществ. С ними работать просто и удобно, они поддерживают три типа данных – String, Integer и Boolean. Кроме того, если бы мы сохраняли настройки в простой текстовый файл, то при изменении одной из настроек требовалось бы перезаписывать весь файл, а ini-файл позволяет перезаписать только этот параметр.

Конечно, есть и некоторые правила использования такого рода файлов.

Первым делом, если вы собираетесь работать с ini-файлами, в секцию uses, сразу под словом interface, требуется добавить модуль inifiles, в нем описаны все данные для работы с ini-файлами. Добавить модуль просто – после последнего указанного в списке модуля стоит точка с запятой. Замените ее на запятую, добавьте слово inifiles, а затем поставьте точку с запятой.

Далее. По умолчанию, ini-файлы создаются в директории, где установлен Windows. Там появляется файл с расширением *.ini и вашими настройками. Это не всегда удобно, особенно если предположить, что Windows может быть переустановлен. Гораздо лучше создавать файл в той директории, где установлена ваша программа. А как узнать эту директорию?

ExtractFilePath(Application.ExeName)

Изучим создание ini-файла на практике. Создайте новое приложение. В секцию uses добавьте модуль inifiles.

Прежде всего, пропишем сохранение параметров при закрытии программы. Для этого создайте обработчик события OnDestroy для формы. Такое событие случается при разрушении объекта форма, то есть, при завершении работы с программой. Создайте раздел var и пропишите там переменную типа ini-файл:

var
    ini : TIniFile;  //объявляем переменную типа inifile
begin

Далее мы должны создать файл, если его не существовало, или открыть его, если он уже есть:

ini := TInifile.Create(ExtractFilePath(Application.ExeName)+'my.ini');

Обратите внимание, что мы создаем файл в той же директории, откуда запущена программа. Если бы мы указали просто

ini := TInifile.Create('my.ini');

то файл был бы создан в директории Windows! Далее сохраним позицию окна, то есть свойства Left и Top формы:

//сохраняем позицию окна:
  ini.WriteInteger('Position', 'L', Form1.Left);
  ini.WriteInteger('Position', 'T', Form1.Top);

У ini-файла есть три процедуры для записи данных различных типов. WriteInteger, WriteString и WriteBool. Соответственно, эти функции записывают целое число, строку и логический тип. У этих функций есть по 3 параметра. Первый – это раздел ini – файла. В самом файле он выходит в квадратных скобках. Раздел вы можете назвать как угодно, не обязательно Position. Вторым параметром является название сохраняемого параметра, в примере этот параметр мы указали в виде букв 'L' и 'T', хотя можно было бы написать и 'Left', 'Top' или как-то иначе.

Третьим параметром функции является его значение. Поскольку свойства Left и Top формы имеют значения в виде целого числа, мы используем функцию для записи целых чисел WriteInteger. В результате приведенного примера в ini – файле появится надпись, подобная этой:

[Position]
L=14
T=50

Далее попробуем сохранить размеры формы (свойства Width и Height ). Для этого в ini– файле создадим раздел Size:

//сохраняем размеры окна:
  ini.WriteInteger('Size', 'W', Form1.Width);
  ini.WriteInteger('Size', 'H', Form1.Height);

После того, как мы сохранили параметры в ini- файл, его необходимо закрыть:

//закрываем файл:
  ini.Free;

Все, файл закрыт и настройки сохранены. Сохраните проект, откомпилируйте его и посмотрите, как он работает. Откройте созданный ini – файл, это простой текстовый файл, который вы сможете прочитать, и даже отредактировать.

Однако мы сделали только половину дела. Настройки то мы сохранили, а как их прочитать? Делается все это точно также, только наоборот. Вместо свойства разрушения формы используем свойство ее создания ( onCreate ), вместо записи используем чтение, и вместо того, чтобы значения свойств формы записывать в файл, мы будем читать их из файла и присваивать эти значения свойствам форм. Соответственно, мы имеем три процедуры считывания параметров из ini-файла: ReadInteger, ReadString и ReadBool.

Итак, делаем обработчик событий для формы onCreate:

{при создании формы}
procedure TForm1.FormCreate(Sender: TObject);
var
  ini : TIniFile;  //объявляем переменную типа inifile
begin
  //теперь создаем объект типа TIniFile:
  ini := TInifile.Create(ExtractFilePath(Application.ExeName)+'my.ini');
  //применяем позицию окна:
  Form1.Left := ini.ReadInteger('Position', 'L', 329);
  Form1.Top := ini.ReadInteger('Position', 'T', 261);
  //читаем  размеры окна:
  Form1.Width := ini.ReadInteger('Size', 'W', 384);
  Form1.Height := ini.ReadInteger('Size', 'H', 312);
  //закрываем файл:
  ini.Free;
end;

Здесь интересен третий параметр в функциях записи. Казалось бы, значения нам не нужны, мы берем их из указанных разделов. Но третий параметр обязателен, в нем указывается значение "по умолчанию".

При создании формы придайте ей подходящий размер и положение и посмотрите значения свойств Left, Top, Width и Height. Эти значения вы и запишете в качестве принятых по умолчанию. Если файла еще не было или произошла какая-то ошибка при чтении данного параметра, например, не найдена нужная строка, будет применяться значение по умолчанию. Если же нужная строка прочитана, то будет применяться то значение, которое указано в ней.

Сохраните проект, откомпилируйте его и посмотрите, как работает программа. Полученный ini-файл будет содержать такой текст:

[Position]
L=329
T=261
[Size]
W=384
H=312

Попробуйте перед запуском программы изменить какой-нибудь параметр, например, укажите

L=0

Или даже

L=-100

Затем запустите программу, и посмотрите, как изменится положение окна! Кстати, это хороший способ прятать программу. Если вы для свойства Left укажите большее число, чем имеет свойство Width (ширина окна), и при этом сделаете число отрицательным, окно программы как бы сдвинется влево за пределы экрана. Программа запущена, ее видно в системной строке, а окна то и нет!

Сдвиньте окно рабочей программы и выйдите из нее. Снова запустите – положение окна, которое было последним, сохранилось!

Давайте продолжим программу и создадим строковый параметр. Установите на форму компонент Label, в свойстве Caption которого напишите: "Введите новый заголовок окна". Ниже установите компонент Edit, в него пользователь будет вводить текст. Еще ниже – кнопку с надписью "Применить".

Удалите текст из компонента Edit, в обработчике кнопки напишите следующее:

Form1.Caption := Edit1.Text;

Предполагается, что вы не меняли названий формы или Edit. Если же вы сменили имя формы, к примеру, на fMain, то напишите

fMain.Caption

Далее, перейдите в редактор кода. В процедуре разрушения формы onDestroy сразу после записи высоты формы, перед закрытием файла, добавьте строки:

//сохраняем заголовок формы:
  ini.WriteString('Param', 'C', Form1.Caption);

А в процедуре onCreate, опять же, перед закрытием ini-файла, добавьте:

//читаем заголовок формы:
  Form1.Caption := ini.ReadString('Param', 'C', 'Программа');

Как видите, работа со строками мало отличается от работы с числами! Сохраните проект, скомпилируйте и посмотрите, как он работает. Введите новое название окна, нажмите кнопку "Применить", выйдите из программы и снова откройте ее. Текст в системной строке программы должен сохраниться.

Теперь поработаем с логическим параметром. Установите на форму один CheckBox. В его свойстве Caption напишите "Параметр". Нам, собственно, не важно, какой именно параметр можно сохранить, например, разрешать ли нажатие на кнопку, разрешать ли показ формы "О программе", видимый или невидимый будет какой-то компонент… Параметров, которые вы, возможно, захотите сохранить, может быть очень много. Сейчас нам важно одно: свойство Checked компонента CheckBox может быть либо True (параметр включен), либо False (параметр выключен). Вот это нам и нужно сохранить в ini-файл, а затем считать это из него.

Перед закрытием ini-файла в процедуре события onDestroy запомним состояние флажка:

//запоминаем флажок:
  ini.WriteBool('Param', 'CB1', CheckBox1.Checked);

Если флажок выключен, то вместо False в параметр ini-файла запишется 0. Если включен – запишется 1.

Теперь перед закрытием ini-файла в процедуре события onCreate добавим строки для считывания данных из ini-файла:

//читаем состояние флажка:
  CheckBox1.Checked := ini.ReadBool('Param', 'CB1', True);

По умолчанию, флажок у нас будет включен. Комментарии, думаю, излишни. Старайтесь включать сохранение параметров в каждую вашу программу.

< Лекция 17 || Лекция 18 || Лекция 19 >
Виктор Пелих
Виктор Пелих

Здравствуйте.
Прохожу курс "Введение в программирование на Delphi"
Добрался до Лекции 29: Введение в базы данных.

Установлена RAD Studio 11.3, у которой отсутствует вкладка BDE и, соответственно, компонент Table,  который обеспечивает доступ к таблице средствами механизма BDE.
Поиск в интернете подсказал 
BDE Installer for RAD Studio, Delphi, C++Builder 10.3 Rio
Подскажите, имеется ли ещё возможность использовать механизм BDE в Delphi11 и если такая возможность есть, как подключить BDE к Delphi11?
С уважением...

 

Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Данила Некрасов
Данила Некрасов
Россия, Пермь, ПНИПУ
Сергей Федоров
Сергей Федоров
Россия