Для хранения некоторых данных, например
параметров программы, как это было рассмотрено в предыдущем уроке, для последующего
их использования можно применять реестр или 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;
В промежутке между созданием и уничтожением
перCенной 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 файл лежит недалеко от запускаемой
программы.
© www.nmarket.ru - при перепечатке прямая ссылка обязательна