Delphi World - TIniFile
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
TIniFile

Оформил: DeeCo

В то время как 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 5 P, 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, - с единственной разницей в типе записываемого значения.
Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования