Delphi прочитать ini файл

Обновлено: 07.07.2024

Репутация: 65
Всего: 372

TIniFile. Работа с Ini-файлами в Delphi.

Что такое Ini файл?

Ini файлы – это простые текстовые файлами с расширением .ini(в принципе можно и с любым другим). Обычно они хранятся в каталоге Windows. Ini файлы предназначены для хранения настроек программы.

Ini файлы разделены на разделы, содержащие идентификаторы, которым, в свою очередь, можно присвоить значения.
В общем виде структура Ini файла такова:

Выражение Идентификатор = Значение очень часто называют ключом.

В Delphi работа с Ini файлами производится посредствам класса TIniFile, объявленного в юните IniFiles. TIniFile наследуется от класса TCustomIniFile, который в свою очередь, является прямым потомком TObject.

Теперь рассмотрим свойства и методы класса TIniFile.

Метод Create.

Метод Create создает экземпляр класса TIniFile, который позволяет манипулировать Ini файлом, имя которого передаётся в параметре FileName.
Если явно не указать, где именно нужно создать или найти Ini файл, Ваша программа будет искать его в каталоге Windows.

Код

Uses IniFiles; // не забываем подключить модуль IniFiles


Свойство FileName.

Это read only свойство хранит в себе имя Ini файла.
Значение FileName присваивается только один раз во время работы с экземпляром класса TIniFile – в методе Create.

Код

Uses IniFiles;

PS: Для работы данного примера так же следует подключить модуль Dialogs, так как в нем объявлена процедура ShowMessage.



Методы WriteString, ReadString.

Объявлены следующим образом:

Процедура WriteString записывает в раздел Section, в ключ с идентификатором Ident строку Value.

Функция ReadString читает из раздела Section строку из ключа с идентификатором Ident. Если такой раздел или ключ не обнаружены в файле, то функция вернет заданный Вами параметр Default.

Код

Uses IniFiles;

Методы WriteInteger, ReadInteger.

Процедура WriteInteger записывает в ключ Ident находящийся в разделе Section целое число Value.

Функция ReadInteger читает целое число из ключа с идентификатором Ident находящегося в разделе Section.

PS: На самом деле в файл будут записаны не числа, а строки. То есть в WriteInteger в файл пишется не само Value, а преобразованное в строку число - IntToStr(Value). А в ReadInteger читается сначала строка, а в результате передаётся строка, преобразованная в число с помощью функции StrToInt.

Пример:
См. примеры к методам ReadString, WriteString.

Методы WriteFloat, ReadFloat.

Процедура WriteFloat записывает в ключ Ident находящийся в разделе Section натуральное число Value.

Функция ReadFloat читает натуральное число из ключа с идентификатором Ident находящегося в разделе Section.

PS: Аналогично Write(Read)Integer в файл пишется не само число, а строки. Но в ReadFloat, если не удастся сконвертировать строку в натуральное число, поднимется исключение типа EConvertError.

Пример:
См. примеры к методам ReadString, WriteString.

Методы WriteBool, ReadBool.

Процедура WriteBool записывает в ключ Ident находящийся в разделе Section натуральное число Value.

Функция ReadBool читает натуральное число из ключа с идентификатором Ident находящегося в разделе Section.

Пример:
См. примеры к методам ReadString, WriteString.

Методы WriteDate, ReadDate.


WriteDate записывает в раздел с именем Section ключ с идентификатором Name и значением Value.

Функция ReadDate читает значение ключа с идентификатором Name, находящегося в разделе Section. Если ключ не найден, то результатом работы функции будет параметр Default. Если в ключе находится значение отличное от типа TDateTime, будет поднято исключение EConvertError. Так же как и во всех предыдущих методах чтения/записи, в Ini файле, после записи в него даты, будут находится строки, а при чтении будет выполнено преобразование в TDateTime.

Код

Uses IniFiles;



Методы WriteTime, ReadTime.

WriteTime, ReadTime являются полными копиями WriteDate, ReadDate, но пишут не дату, а время.

Пример:
См. Пример к методам WriteDate, ReadDate.

Методы WriteDateTime, ReadDateTime.

Эти два метода класса TIniFile записывают в файл дату и время и соответственно читают их. В остальном они схожи с WriteDate и ReadDate.

Пример:
См. Пример к методам WriteDate, ReadDate.

Методы WriteBinaryStream, ReadBinaryStream.

Процедура WriteBinaryStream записывает в ключ с идентификатором Name раздела Section данные из потока Value. Во время работы процедуры данные из потока преобразуются в шестнадцатеричную строку, и уже после этого записываются в файл.

Функция ReadBinaryStream читает в поток Value значение ключа с идентификатором Name, находящегося в разделе Section. Результатом является размер потока.

Пример:
Положите на форму компонент TMemo и две кнопки(TButton).

//По нажатию первой кнопки записываем в Ini файл текст из Memo в шестнадцатеричном виде

// по нажатию второй кнопки читаем данные из файла и помещаем их в Memo

Метод ReadSection.

Читает все идентификаторы ключей в разделе Section и заносит их в Strings.

Положите на форму компонент TMemo.

В Memo1 отобразится следующий список:


Метод ReadSections.

Читает имена всех разделов в Ini файле и заносит их в Strings.

Положите на форму компонент TMemo.

В Memo1 отобразится следующий список:

Метод ReadSectionValues.

Читает все ключи (идентификатор=значние) в разделе Section и заносит их в Strings.

Положите на форму компонент TMemo.

В Memo1 отобразится следующий список:

Метод DeleteKey.

Метод DeleteKey удаляет из Ini файла ключ в разделе Section с идентификатором Ident.

Код

Uses IniFiles;

Метод EraseSection.

Метод EraseSection удаляет целый раздел из Ini файла. Параметр Section – имя раздела, который надо удалить.

Код

Uses IniFiles;

Метод ValueExists.

Объявлен в виде следующей функции:

Функция проверяет наличие ключа с идентификатором Ident в разделе Section Ini файла. Если данный ключ в разделе присутствует - функция вернет true, иначе false.

Код

Uses IniFiles;

Метод SectionExists.

Объявлен в виде функции:

Функция проверяет наличие раздела Section в Ini файле. Если данный раздел в файле присутствует - функция вернет true, иначе false.

Репутация: 1
Всего: 54

Репутация: 1
Всего: 5

Репутация: 65
Всего: 372

Ofer, да, наверное.

ЗЫ: Если найдете ошибки, опечатки, неточности и тд., пожалуйста, напишите об этом в PM, исправлю.

Репутация: нет
Всего: 2

Есть способ хранить настройки и данные в файле *.dat. Такой способ лучше тем, что прочитать его содержимое (или изменить) - дело бесполезное.

Репутация: нет
Всего: 17

А у меня и из папки программы (а не Windows) нормально открывается ini-файл. Вот так открываю файл, с тем же именем, что и exe-шник, но расширением ini:
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)

Репутация: 109
Всего: 459


Там же написано ОБЫЧНО. Это не значит, что обязательно, это ближе к слову ЧАСТО или ПРИНЯТО. Можно куда угодно его сувать.

гениальность идеи состоит в том, что ее невозможно придумать

Репутация: 53
Всего: 133

Это точно! Есть у меня знакомый, так он ini с настройками в ресурсы dll пихает (ну у него там в этой dll картинки, формы. Он туда и настройки сует)

Если хочешь, что бы что-то работало - используй написанное,
если хочешь что-то понять - пиши сам.

Репутация: нет
Всего: 17


Я имел в виду, что если не указывать путь, а только имя файла, то он будет искаться при открытии в папке программы, а не в папке Windows
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)

Репутация: 65
Всего: 372

ksili, хорошо, давайте напишем такой вот примерчик:

На формочку кидаем две кнопочки и в ОнКлик их пишем следущее:

Сохраняем весь "проект" в какую - нибудь папку.

Вывод: если явно не указать программе где искать Ini файл, она будет искать его в каталоге Windows.

Репутация: нет
Всего: 17

а-а-а, я понял в чём прикол: в Application->ExeName из моего примера входит полный путь до exe-шника
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)

Репутация: 65
Всего: 372

Репутация: 3
Всего: 15

Нужно еще заметить, что ИНИ-файл в win98 не может превышать размер 64 кб, и естественно если мы не указываем полный путь, то ини-файл сохраняется в папке windows, думаю это не очень красиво. просто безобразие))). Можно было еще бы упомянуть про TMemIniFile. Я сам придерживаюсь ини-файлов, да ну этот реестр. терпеть не могу когда люди там хранят например параметры окна и еще всякую. ***

Репутация: 65
Всего: 372

Думал над этим, но как мне кажется Win98 начинающие программисты сейчас не используют.

Это уже описано

Про него то я и напишу в следующей после реестра статье.

Сейчас, а именно в этой статье, я хотел бы поговорить об ini-файлах, так как в следующей статье хотел бы рассказать как можно сохранить TStringGrid именно в ini-файл. И дальше я буду рассказывать как создавать тесты с помощью ini-файлах, так что нам эта информация понадобится в дальнейшем. Вообще ini-файлы предназначены для сохранения настроек программы, также некоторые любят хранить настройки в реестре (об этом мы тоже поговорим, работать почти одинаково, что и с ini-файлами), но зачем лишним захламлять реестр, так что в этом случае используются ini-файлы (для настроек). Ini-файл (а точнее файл настроек) должен быть (состоит) из следующих разделов

Название раздела заключается в квадратные скобки — [название раздела]. Разделов может быть сколь угодно, это специально предназначено для удобного использования и разделения настроек. Список значений определяется с помощью названия переменных ini-файла. Например

Давайте посмотрим полную структуру ini-файла, на примере настроек нашей программы (какой-нибудь)

Ini-файл у нас создан, давайте теперь подключать его в наш проект, для начала надо в Uses подключить модуль IniFiles. Далее Мы объявим переменную типа TIniFile, а затем создадим ее. На событие формы OnCreate обычно создается ini-файла, например так

ini-файл у нас создан теперь мы можем считывать с него значения и записывать туда, в определенные переменные самого ini-файла (например в переменную Languae, которая описана выше в нашем файле).

Для записи используются следующая функция

  • WriteString(‘название раздела’,’название переменной’,’значение’);

Как видите мы указываем наши параметры ini-файла. Записывать можно и целочисленное значение, только вместо WriteString - WriteInteger. А вообще из раскрывающего списка можно увидеть типы записи в файл.

Для чтения настроек используется функция

  • ReadString(‘название раздела’,’название переменной’,»);

Как видите все тоже самое, только последний параметр остался — пустые кавычки, это означает, что мы считывает строковое значение, если считать как целочисленное значение, то необходимо будет указать в последнем параметре 0 (нуль) и при этом считать с помощью функции ReadInteger.

Ini файлы – это простые текстовые файлами с расширением .ini(в принципе можно и с любым другим). Обычно они хранятся в каталоге Windows. Ini файлы предназначены для хранения настроек программы.

Ini файлы разделены на разделы, содержащие идентификаторы, которым, в свою очередь, можно присвоить значения.
В общем виде структура Ini файла такова:

[Раздел1]

Идентификатор1=Значение1
Идентификатор2=Значение2

[Раздел2]

Идентификатор1=Значение1

Выражение Идентификатор = Значение очень часто называют ключом.

В Delphi работа с Ini файлами производится посредствам класса TIniFile, объявленного в юните IniFiles. TIniFile наследуется от класса TCustomIniFile, который в свою очередь, является прямым потомком TObject.

Теперь рассмотрим свойства и методы класса TIniFile.

Метод Create.

Метод Create создает экземпляр класса TIniFile, который позволяет манипулировать Ini файлом, имя которого передаётся в параметре FileName.
Если явно не указать, где именно нужно создать или найти Ini файл, Ваша программа будет искать его в каталоге Windows.

Конечно, объект класса TIniFile(как и любого другого) можно заводя переменную-указатель на этот объект. Например так:

Но нам наш экземпляр TIniFile не на передавать в процедурные подобные:

Поэтому в примерах буду использовать конструкцию with..do, не заводя никаких дополнительных переменных

Так же ни в коем случае нельзя забывать про блок try..finally..end. Во время работы с Ini-файлом вполне возможны исключительные ситуации.

Свойство FileName.

Это read only свойство хранит в себе имя Ini файла.
Значение FileName присваивается только один раз во время работы с экземпляром класса TIniFile – в методе Create.

PS: Для работы данного примера так же следует подключить модуль Dialogs, так как в нем объявлена процедура ShowMessage.

Методы WriteString, ReadString.

Объявлены следующим образом:

Процедура WriteString записывает в раздел Section, в ключ с идентификатором Ident строку Value.

Функция ReadString читает из раздела Section строку из ключа с идентификатором Ident. Если такой раздел или ключ не обнаружены в файле, то функция вернет заданный Вами параметр Default.

Методы WriteInteger, ReadInteger.

Процедура WriteInteger записывает в ключ Ident находящийся в разделе Section целое число Value.

Функция ReadInteger читает целое число из ключа с идентификатором Ident находящегося в разделе Section.

Пример:
См. примеры к методам ReadString, WriteString.

Методы WriteFloat, ReadFloat.

Процедура WriteFloat записывает в ключ Ident находящийся в разделе Section натуральное число Value.

Функция ReadFloat читает натуральное число из ключа с идентификатором Ident находящегося в разделе Section.

PS: Аналогично Write(Read)Integer в файл пишется не само число, а строки. Но в ReadFloat, если не удастся сконвертировать строку в натуральное число, поднимется исключение типа EConvertError.

Пример:
См. примеры к методам ReadString, WriteString.

Методы WriteBool, ReadBool.

Процедура WriteBool записывает в ключ Ident находящийся в разделе Section натуральное число Value.

Функция ReadBool читает натуральное число из ключа с идентификатором Ident находящегося в разделе Section.

Пример:
См. примеры к методам ReadString, WriteString.

Методы WriteDate, ReadDate.

WriteDate записывает в раздел с именем Section ключ с идентификатором Name и значением Value.

Функция ReadDate читает значение ключа с идентификатором Name, находящегося в разделе Section. Если ключ не найден, то результатом работы функции будет параметр Default. Если в ключе находится значение отличное от типа TDateTime, будет поднято исключение EConvertError. Так же как и во всех предыдущих методах чтения/записи, в Ini файле, после записи в него даты, будут находится строки, а при чтении будет выполнено преобразование в TDateTime.

Методы WriteTime, ReadTime.

WriteTime, ReadTime являются полными копиями WriteDate, ReadDate, но пишут не дату, а время.

Пример:
См. Пример к методам WriteDate, ReadDate.

Методы WriteDateTime, ReadDateTime.

Эти два метода класса TIniFile записывают в файл дату и время и соответственно читают их. В остальном они схожи с WriteDate и ReadDate.

Пример:
См. Пример к методам WriteDate, ReadDate.

Методы WriteBinaryStream, ReadBinaryStream.

Процедура WriteBinaryStream записывает в ключ с идентификатором Name раздела Section данные из потока Value. Во время работы процедуры данные из потока преобразуются в шестнадцатеричную строку, и уже после этого записываются в файл.

Функция ReadBinaryStream читает в поток Value значение ключа с идентификатором Name, находящегося в разделе Section. Результатом является размер потока.

Пример:
Положите на форму компонент TMemo и две кнопки(TButton).

Метод ReadSection.

Читает все идентификаторы ключей в разделе Section и заносит их в Strings.

Положите на форму компонент TMemo.

В Memo1 отобразится следующий список:

Метод ReadSections.

Читает имена всех разделов в Ini файле и заносит их в Strings.

Положите на форму компонент TMemo.

В Memo1 отобразится следующий список:

Метод ReadSectionValues.

Читает все ключи (идентификатор=значние) в разделе Section и заносит их в Strings.

Положите на форму компонент TMemo.

В Memo1 отобразится следующий список:

Метод DeleteKey.

Метод DeleteKey удаляет из Ini файла ключ в разделе Section с идентификатором Ident.

Метод EraseSection.

Метод EraseSection удаляет целый раздел из Ini файла. Параметр Section – имя раздела, который надо удалить.

Метод ValueExists.

Объявлен в виде следующей функции:

Метод SectionExists.

Объявлен в виде функции:

Иногда требуется сохранить значение какого-либо параметра для того, чтобы использовать его в дальнейшем. В таких случаях я предпочитаю записывать значения в ini файл.

Итак рассмотрим использование ini файлов сразу на практике, по ходу сразу и разберемся. Итак создадим новый проект и добавляем пару кнопок. Первая кнопка, чтобы сохранить данные, а вторая - загрузить. Еще нам потребуется компонент memo - для того, чтобы отобразить результат.

2013-03-09 134835

Приступим к написанию кода. Первое, что необходимо сделать - это в разделе uses подключить модуль IniFiles.

Напишем код для клавиши загрузить.

Теперь объясним, что происходит по нажатию кнопки. Первое, что мы делаем - объявляем ряд переменных.

Первый объект IniFile типа TIniFile, этот объект нам и понадобится для работы с ini файлами.

Далее мы объявляем переменные param1, param2, param3 и param4 в них мы будем сохранять считанные значения. Обратите внимание, что переменные разных типов, чтобы обозначить разницу в работе с ними.

IniFile := TIniFile.Create(GetCurrentDir + '\Options.ini'); - далее мы вызываем конструктор класса Tinifale.

Если объяснить по рабоче-крестьянски - то мы создаем объект, который будет работать с файлом Options.ini, который находится в директории приложения GetCurrentDir (если, конечно таковой имеется).

Далее, в блоке try finally с помощью функций считывания мы получаем значение параметров. Например строка Param3:=IniFile.ReadString('Param','Param3','Слово'); - считываем значение Param3 из блока Param, если нет возможности считать - присваиваем переменной значение = 'Слово'. Аналогично считываются все параметры. после выводим то, что получили в memo.

Для наглядности продемонстрирую Вам как выглядит наш ini файл:

[Param]
Param1=1
Param2=2
Param3=Слово
Param4=01.01.2013

В квадратных скобках содержится имя блока, а ниже перечислены все переменные.

После того, как мы считали все значения и вывели их в memo нам необходимо разрушить объект IniFile. Для этого вызовем деструктор класса TInifale - IniFile.Destroy;

Этот код во многом похож на код кнопки загрузить, только мы теперь на считываем, а записываем. Пример записи в ini файл: Inifile.WriteInteger ('Param','Param2',param2); Записываем в блок Param, в переменной Param2 значение param2.

Читайте также: