В то время как 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, - с единственной разницей в
типе записываемого значения.
|