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.
Затрагиваемые объекты
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).
Затрагиваемые объекты
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 очищает целый ключ, идентификатор и его
значение.
Затрагиваемые объекты
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
и т.д.
Раздел продолжается до имени следующего раздела или до конца
файла в зависимости от того, что будет достигнуто
раньше.
Затрагиваемые объекты
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.
Затрагиваемые объекты
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-файле.
Затрагиваемые объекты
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-файле.
Затрагиваемые объекты
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-файла.
Затрагиваемые объекты
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.
Затрагиваемые объекты
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.
Затрагиваемые объекты
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 Получение отдельных
идентификаторов вместе со значениями и печать в заголовке формы.
Затрагиваемые объекты
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, = с единственным различием в типе
записываемого значения.
Затрагиваемые объекты
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,
= с единственным отличием в типе записываемого
значения.
Затрагиваемые объекты
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, - с единственной
разницей в типе записываемого значения.
|