TIniFile


       В то время как Microsoft, без сомнений, хотела бы навсегда устранить INI-файлы из Windows и заставить разработчиков приложений хранить информацию в Registry, становится ясно, что какое-то время INI-файлы еще просуществуют. INI-файлы являются простыми текстовыми файлами с расширением .INI, обычно хра- нящимися в каталоге Windows. Они разработаны для запоминания информации о прикладных программах, их параметрах, конфигурации, положении окон и т.п. По мере роста популярности Windows и роста числа поддерживаемых приложений, большинство пользователей обзавелось десятками INI-файлов, засоряющих жесткий диск. К счастью, они не требуют много места и по-прежнему являются удобным способом запоми- нания параметров конфигурации. Таким образом, INI-файлы реально экономят время.
       Если вы разрабатываете большое и сложное приложение со многими конфигурируемыми пользователем параметрами, то все-таки лучше воспользоваться доступом к Windows Registry при помощи класса TRegistry, чем полагаться на рудиментарные INI-файлы, так распространенные в старых версиях Windows. TRegistry освещается в главе 6, "TRegistry и TRegIniFile."
       INI-файлы инкапсулируются классом TIniFile, который является прямым конечным потомком TObject. Для использования класса TIniFile и любого его члена необходимо включить IniFiles в пункт uses того модуля, который получает доступ к INI-файлам.
       INI-файлы разделены на поименованные разделы, содержащие идентификаторы. Каждому идентифика- тору можно присвоить значение. Обычно значение является двоичным, целым или строковым. В листинге 4-1, фрагменте типичного файла WIN.INI, разделы идентифицируются квадратными скобками, окружающими имя каждого раздела. WIN.INI использован только как пример. Ваше приложение, как правило, должно поддерживать собственный INI-файл.

Листинг 4-1 Раздел типичного файла WIN.INI

[windows]
run=
NullPort=None
load=
device=LaserJet 5P, HPPCL5MS, LPT1:
[desktop]
Wallpaper=(None)
TileWallpaper=1
WallpaperStyle=O
Pattern=(None)
[Intl]
iCountry=1
ICurrDigits=2
iCurrency=0
iDate=0
iDigits=2
iLZero=1
iMeasure=1
iNegCurr=0
iTime=0
iTLZero=0
.................

     Как видно из примера, идентификаторы отделены от своих значений знаком равенства и имеют вид идентификатор=значение. Такое выражение известно как ключ.
Таблица 4-1 показывает свойства и методы, реализуемые TIniFile.

Таблица 4-1 Методы и свойства реализуемые TIniFile

Использовать или установить это ...

Чтобы сделать это ...

Наследование

Create

Сконструировать экземпляр TIniFile.

TObject

DeleteKey

Удалить идентификатор INI-файла и его значение.

Нет

EraseSection

Убрать из INI-файла целый раздел.

Нет

FileName

Получить инкапсулированное имя INI-файла.

Нет

ReadBool

Извлечь из INI-файла логическое значение.

Нет

Readinteger

Извлечь из INI-файла целое значение.

Нет

ReadSection

Извлечь из раздела INI-файла имена идентификаторов.

Нет

ReadSections

Извлечь из INI-файла список имен разделов.

Нет

ReadSectionValues

Извлечь из INI-файла все содержимое раздела.

Нет

ReadString

Извлечь из INI-файла строковое значение.

Нет

WriteBool

Записать в INI-файл логическое значение.

Нет

Writeinteger

Записать в INI-файл целое значение

Нет

WriteString

Записать в INI-файл строковое значение

Нет

Важно

Методы ТIniFile будут пытаться найти INI-файл в каталоге Windows (обычно c:\WINDOWS в Windows 95 или c:WINNT в Windows NT). Если вы хотите читать или писать INI-файл, расположенный не в каталоге Windows, следует явно добавить путь к имени INI-файла при его открытии в Create.


 

Метод Create


Затрагиваемые объекты

TIniFile

Назначение

Метод Create создает экземпляр TIniFile, который позволяет манипулировать INI-файлом.

Объявление

constructor Create (const FileName: string);

Параметры

FileName

Имя INI-файла, с которым ассоциируется объект TIniFile.

Пример синтаксиса

procedure TForm1.FormCreate (Sender: TObject);
var MyIni: TIniFile;
begin
  //создание экземпляра Myini и присвоение ему //INI-файла
  MyIni : = TIniFile;
  Create('TEST.INI');
  // *** Здесь выполнить обработку INI-файла ***
  MyIni.Free;
end;

Описание;

Create конструирует объект TIniFile, распределяя для него достаточный объем памяти. Единственный параметр, fileName, содержит Windows имя файла действительного INI-файла. Если к имени файла не добавлен путь, программа будет искать файл в каталоге Windows (обычно c:\WINDOWS или c:\WINNT).

Метод DeleteKey


Затрагиваемые объекты

TIniFile

Назначение

Метод DeleteKey удаляет ключ из INI-файла.

Объявление

procedure DeleteKey(const Section, Ident: String);

Параметры

Section

Раздел INI-файла, который содержит ключ.

Ident

Имя удаляемого идентификатора.

Пример синтаксиса

procedure TForm1.Button1Click(Sender: TObject);
var Myini : TIniFile;
begin
  MyIni : = TIniFile.Create('DELETE.INI');
  // Удалить ключ, содержащий идентификатор Option1 из раздела
  // Main INI-файла
  MyIni.DeleteKey('Main','Option1');
  MyIni.Free;
end;

Описание

DeleteKey очищает целый ключ, идентификатор и его значение.

Метод EraseSection


Затрагиваемые объекты

TIniFile

Назначение

Метод EraseSection удаляет указанный раздел INI-файла.

Объявление

procedure ErageSection(const Section: string);

Параметры

Section

Имя раздела, подлежащего удалению.

Пример синтаксиса

// данная процедура откроет INI-файл с именем " TEST.INI", найденный в
// каталоге Windows, и удалит раздел под названием Configuration

procedure TForm1.Button1Click(Sender: TObject);
// объявление переменной типа TIniFile под названием MyIni
var MyIni: TIniFile;
begin
  // создание экземпляра MyIni и присвоение ему INI-файла
  MyIni := TIniFile.Create('TEST.INI');
  // Удалить раздел в TEST.INI под названием Configuration
  MyIni.EraseSection('Configuration');
  MyIni.Free;
end;

Описание

EraseSection удаляет весь раздел INI-файла. Имена разделов отмечаются квадратными скобками, поэтому раздел Configuration, использованный выше, должен выглядеть в файле TEST.INI следующим образом:

[Configuration]
Keyl
Кеу2
и т.д.

Раздел продолжается до имени следующего раздела или до конца файла в зависимости от того, что будет достигнуто раньше.

Свойство FileName


Затрагиваемые объекты

TIniFile

Назначение

Метод TFileName содержит имя файла, инкапсулированное объектом TIniFile.

Объявление

property FileName: string;

Пример Синтаксиса

// данная процедура будег печатать имя INI-файла,
// инкапсулированное в объекте TIniFile
procedure TForm1.Button1Click(Sender:TObject);
var MyIni: TIniFile;
begin
  // создание экзенпляра MyIni и присвоение ему INI-файла
  MyIni : = TIniFile.Create('TEST.INI);
  // печатать имя INI-файла в заголовке формы
  Form1.Caption := MyIni.FileName;
  MyIni.Free;
end;

Описание

FileName является свойством времени выполнения, предназначенным только для чтения, и содержит имя INI-файла, инкапсулированное в экземпляре TIniFile.


Свойство ReadBool


Затрагиваемые объекты

TIniFile

Назначение

Свойство ReadBool получает двоичное значение из INI-файла.

Объявление

function ReadBool (const Section, Ident: stringn; Default: Boloean) : Boolean;

Параметры

Section

Имя раздела, в котором расположен идентификатор.

Ident

Идентификатор, подлежащий считыванию.

Default

Значение идентификатора по умолчанию.

Пример Синтаксиса

// Данная процедура проверяет идентификатор TileWallpaper раздела Desktop
// в файле WIN.INI. Затем устанавливается заголовок формы, указывающий
// на то, включена (on) или выключена (off) опция TileWallpaper.
procedure TForm1.FormCreate(Sender: TObject);
var MyIni: TIniFile;
begin
  MyIni : = TIniFile.Create('Win.ini');
  if MyIni.ReadBool('Desktop','TileWallpaper', True) = True then
    Form1.Caption := 'Your desktop wallpaper is tiled';
  else
  Form1.Caption : = 'Your desktop wallpaper is not tiled';
  MyIni.Free;
end;

Описание

ReadBool извлекает из идентификатора в INI-файле логическое значение.
В приведенном примере анализируется идентификатор TileWallpaper раздела [Desktop] в WIN.INI и возвращается содержащееся в нем значение. Значение 1 указывает на True, 0 ? на False. ReadBool похожа на Readinteger и ReadString в том, что все они возвращают значение, содержащееся в указанном идентификаторе в INI-файле.

Метод ReadInteger



 

Затрагиваемые объекты

TIniFile

Назначение

Метод Readinteger возвращает целое значение из INI-файла.

Объявление

function Readlnteger(const Section, Ident: string; Default: Longint): liongint;

Параметры

Section

Имя раздела, в котором расположен идентификатор.

Ident

Идентификатор, подлежащий считыванию.

Default

Значение идентификатора по умолчанию.

Пример синтаксиса

// Данная процедура проверяет идентификатор iCountry раздела Inti
// в файле WIN.INI. Затем устанавливается заголовок формы,
// указывакщий на то, находитесь ли вы в Соединенных Штатах или нет.
procedure TForm1.FormCreate(Sender: TObject);
var MyIni: TIniFile;
begin MyIni := TIniFile.Create('win.ini');
  if MyIni.ReadInteger('Intl', 'iCountry', 1) = I then
    Form1.Caption := 'Your are in the Onited States';
  else
    Form1.Caption : = 'Your are not in the United States';
  MyIni.Free;
end;

Описание

ReadInteger извлекает из идентификатора в INI-файле целочисленное значение. В приведенном примере анализируется идентификатор iCountry раздела [Inti] в WIN.INI. Если идентификатор iCountry установлен в 1, это означает, что Control Panel Regional Settings установлены в конфигурацию Соединенных Штатов. ReadInteger похожа на ReadBool и ReadString в том, что все они возвращают значение, содержащееся в указанном идентификаторе в INI-файле.


Метод ReadSection



Затрагиваемые объекты

TIniFile

Назначение

Метод ReadSection извлекает имена всех идентификаторов заданного раздела в INI-файле и запоминает их в строковом объекте.

Объявление

procedure ReadSection (const Section: string; Strings: Tstrfngs) ;

Параметры

Section

Имя читаемого раздела.

Strings

Список строк, где будут запомнены значения.

Пример синтаксиса

// Прежде всего добавим в форму ListBox. Данная процедура будет
// печатать список идентификаторов в разделе Desktop файла
// WIN.INI при создании формы
procedure TForm1.FormCreate(Sender: TObject);
var MyIni: TIniFile;
begin
  MyIni : = TIniFile.Create('WIN.INI');
  MyIni.ReadSection('Desktop', ListBox1.Items);
  MyIni.Free;
end;

Описание

ReadSection извлекает имена идентификаторов в указанном разделе INI-файла и помещает их в строковый объект. Список можно поместить непосредственно в список строковых компонентов (как в свойство Items окна списка) или в независимый список строк. ReadSection не извлекает значения идентификаторов, но извлекает имена идентификаторов. Для извлечения идентификаторов и их текущих значений можно использовать ReadSectionValues. На рисунке 4-2 при помощи ReadSection отображен типичный раздел INI-файла.


Метод ReadSections



Затрагиваемые объекты

TIniFile

Назначение

Метод ReadSections копирует все имена разделов в INI-файле в строковый объект.

Объявление

procedure ReadSections (Strings: TStrings) ;

Параметры

Strings

Список имен разделов.

Пример Синтаксиса

// Данный обработчик события при нажатии кнопки печатает имена
// разделов INI-файла в окне списка 
procedure TForm1.Button1Click(Sender: TObject);
var MyIni: TIniFile;
begin
  ListBox1.Clear;
  MyIni := TIniFile.Create('test.ini');
  MyIni.ReadSections(listBox1.Items);
  MyIni.Free;
end;

Описание

Строковый объект является списком строк, используемым компонентами (такими как окна списков), которым необходимо манипулировать со многими строками. ReadSections запоминает список имен разделов INI-файла в параметре Strings. В вышеприведенном примере кода данный список передается свойству Items окна списка, который также имеет тип TStrings. РИСУНОК 4-2 Окно списка отображает идентификаторы в разделе [Desktop] файла WIN.INI.

Метод ReadSectionValues



Затрагиваемые объекты

TIniFile

Назначение

Метод ReadSectionValues извлекает из заданного раздела INI-файла все ключи.

Объявление

procedure ReadSectionValues (const Section: string; Strings; TStrings);

Параметры

Section

Имя читаемого раздела.

Strings

Список строк, в котором запоминаются идентификаторы и их значения.

Пример синтаксиса

// Прежде всего добавим к форме ListBox. Данная процедура будет
// печатать список идентификаторов и их значений из раздела
// Desktop файла WIN.INI при создании формы
procedure TForm1.FormCreate (Sender: TObject);
var
MyIni: TIniFile;
begin
  MyIni := TIniFile.Create('WIN.INI').
  MyIni.ReadSectionValues('Desktop', ListBox1.Items);
  MyIni.Free;
end;

Описание

ReadSectionValues извлекает из раздела INI-файла все ключи и запоминает их в строковом объекте точно так же, как они появляются в INI-файле:

identifier=value

В приведенном выше примере в окне списка отображается весь список (см. рис. 4-3). Используя свойство Values из TString можно отобразить отдельные значения. Или же можно скопировать весь раздел в список строк и получить доступ к каждой строке по индексу:

// В данном примере раздел Desktop файла WIN.INI считывается в
// список строк и затем в заголовке формы печатается первая
// строка. При этом используется ее индекс.
procedure TForm1.FormCreate (Sender: TObject);
var
MyIni: TIniFile;
MyStringList: TStringList;
begin
  MyIni := TIniFile.Create('WIN.INI');
  // получение экземпляра списка строк
  MyStringList := TStringList.Create;
  // копировать раздел в список строк
  MyIni.ReadSectionValues('Desktop', MyStringList);
  // печатать первую строку списка в заголовке формы
  Form1.Caption := MyStringList.Strings[0];
  MyIni.Free;
  MyStringList.Free;
end;

Результат показан на рисунке 4-4.

Метод ReadString



Затрагиваемые объекты

TIniFile

Назначение

Метод ReadString считывает строковое значение из идентификатора в указанном разделе INI-файла.

Объявление

function ReadString(const Section, Jdent, Default: string): string;

Параметры

Section

Имя раздела, в котором расположен идентификатор

Ident

Идентификатор, подлежащий считыванию.

Default

Значение идентификатора по умолчанию (возвращается, если идентификатор не найден).

Пример синтаксиса

// Данная процедура проверяет идентификатор sCountry раздела Intl
// в файле WIN.INI. Затем устанавливается заголовок формы в значении
// идентификатора sCountry.
procedure TForm1.FormCreate(Sender: TObject);
var MyIni; TIniFile;
begin
  MyIni := TIniFile.Create('Win.ini');
  Form1.Caption := MyIni.ReadString('Intl', 'sCountry', 'no country listed');
  // не забудьте пo завершении работи разрушить MyIni
  MyIni.Free;
end;

Описание

ReadString извлекает строковое значение из идентификатора в INI-файле. В приведенном выше примере программа получает идентификатор с именем sCountry в разделе файла WIN.INI и печатает его значение в заголовке формы. ReadString похожа на ReadBool и Readinteger в том, что все они возвращают значения, содержащиеся в указанных идентификаторах INI-файла.

РИСУНОК 4-3 Окно списка отображает идентификаторы и их значения в разделе [Desktop] файла WIN.INI.
РИСУНОК 4-4 Получение отдельных идентификаторов вместе со значениями и печать в заголовке формы.

 

Метод WriteBool



Затрагиваемые объекты

TIniFile

Назначение

Метод WriteBool записывает логическое значение в идентификатор в указанном разделе INI-файла.

Объявление

procedure WriteBool (const Section, Ident: string; Value: Boolean);

Параметры

Section

Имя раздела, в котором расположен идентификатор.

Ident

Идентификатор, подлежащий записи.

Value

Значение, записываемое в идентификатор.

Пример синтаксиса

// Данная процедура создает новый INI-файл с именем TEST.INI
// (если он еще не существует) и добавляет двоичный идентификатор
// SampleBooleanEntry со значением True. Если идентификатора нет,
// он также будет создан.
procedure TForm1.FormCreate (Sender: TObject);
var
Writeini: TIniFile;
begin
  Writeini : = TIniFile.Create('TEST.INI');
  Writeini.WriteBool('Sample Section', 'SampleBooleanEntry', True);
  Writeini.Free;
end;

Описание

WriteBool записывает в INI-файл логическое значение, заданное параметром Value. Раздел и идентификатор, куда будет записываться значение, определяются параметрами Section и Ident. Если раздел или идентификатор не существуют, они создаются. После запуска приведенного примера в каталоге Windows можно будет открыть вновь созданный TEST.INI, в котором будут представлены такие строки:

[Sample Section]
SampleBooleanEntry=1

WriteBool используется так же, как Writeinteger и WriteString, ? с единственным различием в типе записываемого значения.

Метод Writeinteger



Затрагиваемые объекты

TIniFile

Назначение

Метод Writeinteger записывает целое значение в идентификатор в указанном разделе INI-файла.

Объявление

procedure Writeinteger (const Section, Ident: string; Value: Longint);

Параметры

Section

Имя раздела, в котором расположен идентификатор.

Ident

Идентификатор, подлежащий записи.

Value

Значение, записываемое в идентификатор.

Пример синтаксиса

// Данная процедура создает новый INI-файл с именем TEST.INI
// (если он еще не существует) и добавляет целый идентификатор
// SampleIntegerEntry со значением 12024. Если идентификатора
// нет, он также будет создан.
procedure TForm1.FormCreate(Sender: TObject);
var
Writeini: TIniFile;
begin
  Writeini := TIniFile.Create(TEST.INI');
  Writeini.Writelnteger( 'Sample Section', 'SampleIntegerEntry', 12024);
  Writeini.Free;
end;

Описание

Writeinteger записывает в INI-файл целое значение, заданное параметром Value. Раздел и идентификатор, куда будет записываться значение, определяются параметрами Section и Ident. Если раздел или идентификатор не существуют, они создаются. Если выполнить приведенный пример, в каталоге Windows можно будет открыть вновь созданный TEST.INI, в котором находятся такие строки:

[Sample Section]
SampleIntegerEntry=12024

Writeinteger используется так же, как WriteBool и WriteString, ? с единственным отличием в типе записываемого значения.


Метод WriteString




Затрагиваемые объекты

TIniFile

Назначение

Метод WriteString записывает строковое значение в идентификатор в указанном разделе

INI-файла.

Объявление

procedure WriteString(const Section, Ident, Value-, string);

Параметры

Section

Имя раздела, в котором расположен идентификатор.

Ident

Идентификатор, подлежащий записи.

Value

Значение, записываемое в идентификатор.

Пример синтаксиса

// Данная процедура создает новый INI-файл с именем TEST. INI
// (если он еще не существует) и добавляет строковый
// идентификатор SampleStringEntry со значением строки. Если
// идентификатора нет, он также будет создан.

procedure TFonnI.FormCreate (Sender: TObeject);
var
     Writeini: TIniFile;
begin
  Writeini := TIniFile. Create ('TEST. INI'),
  Writeini.WriteString('Sample Section', 'SampleStringEntry', 'this
                  is example of writing a string to an INI file');
  Writeini. Free;
end;

Описание

WriteString записывает в INI-файл строковое значение, заданное параметром Value. Раздел и идентификатор, куда будет записываться значение, указываются параметрами Section и Ident. Если раздел или идентификатор не существуют, они создаются.

После выполнения приведенного примера в каталоге Windows можно будет открыть вновь созданный TEST.INI, в котором представлены такие строки:

[Sample Section]
SamplectringEntry=this is example of writing a string to an INI file
WriteString используется так же, как WriteBool и Writeinteger, - с единственной
разницей в типе записываемого значения

main_back.gif (3425 bytes)

Используются технологии uCoz