Уроки по Delphi


Ini файлы


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

TIniFile является низкоуровневым 16-битным классом, совместимым с операционной системой windows 3.x файловой системы хранения параметров в INI файлах. Для хранения параметров в современных программах рекомендуется использовать реестр. Но, как правило, не так просто такую программу скопировать на другой компьютер с переносом всех настроек, а совместное копирование ini файла избавит вас от такой проблемы.

Класс TIniFile находится в модуле IniFiles, который надо указывать в разделе подключаемых модулей Uses.

Объявление переменной, в которую будем заносить (или читать) данные:

Var IniFile : TIniFile;

где: IniFile - любой идентификатор, который будет использоваться в программе. Можно, например, для сокращения просто i.

Дальше переменную необходимо создать:

IniFile := TIniFile.Create('Название_файла');

где: Название_файла - файл, в котором будут храниться данные. Если вы напишите, например project.ini без указания пути к файлу, то такой файл создастся или будет читаться из каталога WINDOWS. Для размещения ini файла в каталоге программы, или относительно его (например КАТАЛОГ_ПРОГРАММЫ\INI) указывайте вместе с названием файла текущий каталог программы.

В конце использования переменной ее необходимо уничтожить и освободить занимаемую память. Это делается одной командой:

IniFile.Free;

В промежутке между созданием и уничтожением переменной IniFile находятся команды чтения (записи) параметров.






Если мы заглянем в любой файл настроек, например win.ini, то можно увидеть следующую архитектуру файла:

[windows]

NullPort=None

ILOVEBUNNY32=1

ScreenSaveActive=1

[Desktop]

Wallpaper=(None)

TileWallpaper=0

WallpaperStyle=0

[Intl]

iCountry=380

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

Чтение параметров:

Все команды чтения параметров являются функциями, т.е. сами возвращают требуемые значения.

Для чтения параметра Integer (целочисленной величины):

ПЕРЕМЕННАЯ_Integer:=IniFile.ReadInteger(СЕКЦИЯ,ПАРАМЕТР,ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ);

где: СЕКЦИЯ и ПАРАМЕТР - строковые значения. На из месте можно писать как саму строковую величину, например 'MAINPARAM', так и подставлять строковую переменную.

Если не обнаружится данного ini файла, или не обнаружится указанной секции, или в секции не будет заданного параметра, то функция возвращает значение_по_умолчанию. Это свойство очень удобно для задания в программе начальных значений.

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

ReadString - чтение строковой переменной

ReadBool - чтение логической переменной

ReadDate - чтение даты

ReadTime - чтение времени

ReadDateTime - чтение даты и времени в одном параметре

ReadFloat - чтение числа с плавающей точкой

Запись параметров:

Все команды записи параметров являются процедурами. Они не возвращают никаких параметров, и, в случае неудачной попытки записи, программа выдает сообщение об ошибке.

Для записи параметра Integer:

IniFile.WriteInteger(СЕКЦИЯ,ПАРАМЕТР,ЗАПИСЫВАЕМАЯ_ВЕЛИЧИНА);

Далее для записи других типов данных:


WriteString - запись строковой переменной

WriteBool - запись логической переменной

WriteDate - запись даты

WriteTime - запись времени

WriteDateTime - запись даты и времени в одном параметре

WriteFloat - запись числа с плавающей точкой

Рассмотрим пример.

Создаем новый проект, в форму Form1 помещаем компоненты Edit, ComboBox, два компонента CheckBox, две кнопки BitBtn.
Для компонента ComboBox1 изменяем свойство Style в csDropDownList и редактируем свойство Items, занося туда несколько произвольных строк. Дальше для BitBtn1 свойство Caption изменяем на Сохранить, а для кнопки BitBtn2 - Восстановить. Окно принимает вид, показанный на рисунке.
В процедуре события  FormCreate для окна Form1 пишем команду
ReadParams;
В процедуре события FormClose для окна Form1 пишем команду
WriteParams;
В процедуре нажатия на кнопку "Сохранить" аналогично закрытию окна команда WriteParams, для кнопки "Восстановить" - ReadParams.
Дальше привожу текст модуля Unit1 обратите внимание на выделенные строки. Их следует прописать вручную.
// ----------------Начало модуля Unit1------------------
unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Buttons, inifiles; // подключение модуля, позволяющего работать с ini файлами

type

TForm1 = class(TForm)

Edit1: TEdit;

ComboBox1: TComboBox;

CheckBox1: TCheckBox;

CheckBox2: TCheckBox;

BitBtn1: TBitBtn;

BitBtn2: TBitBtn;

procedure ReadParams; // процедура чтения параметров

procedure WriteParams; // процедура записи параметров

procedure FormCreate(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure BitBtn1Click(Sender: TObject);

procedure BitBtn2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.ReadParams;

Var IniFile:TIniFile; // объявление переменной, через которую будут обрабатываться данные


begin

IniFile:=TIniFile.Create('project.ini'); // создаем переменную

Form1.Top:=IniFile.ReadInteger('FORM1','Form1Top',Form1.Top); // верхнее положение окна

Form1.Left:=IniFile.ReadInteger('FORM1','Form1Left',Form1.Left); // левое положение окна

Form1.Height:=IniFile.ReadInteger('FORM1','Form1Height',Form1.Height); // высота

Form1.Width:=IniFile.ReadInteger('FORM1','Form1Width',Form1.Width); // ширина

Edit1.Text:=IniFile.ReadString('FORM1','Edit1Text',Edit1.Text); // текст в Edit1

ComboBox1.ItemIndex:=IniFile.ReadInteger('FORM1','ComboBox1ItemIndex',ComboBox1.ItemIndex); // выбранный пункт

CheckBox1.Checked:=IniFile.ReadBool('FORM1','CheckBox1Checked',CheckBox1.Checked); // состояние CheckBox1

CheckBox2.Checked:=IniFile.ReadBool('FORM1','CheckBox2Checked',CheckBox2.Checked); // состояние CheckBox2

IniFile.Free; // если сами создаем, то сами уничтожаем.

end;

procedure TForm1.WriteParams;

Var IniFile:TIniFile;

begin

IniFile:=TIniFile.Create('project.ini');

IniFile.WriteInteger('FORM1','Form1Top',Form1.Top);

IniFile.WriteInteger('FORM1','Form1Left',Form1.Left);

IniFile.WriteInteger('FORM1','Form1Height',Form1.Height);

IniFile.WriteInteger('FORM1','Form1Width',Form1.Width);

IniFile.WriteString('FORM1','Edit1Text',Edit1.Text);

IniFile.WriteInteger('FORM1','ComboBox1ItemIndex',ComboBox1.ItemIndex);

IniFile.WriteBool('FORM1','CheckBox1Checked',CheckBox1.Checked);

IniFile.WriteBool('FORM1','CheckBox2Checked',CheckBox2.Checked);

IniFile.Free;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

ReadParams;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

WriteParams;

end;

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

WriteParams;

end;

procedure TForm1.BitBtn2Click(Sender: TObject);

begin

ReadParams;

end;

end.
// ----------------Конец модуля Unit1------------------
Вышерассмотренный пример можно забрать по этой ссылке (2 Кб).
Запустите программу несколько раз и проследите за восстановлением внешнего вида программы. Попробуйте сохранять и восстанавливать параметры с помощью кнопок.


Для нашего примера создается файл project.ini, который находится в каталоге WINDOWS. Просмотрите его содержимое. У меня он получился такой.
[FORM1]

Form1Top=256

Form1Left=147

Form1Height=301

Form1Width=368

Edit1Text=111

ComboBox1ItemIndex=2

CheckBox1Checked=1

CheckBox2Checked=0
Если у вас в программе несколько окон, параметры которых необходимо сохранять все в том же окне, то используйте различные секции с названиями соответствующих окон, например программа с двумя окнами будет "запоминать" свое состояние следующим образом:
[FORM1]

Form1Top=100

Form1Left=100

Form1Height=300

Form1Width=500
[FORM2]

Form1Top=200

Form1Left=200

Form1Height=100

Form1Width=200

Итак, файл project.ini пишется и читается в каталоге WINDOWS. Следующий пример позволяет построить путь к файлу ini относительно каталога, где находится ваша запущенная программа. Этот кусок программы помещается до создания IniFile, и еще необходимо объявить строковую переменную Path.
Var Path:String; // Переменная, где будет храниться путь к программе

...

Path:=Application.ExeName; // полный путь и название запущенной программы

Path:=ExtractFileDir(Path); // отбрасываем название программы. Остается путь.

if Path[Length(Path)]<>'\' then Path:=Path+'\'; // если последний символ не \ то добавить его

{Последняя строка нужна для присвоения последнего символа '\',

потому что при обрезке файла 'C:\PROG.EXE' получим 'C:\',

а при обрезке 'C:\WINDOWS\PROG.EXE' получим 'C:\WINDOWS' }

IniFile:=TIniFile.Create(Path+'project.ini'); // полный путь к программе и имя ini файла
Теперь ini файл лежит недалеко от запускаемой программы.
С уважением, ведущий уроков Semen semen@krovatka.net

Содержание раздела