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

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

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

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

Сообщение qivi » 22.11.2009 07:32:58

Проблема первая
Вот так сохраняю всё что надо в конфиг:
Код: Выделить всё
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"?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

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

Сообщение Mr.Smart » 22.11.2009 13:19:40

Первый вопрос не понял. Мало информации!
2 Для сохранения WindowState можно применить мледующий приём преобразования данных:
Код: Выделить всё
ini.WriteInteger('1','state',Integer(WindowState));

и чтение соответственно:
Код: Выделить всё
WindowState:=TWindowState(ini.ReadInteger('1','state',0))

p.s. Избегайте по возможности ключи и секции с русскими наименованиями!
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение alexs » 22.11.2009 20:11:13

qivi
А вот если сделать вот так:
http://freepascal.ru/article//lazarus/20090429220000/
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение qivi » 23.11.2009 12:23:39

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

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

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

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

alexs, спасибо за мысль... пока я оставлю в своей программке сохранение параметров сессии как есть, но в перспективе заменю (если освою :oops: ). Признаться я читал эту статью "по диогонали" когда она только появилась, но похоже не так понял, понял что это для сохранения полей ввода формы и решив что это мне вроде как даром не надо больше к ней не возвращался... перечитал внимательно, оказывается для сохранения любых параметров любых объектов - полезная весчь оказывается.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

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

Сообщение Mr.Smart » 23.11.2009 12:57:17

Ошибок не должно возникать. Т.к. вы используете в функциях чтения параметр по умолчанию, который в случае несоответствия типа либо отсутствия данного ключа возвращается вам автоматически.
Вы писали, что возникают ошибки, но так и не привели их в своём посте. Как можно судить об ошибке если не видишь её? :wink:
Можно ещё извратится:
Код: Выделить всё
if not TryStrToInt(ini.ReadString('section','key','*'),v) then
/// Ошибка
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 35

Рейтинг@Mail.ru