Синий, синий INI`й...

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

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

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

Работа с файлами инициализации представляет собой работу с обычными текстовыми файлами. То есть в программе объявляется файловая переменная, которая связывается с физическим файлом на диске. Для работы с инициализационными файлами в Delphi служит класс TIniFile. И для того чтобы нам можно было работать с файлами инициализации нужно в раздел Uses модуля подключить модуль IniFiles.

Вот примерно так выглядит ini-файл:

[Application] ; Имя раздела - секции.
String=Строка ; Имена параметров и их значения.
Integer=0
Float=10,1
Date=23.11.03
Time=16:09:42
BoolTrue=1
BoolFalse=0

Ну, а теперь приступим к рассмотрению того, как работать с ini-файлами из своей программы. После того как мы подключили модуль IniFiles в раздел Uses нашего модуля нам необходимо объявить специальную переменную. Мы так и назовем ее IniFile.

...
Var Inifile: TIniFile;
...

Перед любыми действиями с инициализационным файлом следует создать объект типа TIniFile, для чего используют метод Create. Этот метод создает в приложении экземпляр класса TIniFile, связывая его с файлом инициализации. Если файл инициализации на диске отсутствует, то он создается заново. Сохраняется он автоматически в системный каталог Windows. Чтобы это избежать, нужно применить один хитрый шаг, см. ниже.

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

procedure TForm1.btnWriteIniFileClick(Sender: TObject);
begin
 // Создаем ini-файл в текущей директории
 iniFile:=TIniFile.Create(ExtractFilePath(Application.ExeName) + 'IniFile.ini');
 // Записываем строку
 IniFile.WriteString('Application', 'String', 'Строка');
 // Записываем целое число
 IniFile.WriteInteger('Application', 'Integer', 0);
 // Записываем дробное число
 IniFile.WriteFloat('Application', 'Float', 10.10);
 // Записываем текущую дату
 IniFile.WriteDate('Application', 'Date', Date);
 // Записываем текущее время
 IniFile.WriteTime('Application', 'Time', Time);
 // Записываем логическое True
 IniFile.WriteBool('Application', 'BoolTrue', True);
 // Записываем логическое False 
 IniFile.WriteBool('Application', 'BoolFalse', False);  
end;

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

procedure TForm1.btnReadIniFileClick(Sender: TObject);
begin
 // Открываем ini-файл в текущей директории  
 iniFile:=TIniFile.Create(ExtractFilePath(Application.ExeName) + 'IniFile.ini');
 // Считываем строку
 Edit1.Text:=IniFile.ReadString('Application', 'String', 'Строка');
 // Считываем целое число
 Edit2.Text:=IntToStr(IniFile.ReadInteger('Application', 'Integer', 0));
 // Считываем дробное число
 Edit3.Text:=FloatToStr(IniFile.ReadFloat('Application', 'Float', 10.10));
 // Считываем дату
 Edit4.Text:=DateToStr(IniFile.ReadDate('Application', 'Date', Date));
 // Считываем время
 Edit5.Text:=TimeToStr(IniFile.ReadTime('Application', 'Time', Time));
 // Считываем логическое True
 If IniFile.ReadBool('Application', 'BoolTrue', True) = True 
   Then Edit7.Text:='True';
 // Считываем логическое False
 If IniFile.ReadBool('Application', 'BoolFalse', False) = False
   Then Edit8.Text:='False';
end;

И так же аналогичным образом можно записывать в ini-файл некоторые параметры в зависимости от внесенных изменений пользователем. Например, при выборе переключателя "Автосохранение положения формы" записать его соответствующий признак и на основании этого признака записывать при выходе из программы координаты формы, ее длину и ширину. А при запуске программы их заново считать и присвоить координатам формы. И как пример, хочу предложить Вашему вниманию сохранение и восстановление положения формы двумя различными способами.

// Сохраняем положение и размеры формы
procedure TForml.FormDestroy(Sender: TObject);
Var iniFile : TIniFile;
begin
 iniFile:=TiniFile.Create(ExtractFilePath(Application.ExeName) + 'IniFile.ini');
 iniFile.WriteInteger('Position', 'Top', Top);
 iniFile.WriteInteger('Position', 'Left', Left);
 iniFile.WriteInteger('Position', 'Height', Height);
 iniFile.WriteInteger('Position', 'Width', Width);
 iniFile.Free;
end;
// Восстанавливаем положение и размеры формы первым способом
procedure TForml.FormCreate(Sender: TObject);
Var iniFile : TIniFile;
begin
 iniFile:=TIniFile.Create(ExtractFilePath(Application.ExeName) + 'IniFile.ini');
 // Проверяем нет ли пустых значений
  If (iniFile.ReadString('Position', 'Top', IntToStr(Forml.Top)) = '')
    OR (iniFile.ReadString('Position', 'Left', IntToStr(Forml.Left)) = '')
      OR (iniFile.ReadString('Position', 'Height', IntToStr(Forml.Height)) = '')
        OR (iniFile.ReadString('Position', 'Width', IntToStr(Forml.Width)) = '')
          Then WindowState:=wsMaximized
  Else
    Begin
      WindowState:=wsNormal;
      Top:=StrToInt(iniFile.ReadString('Position', 'Top', IntToStr(Forml.Top)));
      Left:=StrToInt(iniFile.ReadString('Position', 'Left', IntToStr(Forml.Left)));
      Height:=StrToInt(iniFile.ReadString('Position', 'Height', IntToStr(Forml.Height)));
      Width:=StrToInt(iniFile.ReadString('Position', 'Width', IntToStr(Forml.Width)));
    End;
end;
// Восстанавливаем положение и размеры формы вторым способом
procedure TForm1.FormCreate(Sender: TObject);
Const NoFind = -1000;
Var iniFile               : TIniFile;
    Not_Left, Not_Top     : Integer;
    Not_Height, Not_Width : Integer;
begin
 iniFile:=TIniFile.Create(ExtractFilePath(Application.Exename) + 'IniFile.ini');
 // Проверяем нет ли пустых значений
 Not_Left:=iniFile.ReadInteger('Position', 'Left', NoFind);
 Not_Top:=iniFile.ReadInteger('Position', 'Top', NoFind);
 Not_Height:=iniFile.ReadInteger('Position', 'Height', NoFind);
 Not_Width:=iniFile.ReadInteger('Position', 'Width', NoFind);

 If (Not_Left = NoFind) OR (Not_Top = NoFind)
   OR (Not_Height = NoFind) OR (Not_Width = NoFind)
     Then Form1.Position:=poScreenCenter;
 Else
   Begin
     Left:=iniFile.ReadInteger('Position', 'Left', Left);
     Top:=iniFile.ReadInteger('Position', 'Top', Top);
     Height:=iniFile.ReadInteger('Position', 'Height', Height);
     Width:=iniFile.ReadInteger('Position', 'Width', Width);
   End;
 iniFile.Free;
end;

Таким образом, перед тем как задать только что считанные значения, из файла инициализации, координатам формы, делаем проверку, нет ли пустых значений. Если пустые значения существуют, то это означает, что координаты формы не были сохранены ранее, либо удалены умышленно. Тогда "принудительно" заставляем развернуться форму, в первом примере, в полный экран, и центрироваться, во втором примере.

Вернуться в оглавление
Вернуться на главную страницу
Hosted by uCoz