DELPHISOURCE
Домой | Статьи | Книги | FAQ | Компоненты | Программы |
Архив сайта | Реклама на сайте | Ссылки | Связь |
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-файле
логическое значение. |
Метод 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, - с единственной разницей в типе записываемого значения. |
Delphisource (2006г.) |