TIniFile. Робота з Ini-файлами у Delphi.

Section

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

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

Ini файли - це прості текстові файли з розширенням .ini (в принципі можна і з будь-яким іншим). Зазвичай вони зберігаються у каталозі Windows. Ini файли призначені для зберігання налаштувань програми.

Ini файли розділені на розділи, що містять ідентифікатори, яким, у свою чергу, можна визначити значення. У загальному вигляді структура Ini файлу така:

ВиразІдентифікатор = Значеннячасто називають ключем.

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

Тепер розглянемо властивості та методи класу TIniFile.

Метод Create створює екземпляр класу TIniFile, який дозволяє маніпулювати Ini файлом, ім'я якого передається у параметрі FileName. Якщо явно не вказати, де саме потрібно створити або знайти файл Ini, Ваша програма буде шукати його в каталозі Windows.

Це read only властивість зберігає у собі ім'я Ini файла. Значення FileName присвоюється лише один раз під час роботи з екземпляром класу TIniFile – у методі Create.

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

Методи WriteString, ReadString.

Оголошено так:

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

Функція ReadString читає з розділу Section рядок із ключа з ідентифікатором Ident. Якщо такий розділ або ключ не виявлено у файлі, функція поверне заданий Вами параметр Default.

МетодиWriteInteger, ReadInteger.

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

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

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

Приклад: Див. Приклади до методів ReadString, WriteString.

Методи WriteFloat, ReadFloat.

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

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

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

Приклад: Див. Приклади до методів ReadString, WriteString.

Методи WriteBool, ReadBool.

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

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

PS: Аналогічно Write(Read)Integer(Float) у файл пишеться не саме число, а рядки. Точніше або '1', або '0'.

Приклад: Див. Приклади до методів 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).

Читає всі ідентифікатори ключів у розділі Section та заносить їх до Strings.

Покладіть на форму компонент TMemo.

Memo1 відображає наступний список:

Цитата
Ident1 Ident2 Ident3

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

Покладіть на форму компонент TMemo.

Memo1 відобразитьсянаступний список:

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

Покладіть на форму компонент TMemo.

Memo1 відображає наступний список:

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

Метод EraseSection видаляє цілий розділ Ini файлу. Параметр Section – ім'я розділу, який потрібно видалити.

Оголошено у вигляді наступної функції:

Функція перевіряє наявність ключа з ідентифікатором Ident у розділі Section Ini файлу. Якщо цей ключ у розділі є - функція поверне true, інакше false.

Оголошено у вигляді функції:

Функція перевіряє наявність розділу Section в файлі Ini. Якщо цей розділ у файлі є - функція поверне true, інакше false.

delphi

ini-файлами

delphi

Ofer, так, напевно.

ЗИ: Якщо знайдете помилки, друкарські помилки, неточності тощо, будь ласка, напишіть про це в PM, виправлю.

робота

delphi

робота

tinifile

А у мене та з папки програми (а не Windows) нормально відкривається ini-файл.

Там же написано ЗВИЧАЙНО. Це не означає, що обов'язково, це ближче до слова ЧАСТО або ПРИЙНЯТО. Можна куди завгодно його сунути

Section

ksili, добре, давайте напишемо такий приклад.

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

Зберігаємо весь "проект" в якусь папку.

Тепер запускаємо цю програму. Тиснемо першу кнопку. У провіднику відкриваємо каталог Windows. Ось він наш файл – Ini.ini. Створено саме у каталозі Windows, а не нашої програми. Тепер переміщуємо цей файл до каталогу нашої програми. Саме переміщуємо, а не копіюємо. Наша програма весь цей час працює. Тепер тиснемо другукнопку. Результат: файл не знайдений, хоча знаходиться в каталозі нашої програми, ключ неможливо прочитати, і тому в повідомленні показується не записане нами значення, а параметр Default рівний в даному випадку 'Not found'.

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

Section

delphi

Section

ini-файлами

Думав над цим, але як мені здається Win98 програмісти-початківці зараз не використовують.

Це вже описано

Про нього я і напишу в наступній після реєстру статті.

робота

Section

а ПРАВИЛЬНО - у каталозі користувача

ini-файлами

і я про те ж. Якщо реєстр, то в кущі користувача.

tinifile

Section

На жаль всі ці "найобдарованіші" навіть не чули про довідку, а якщо і чули, то не юзають, бо англійською, і нібито не зрозуміло

Section

Section

Цікаво як такий приклад взагалі пройшов у статтю)) начебто все перевіряв.

Saygak, +1 у ріпу.

tinifile

робота

Як правильно?

через ";" наприклад ;comment

tinifile

Для перевірки наявності параметра є функція function ValueExists(const Section, Ident: string): Boolean;

При роботі з Ini файлами в Delphi 2010 зіткнувся з жорсткими одвірками в TMemIniFile:

1) Access Violation при відкритті порожніх файлів у рядку 727 Inifiles.pas через код SetLength(Buffer, Size); Stream.Read (Buffer [0], Size); перевірити size на 0 зараз не модно.

2) Для швидкого пошуку підрядки використовуються хешовані стрінг-листи в яких оновлення хешу зроблено вкрай неграмотно: при будь-якій зміні стрінг листа хеш перебудовується заново!функції для всіх 100 рядків. Завдяки цьому файл у пару сотень рядків пишеться секунд 5!

Використовувати інші файли пішло будь-яке бажання коли наткнувся на юніт NativeXml - який став безкоштовним. Має інтуїтивно зрозумілий і невеликий набір функції, який швидко замінить збереження в іні-файли + велика гнучкість xml + висока швидкість роботи. на 1800MHz. За собою тягне один єдиний модуль розмірів у 6000 рядків