Download Cheap MP3    Карта Германии    Map of Germany
Он-лайн учебник по Borland Delphi

Канарские острова  free hosted forums  форум вебмастеров  бесплатный хостинг 

Sneakers - это: delphi компоненты, исходники, статьи, учебники,
программы; новости программирования, документация, компьютерная литература, коллекция алгоритмов,
электронный магазин, F.A.Q, Форум.
Главная Новости Delphi Учебники База E-магазин F.A.Q Форум
Урок16. 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

... Предыдущая глава *** Следующая глава...