Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ini-файлы


_Polymorphic_ ©   (2003-07-30 10:11:00) 

Доброго времени суток!
Маааленький вопросик по PIniFile. Пытаюсь сохранять положение окна и восстанавливать его :
//...загрузка формы...
inifile:=ExtractFilePath(ParamStr(0))+'ac.ini';
ini:=OpenIniFile(inifile);
ini.Mode:=ifmRead;
ini.Section:='MainWin';
ini.ValueInteger('XPos',form.Left);
ini.ValueInteger('YPos',form.Top);
ini.ValueInteger('col0',grid.ColWidths[0]);
ini.ValueInteger('col1',grid.ColWidths[1]);
ini.ValueInteger('col2',grid.ColWidths[2]);
ini.ValueInteger('col3',grid.ColWidths[3]);
ini.Free;

//...закрытие формы:
ini:=OpenIniFile(inifile);
ini.Mode:=ifmWrite;
ini.Section:='MainWin';
ini.ValueInteger('XPos',form.Left);
ini.ValueInteger('YPos',form.Top);
ini.ValueInteger('col0',grdAutostart.ColWidths[0]);
ini.ValueInteger('col1',grdAutostart.ColWidths[1]);
ini.ValueInteger('col2',grdAutostart.ColWidths[2]);
ini.ValueInteger('col3',grdAutostart.ColWidths[3]);
ini.Free;


...и все бы было хорошо, если бы читался ini-файл при загрузке!
Он создан, запись в него идет без проблем, а чтение - ни в какую! Приглючило мне попробовать читать просто в переменную. При дебаге выяснил, что переменная просто не меняет значение!
Что делать? F1? SOS?


Sagrer   (2003-10-20 01:12:00) [1]

Ну я Free уже потом поставил, думал поможет. Без него тоже самое. В общем пробовал ставить FREE чтоб всегда при выходе из проги был и вообще без него - все одинакого происходит.

хм... наверное проще будет сделать самопальный класс для работы с инями :)


Vladimir Kladov   (2003-10-19 21:59:00) [2]

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


Sagrer   (2003-10-19 17:39:00) [3]

У меня еще проблема с *.ini-ями - вот такой код :


 //Открыть TRTEdit.ini с настройками.
 If FileExists(ProgaPath+'TRTEdit.ini') = false then begin
   //Нету такого файла. Создать его!
   SettingsIni := OpenIniFile(ProgaPath+'TRTEdit.ini');
   SettingsIni.Mode := ifmWrite;
   SettingsIni.Section := 'Settings';
   DefalDir := ProgaPath;
   SettingsIni.ValueString('DefalDir',DefalDir);
   SettingsIni.ValueString('ver',ver);
   SettingsIni.Mode := ifmRead;
 end
 else begin
   SettingsIni := OpenIniFile(ProgaPath+'TRTEdit.ini');
   SettingsIni.Section := 'Settings';
   SettingsIni.Mode := ifmRead;
   GNPResult :=  SettingsIni.ValueString('ver','');
   If GNPResult <> ver then begin
     MsgOK('Непонятная версия ini-файла в папке программы.'+#13+'Удалите TRTEdit.ini из папки с программой и запустите программу снова.');
     SettingsIni.Free;
     Halt;
   end;


После последнего end есть еще код, но оно уже неважно... В общем, тут прога проверяет ver в инишнике, и если оно не совпадает с константой ver в проге, то выдает MsgOK, а потом делает Halt. Проблема в том, что прога "отстает". Например у проги const ver = '1.0'; В инишнике тоже ver=1.0 . Все идет как надо - прога не заходит в ветку с MsgOK и идет дальше. Но если я меняю блокнотом в инишнике на ver=1.1 (сейвю ессно до запуска проги), то в первый раз прога никак не реагирует (смотрел вотчем, GNPResult :=  SettingsIni.ValueString('ver',''); - тут GNPResult всеравно равен '1.0', хотя в инишнике уже 1.1), а если ее запустить во второй раз, то тогда уже срабатывает (вылетает мессага и прога хальтится). Если в инишнике поменять на ver=1.0 и запустить прогу, то она всеравно выведет мессагу и захалтится, а срабатывает как надо только в следующий раз.


Sagrer   (2003-10-14 21:12:00) [4]

нда... сорри :(


SPeller   (2003-10-13 06:11:00) [5]

Банальная невнимательность:

if ...
 SettingsIni := OpenIniFile(ProgaPath+' TrText.ini');
else
 SettingsIni := OpenIniFile(ProgaPath+' settings.ini');


Sagrer   (2003-10-12 17:26:00) [6]

Сорри, может я чего не понял, но у меня функции вроде VlueInteger или ValueString не работают (на чтение) вообще никак. Тоесть Result-у ихнему присваивается то, что было передано по Value...

Тоесть вот мой код (при запуске проги срабатывает)


 //Открыть TrText.ini с настройками.
 If FileExists(ProgaPath+'TrText.ini') = false then begin
   //Нету такого файла. Создать его!
   SettingsIni := OpenIniFile(ProgaPath+'TrText.ini');
   SettingsIni.Mode := ifmWrite;
   SettingsIni.Section := 'Settings';
   DefalDir := ProgaPath;
   SettingsIni.ValueString('DefalDir',DefalDir);
   SettingsIni.Mode := ifmRead;
 end
 else begin
   //Просто получить нужные значения...
   SettingsIni := OpenIniFile(ProgaPath+'settings.ini');
   SettingsIni.Section := 'Settings';
   SettingsIni.Mode := ifmRead;
   DefalDir := SettingsIni.ValueString('DefalDir',DefalDir);
   MsgOK(DefalDir);    //Для теста...
 end;


В общем, MsgOK не выводит вообще мессагу - DefalDir пустая остается (тоесть DefalDir = '')

У меня скачаны KolLessons, и я там видел вот это:

/////////////////////////////////////////////////////////////////////
Procedure ClickOnList2( Dummy : Pointer; Sender : PControl );
var
s:string;
i:integer;
begin
s:= List2.Items[List2.CurIndex];
i:= IndexOfChar(s,'=');
edName.Text := Copy(s,0,i-1);
edDan.Text := CopyEnd(s,i+1);
end;
/////////////////////////////////////////////////////////////////////
Procedure ClickOnList1( Dummy : Pointer; Sender : PControl );
var
j:integer;
begin
edName.Clear ;
edDan.Clear ;
j:=List1.CurIndex;
// заносим в List2 данные, которые находятся в j-ой секции
strList.Clear ;
List2.Clear ;
ini.Section := List1.Items[j];
ini.SectionData(strList);
for i:=0 to strList.Count-1 do
 List2.Items[i]:=strList.Items[i];
end;
/////////////////////////////////////////////////////////////////////


Но юзать так постояно в проге слишком длинно - значит надо делать для этого себе класс или хотяб функцию... мне то нетрудно, только зачем изобретать велосипед, если ValueString и т.п. уже есть?


Gandalf   (2003-08-04 14:00:00) [7]

http://kol.mastak.ru/lessons%209.htm


BorisMor   (2003-07-31 07:03:00) [8]

Это что там не работает ?
И почему с пути сбила ?


_Polymorphic_   (2003-07-30 17:23:00) [9]

Просто сбила меня с пути истинного статья про работу с ini-файлом, а пример к ней разбирать не стал. Вот и заблудился :)


Кладов   (2003-07-30 17:03:00) [10]

И вообще, работу с ini-файлом можно в одном месте и описать, и не дублировать:
Form.Left := Ini.ValueInteger( 'Left', Form.Left );


Polymorphic   (2003-07-30 14:02:00) [11]

Спасибо! Ни за что бы не догадался сам!


SPeller   (2003-07-30 13:40:00) [12]

ini.ValueInteger('YPos',form.Top);

При загрузке синтаксис другой:

Form.Top := ini.ValueInteger( 'YPos', 0 );

Удачи. :-)


Polymorphic   (2003-07-30 13:21:00) [13]

Эти функции разве с ини-файлами работают? Мне очень нужны ИНИ!


BorisMor   (2003-07-30 13:18:00) [14]

В KOLUtils ( http://kol.mastak.ru/files/lib/KolUtils.zip) посмотри
uSavePosWindows
uLoadPosWindows


dataMaster   (2003-07-30 10:17:00) [15]

У меня есть простенький компонент для работы с ИНИ-файлами. Напиши мне - вышлю


Наверх

Титульная страница Поиск, карта сайта Написать письмо