TIniFile. Работа с Ini файлове в Delphi.

tinifile

TIniFile. Работа с Ini файлове в Delphi.

Какво е ini файл?

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

Ini файловете са разделени на секции, съдържащи идентификатори, на които от своя страна могат да се присвояват стойности. Като цяло структурата на Ini файла е следната:

ИзразътИдентификатор = Стойностчесто се нарича ключ.

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

Сега нека да разгледаме свойствата и методите на класа TIniFile.

Методът Create създава екземпляр на класа TIniFile, който ви позволява да манипулирате Ini файла, чието име се предава в параметъра FileName. Ако не посочите изрично къде точно да създадете или намерите Ini файла, вашата програма ще го потърси в директорията на Windows.

Това свойство само за четене съхранява името на Ini файла. Стойността FileName се присвоява само веднъж, когато работите с екземпляр на класа TIniFile, в метода Create.

PS: За да работи този пример, трябва да свържете и модула Dialogs, тъй като процедурата ShowMessage е декларирана в него.

Методи WriteString, ReadString.

Деклариран както следва:

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

Функцията ReadString чете от секцията низ от ключа с идентификатор Ident. Ако такъв раздел или ключ не бъде намерен във файла, тогава функцията ще върне посочения от вас параметър по подразбиране.

МетодиWriteInteger, ReadInteger.

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

Функцията ReadInteger чете цяло число от ключа с идентификатор Ident, разположен в секцията.

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

Пример: Вижте примери за методи ReadString, WriteString.

Методи WriteFloat, ReadFloat.

Процедурата WriteFloat записва в ключа Ident, разположен в секцията Section, естествено число Стойност.

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

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

Пример: Вижте примери за методи ReadString, WriteString.

Методи WriteBool, ReadBool.

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

Функцията ReadBool чете естествено число от ключа с идентификатор Ident, разположен в секцията.

PS: По същия начин Write(Read)Integer(Float) не записва самото число във файла, а низове. По-точно или '1', или '0'.

Пример: Вижте примери за методи ReadString, WriteString.

Методи WriteDate, ReadDate.

WriteDate записва в секцията с име Section ключ с ID име и стойност стойност.

Функцията ReadDate чете стойността на ключ с идентификаторИме, намиращо се в секцията Раздел. Ако ключът не бъде намерен, тогава резултатът от функцията ще бъде параметърът по подразбиране. Ако ключът съдържа стойност, различна от типа TDateTime, ще бъде предизвикано изключение EConvertError. Както при всички предишни методи за четене / запис, след запис на датата в Ini файла ще има редове и при четене ще се извърши преобразуване в TDateTime.

Методи WriteTime, ReadTime.

WriteTime, ReadTime са пълни копия на WriteDate, ReadDate, но те не пишат датата, а часа.

Пример: Вижте Пример за методите WriteDate, ReadDate.

Методи WriteDateTime, ReadDateTime.

Тези два метода на класа TIniFile записват датата и часа във файла и ги четат съответно. В противен случай те са подобни на WriteDate и ReadDate.

Пример: Вижте Пример за методите WriteDate, ReadDate.

Методи WriteBinaryStream, ReadBinaryStream.

Процедурата WriteBinaryStream записва данни от потока от стойности в ключа с ID име на секцията. По време на изпълнение на процедурата данните от потока се конвертират в шестнадесетичен низ, след което се записват във файла.

Функцията ReadBinaryStream чете в потока от стойности стойността на ключа с ID Name, разположен в секцията. Резултатът е размерът на потока.

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

Чете всички идентификатори на ключове в секцията и ги поставя в низове.

Поставете компонент TMemo върху формуляра.

Memo1 ще покаже следния списък:

Цитат
Идент1 Идент2 Идент3

Чете имената на всички секции в Ini файла и ги записва в Strings.

Поставете компонент TMemo върху формуляра.

Ще се покаже Memo1следния списък:

Чете всички ключове (id=стойност) в секцията и ги записва в низове.

Поставете компонент TMemo върху формуляра.

Memo1 ще покаже следния списък:

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

Методът EraseSection премахва цяла секция от ini файл. Параметърът Section е името на секцията, която ще бъде изтрита.

Декларира се като следната функция:

Функцията проверява за наличието на ключ с идентификатор Ident в секцията Ini на файла. Ако този ключ присъства в секцията, функцията ще върне true, в противен случай false.

Декларира се като функция:

Функцията проверява за наличието на раздел в Ini файла. Ако тази секция присъства във файла, функцията ще върне true, в противен случай false.

tinifile

tinifile

файлове

Оферт, да, вероятно.

PS: Ако намерите грешки, правописни грешки, неточности и т.н., моля, пишете за това в ЛС, ще го коригирам.

работа

файлове

tinifile

файлове

И при мен ini файла се отваря нормално от папката на програмата (а не на Windows).

Също така пише НОРМАЛНО. Това не означава, че е задължително, по-близо е до думата ЧЕСТО или ПРИЕТО. Можете да го поставите навсякъде

файлове

ksili, добре, нека напишем пример като този:

Хвърляме два бутона върху формата и в OnClick пишем следното:

Записваме целия "проект" в някаква папка.

Сега нека стартираме тази програма. Натискаме първия бутон. В Explorer отворете директорията на Windows. Ето го нашия файл - Ini.ini. Създаден в директорията на Windows, а не в нашата програма. Сега преместваме този файл в директорията на нашата програма. Ние се движим, а не копираме. Нашата програма работи през цялото това време. Сега натиснете вториябутон. Резултат: файлът не е намерен, въпреки че се намира в директорията на нашата програма, ключът не може да бъде прочетен и следователно съобщението показва стойността, която не сме записали, а параметърът по подразбиране е равен в този случай на „Не е намерен“.

Заключение: ако не кажете изрично на програмата къде да търси Ini файла, тя ще го търси в директорията на Windows.

tinifile

работа

файлове

работа

Мислех за това, но ми се струва, че начинаещите програмисти не използват Win98 сега.

Вече е описано

За него ще пиша в следващата статия след регистъра.

файлове

файлове

и ПРАВИЛНО - в директорията на потребителя

работа

за това говоря. Ако регистърът, тогава в кошера на потребителя.

файлове

tinifile

За съжаление всички тези "най-надарени" дори не са чували за сертификата, а ако са го чували, не го ползват, тъй като е на английски и уж не е ясен

работа

файлове

Чудя се как такъв пример изобщо е попаднал в статията)) изглежда е проверил всичко.

Saygak, +1 ряпа.

tinifile

tinifile

Колко правилно?

чрез ";" например ;коментар

работа

За проверка на наличието на параметър има функция ValueExists(const Section, Ident: string): Boolean;

Когато работех с Ini файлове в Delphi 2010, срещнах твърди задръствания в TMemIniFile:

1) Нарушение на достъпа при отваряне на празни файлове на ред 727 на Inifiles.pas поради код SetLength(Buffer, Size); Stream.Read(Буфер[0], Размер); проверката на размера за 0 не е на мода в наши дни.

2) За бързо търсене на подниз се използват списъци с хеширани низове, в които актуализацията на хеша се извършва изключително неграмотно: при всяка промяна в листа с низове, хешът се възстановява отново! тоест, ако има 100 реда в секцията, тогава добавянето на 101 реда ще доведе до преизчисляване на хешафункционира за всички 100 реда. Благодарение на това файл от няколкостотин реда се записва за 5 секунди!

Изгубих всякакво желание да използвам ini файлове, когато попаднах на модула NativeXml - който стана безплатен. Той има интуитивен и малък набор от функции, които бързо ще заменят записването в ini файлове + по-голяма гъвкавост на xml + висока скорост на работа. Например: времето за четене от диска и анализиране на файл от 500Kb (около 50000 стойности) отнема 0,2s при 1800MHz. Един модул с размер 6000 реда дърпа назад