По работе с INI файлами.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

По работе с INI файлами.

Сообщение qivi »

Проблема первая
Вот так сохраняю всё что надо в конфиг:

Код: Выделить всё

 ConfigFile:=TIniFile.Create('Сессия.conf');
 ConfigFile.WriteInteger('"Моя программа"','Параметр_01', gf.Grid.Columns.Items[0].Width);
 ConfigFile.WriteInteger('"Моя программа"','Параметр_02', gf.Grid.Columns.Items[1].Width);
 ConfigFile.WriteInteger('"Моя программа"','Параметр_03', gf.Width);
 ConfigFile.WriteInteger('"Моя программа"','Параметр_04', gf.Height);
 if (gf.bsl1.RecordCount>0) then ConfigFile.WriteString('"Моя программа"','Параметр_05', ias);
 ConfigFile.Free;

Вот так извлекаю из него:

Код: Выделить всё

 ConfigFile:=TIniFile.Create('Сессия.conf');
 gf.Grid.Columns.Items[0].Width:= ConfigFile.ReadInteger('"Моя программа"','Параметр_01', 300);
 if gf.Grid.Columns.Items[0].Width<100 then gf.Grid.Columns.Items[0].Width:=100;
 gf.Grid.Columns.Items[1].Width:= ConfigFile.ReadInteger('"Моя программа"','Параметр_02', 500);
 if gf.Grid.Columns.Items[1].Width<120 then gf.Grid.Columns.Items[1].Width:=120;
 gf.Width:=ConfigFile.ReadInteger('"Моя программа"','Параметр_03', 600);
 if gf.Width<600 then gf.Width:=600;
 gf.Height:=ConfigFile.ReadInteger('"Моя программа"','Параметр_04', 400);
 if gf.Height<400 then gf.Height:=400;
 ias:=ConfigFile.ReadString('"Моя программа"','Параметр_05', '000');
 ConfigFile.Free;

Всё работает замечательно, но если открыть конфиг и поправит ручками до недопустимых значений... программа выдаёт ошибки... какнибудь этого можно избежать?

Проблема вторая

Как можно сохранить в INI файл значение свойства формы "WindowState"?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Re: По работе с INI файлами.

Сообщение Mr.Smart »

Первый вопрос не понял. Мало информации!
2 Для сохранения WindowState можно применить мледующий приём преобразования данных:

Код: Выделить всё

ini.WriteInteger('1','state',Integer(WindowState));

и чтение соответственно:

Код: Выделить всё

WindowState:=TWindowState(ini.ReadInteger('1','state',0))

p.s. Избегайте по возможности ключи и секции с русскими наименованиями!
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Re: По работе с INI файлами.

Сообщение alexs »

qivi
А вот если сделать вот так:
http://freepascal.ru/article//lazarus/20090429220000/
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Re: По работе с INI файлами.

Сообщение qivi »

Первый вопрос не понял. Мало информации!

Можно ли как то защетить программу от сбоя, на случай если INI файл был правлен в ручную, например параметр типа интегер заменён строкой?

p.s. Избегайте по возможности ключи и секции с русскими наименованиями!

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

alexs, спасибо за мысль... пока я оставлю в своей программке сохранение параметров сессии как есть, но в перспективе заменю (если освою :oops: ). Признаться я читал эту статью "по диогонали" когда она только появилась, но похоже не так понял, понял что это для сохранения полей ввода формы и решив что это мне вроде как даром не надо больше к ней не возвращался... перечитал внимательно, оказывается для сохранения любых параметров любых объектов - полезная весчь оказывается.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Re: По работе с INI файлами.

Сообщение Mr.Smart »

Ошибок не должно возникать. Т.к. вы используете в функциях чтения параметр по умолчанию, который в случае несоответствия типа либо отсутствия данного ключа возвращается вам автоматически.
Вы писали, что возникают ошибки, но так и не привели их в своём посте. Как можно судить об ошибке если не видишь её? :wink:
Можно ещё извратится:

Код: Выделить всё

if not TryStrToInt(ini.ReadString('section','key','*'),v) then
 /// Ошибка
Ответить