Лекция № 15
Тема: "Создание настраиваемых форм. Работа с INI файлами"
План
1. Назначение и структура .INI файла
2. Доступ к .INI файлам
3. Запись данных в .INI файл
4. Чтение данных из .INI файла
5. Удаление данных из .INI файлов
1. Назначение и структура .INI файла
Одним из условий популярности программного обеспечения на рынке является возможность адаптации интерфейса и режимов работы приложения под потребности конкретного пользователя. Часто в программе создается раздел меню Сервис с командой Параметры или Опции, с помощью которой можно настроить работу ПО. Такие настройки должны храниться и автоматически использоваться при всех последующих запусках программы.
Существует несколько способов сохранения настроек программ. Одним из них является использования файлов .INI. Microsoft не рекомендует работать с файлами .INI, а использовать только реестр. Впрочем, несмотря на это, приложения часто используют такие файлы. Да и разработки от самой компании Microsoft не обходятся без этих файлов.
Файлы .INI – это текстовые файлы, предназначенные для хранения информации о настройках разных приложений. Информация в файле логически группируется в разделы, каждый из которых начинается оператором заголовка, заключенным в квадратные скобки. В строках, идущих под заголовком, содержится информация о каком-то параметре программы (ключе) в виде:
ключ=значение
2. Доступ к .INI файлам
В Delphi работу с файлами .INI можно осуществлять с помощью создания в приложении объекта типа TIniFile. Этот тип описан в модуле IniFiles, который нужно подключать к приложению оператором Uses (автоматически это не делается).
Объект типа TIniFile имеет ряд методов для работы с .INI файлами. Для работы с.INI файлом нужно создать экземпляр объекта TIniFile, связав его с конкретным физическим файлом на диске. Для создания экземпляра объекта используют следующие действия:
TIniFile.Create(имя файла);
В качестве примера выше приведем код, который демонстрирует связывание объекта TIniFile с файлом на диске:
Uses . . ., IniFiles;
. . .
Var
. . .
//описываем переменную для хранения экземпляра объекта TIniFile
ini:TIniFile;
. . .
begin
. . .
//создаем экземпляр объекта TIniFile
//и связываем его с физическим файлом primer.ini,
//расположенным в папке с программой
ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'\primer.ini');
//выполняем нужные операции с .INI файлом
. . .
//удаляем из памяти ПК созданный объект TIniFile
ini.Free;
end;
В данном примере объект TIniFile связывается с файлом primer.ini, расположенным в папке с файлом программы. Для определения пути к файлу программы в Delphi есть стандартная функция вида:
ExtractFilePath(Application.ExeName)
Если при создании экземпляра объекта TIniFile указанного физического файла на диске не окажется, то файл будет создан автоматически.
3. Запись данных в .INI файл
Для записи значений ключей у объекта TiniFile существует несколько методов. Каждый из них записывает значение соответствующего типа. Объявление всех этих методов очень похожи.
//запись текстового параметра
ini.WriteString('раздел', 'ключ', 'значение');
//запись целого параметра
ini.WriteInteger('раздел', 'ключ', значение);
//запись вещественного параметра
ini.WriteFloat('раздел', 'ключ', значение);
//запись логического параметра (true/false)
ini.WriteBool('раздел', 'ключ', значение);
//запись даты
ini.WriteDate('раздел', 'ключ', значение);
//запись времени
ini.WriteTime('раздел', 'ключ', значение);
Если соответствующий раздел или ключ отсутствуют в файле, они автоматически создаются.
Пример. Пусть при закрытии формы нужно запоминать ее размер и положение на экране. Для этого в .INI файле создадим раздел "Form" с ключами "Width", "Height", "Х", "Y". Код напишем в событии закрытия формы.
uses . . ., IniFiles;
. . .
procedure TForm1.FormClose(Sender: TObject; Var Action: TCloseAction);
//описываем переменную для хранения экземпляра объекта TIniFile
var ini:TIniFile;
begin
//создаем экземпляр объекта TIniFile
ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'\primer.ini');
//записываем в файл ширину формы
ini.WriteInteger('Form','Width,Width);
//записываем в файл высоту формы
ini.WriteInteger('Form','Height,Height);
//записываем в файл положение формы по горизонтали
ini.WriteInteger('Form','X',Left);
//записываем в файл положение формы по вертикали
ini.WriteInteger('Form','Y',Top);
//удаляем из памяти экземпляр объекта TIniFile
ini.Free;
end;
4. Чтение данных из .INI файла
Для чтения значения ключей также есть несколько методов, предназначенных для работы с данными разных типов. К таким методам относятся:
//чтение текстового значения
ini.ReadString ('раздел', 'ключ', знач. по умолч.);
//чтение целого значения
ini.ReadInteger ('раздел', 'ключ', знач. по умолч.);
//чтение вещественного значения
ini.ReadFloat ('раздел', 'ключ', знач. по умолч.);
//чтение логического значения
ini.ReadBool ('раздел', 'ключэ, знач. по умолч.);
//чтение даты
ini.ReadDate ('раздел', 'ключ', знач. по умолч.);
//чтение времени
ini.ReadTime ('раздел', 'ключ', знач. по умолч.);
Параметр "знач. по умолч." определяет значение, которое возвращается в случае, если в файле не указано или не найдено значение соответствующего ключа.
Продолжим наш пример. Пусть при создании формы нужно прочитать записанные параметры формы и отобразить форму в соответствующем виде. Код напишем в событии OnCreate формы.
uses . . ., IniFiles;
. . .
procedure TForm1.FormCreate(Sender: TObject);
//описываем переменную для хранения экземпляра объекта TIniFile
var ini:TIniFile;
begin
//создаем экземпляр объекта TIniFile
ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'\primer.ini');
//считываем данные из файла и применяем к свойствам формы
//считываем ширину
Width:=ini.ReadInteger('Form','Width',Width);
//считываем высоту
Height:=ini.ReadInteger('Form','Height',Height);
//считываем положение по горизонтали
Left:=ini.ReadInteger('Form','X',Left);
//считываем положение по вертикали
Top:=ini.ReadInteger('Form','Y',Top);
//удаляем из памяти экземпляр объекта TIniFile
ini.Free;
end;
5. Удаление данных из .INI файлов
В Delphi есть методы для удаления данных из .INI файлов:
ini.DeleteKey ('ключ'); //удаляет ключ из .INI файла
ini.EraseSection ('раздел'); //удаляет раздел из .INI файла
Например, команда
ini.DeleteKey ('Form', 'Width');
удаляет из .INI файла ключ "Width".
Команда
ini.EraseSection ('Form');
удаляет из .INI файла раздел "Form".
Для удаления самого файла .INI нужно воспользоваться стандартными процедурами для работы с файлами:
//если удаляемый файл существует на диске, то
if FileExists(ExtractFilePath(Application.ExeName)+'\primer.ini') then
//то удаляем файл
DeleteFile(ExtractFilePath(Application.ExeName)+'\primer.ini');
Замечание:
Вопросы для самоконтроля
1. Дайте характеристику INI файлу.
2. В каком формате хранятся параметры в INI файлах?
3. Какой модуль надо подключить для работы по INI файлами? Опишите стандартные действия для работы c INI файлом.
4. Приведите команды записи и чтения данных в/из INI файла.
5. Приведите команды удаления данных из INI файла и самого файла с диска.