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

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

Глюк Дельфи с записью строковой переменной [D6, WinXP]


Страницы:   1 2

NailMan ©   (2005-12-24 12:51:00) 

Здравствуйте товарищи по умственному цеху!

Помогите разобраться у кого глюки возникли(у меня или Дельфи) и как решить проблему.

Имеется программа(видеоплеер) которую только начал переписывать заново. На данном этапе интерфейсную часть переделываю. Имеется  строковая переменная:
var LastBrowsingPath : string;
Она обновляется(и используется) в программе каждый раз когда удачно был открыт файл(переменная хранит путь к последнему открытому файлу):

OpenVideoDialog.InitialDir:=LastBrowsingPath;
If openVideodialog.Execute then
 begin
...
...
  LastBrowsingPath:=extractfilepath(OpenVideoDialog.FileName);
 end;


Далее когда приложение закрывается эта переменная сохраняется в текстовом инишнике, который на данный момент валяется там же где и программа.

Запись в файл организована своей собственной процедурой, так как в качестве хэндлов файлов используются Integer (использую fileCreate, filewrite, fileread, fileclose). Почему не обычные файлы - с ними возникало проблемы когда большое количество открывалось и так уж исторически пошло.
Сама процедура:

Procedure WriteLnStr(var fHandle:Integer;S:String);
begin
 if fhandle>0 then
  begin
   s:=s+EOL_Tag;
   FileWrite(FHandle,pchar(s)^,Length(S));
  end;
end;


EOL_Tag в данном контексте это константа имеющая значение EOL_Tag = chr(13) + chr(10);

Итак в чем глюк:
В файл конфигурации сохраняется много всякого добра(все в виде текста разумеется) и в конце сохраняется LastBrowsingPath. Дефолтное значение переменной "C:\", которое задается тогда когда программа запускается в первый раз и инишника нет.
Однако, после того как в программе изменяю значение переменой(см. выше), на выходе она сохраняется в файл и прога закрывается, файл хранит дефолтное значениепеременной, а не новое!!! Проверял процедуру сохранения пошагово и следил за соджержимым LastBrowsingPath. До и после момента записи в файл содержимое новое, а записывается старое!

Пошагово проходил в самой процедуре writelnstr- на вход приходит новое значение переменной LastBrowsingPath и сохраняется именно оно! Но в файле, когда я открываю его текстовым редактором - опять "C:\"  :-(

Все остальные переменные сохраненные в виде строк, в примерно таком виде: "PlayListWidth=392" или "UseFileRecognize=FALSE" -  прекрасно сохраняют свои новые значения(если изменяются в программе).

Кроме того в старом проекте все сохраняется на ура и даже такая же строковая переменная  LastBrowsingPath. Ничего не менял в коде и расположении.

После записи инишника никаких манипуляций с переменной или файлом конфига не происходит, только восстанавливается системный разделитель дробной части числа, убивается один объект и восстанавливается состояние скринсейвера. Нигде никто более переменной LastBrowsingPath или файл инишника не использует!

В чем тут фишка, объясните? И что делать дальше?


NailMan   (2005-12-24 13:57:00) [21]

Да, еще хотел добавить. переменная LastBrowsingPath глобальная для всех модулей проекта, но с таким именем переменных больше нет нигде, так что варианты что сохраняется что-то иное локальное  отпадает.

---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13


NailMan   (2005-12-24 13:52:00) [22]

begin...end ©
PS:
И всё же не совсем понятно, почему не используются стандартные ini-файлы (TIniFile).
Неудобен он мне, вот и не пользуюсь.

---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13


NailMan   (2005-12-24 13:51:00) [23]

begin...end ©

Да, с Var наверно переглядел я, убрал. Оно там не нужно(процедура давно писалась).

Вобщес сделал как посоветовал - одна фигня разница. Причем самое то интересное - он сохраняет то остальные параметры в текстовом виде нормально! И только строковую переменную не хочет..

Не приведён код открытия и закрытия файла (кстати, он закрывается?).

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

Procedure SaveVariables;
var
       f,i:integer;
       n:string;

begin
f:=FileCreate(ConfigName);
 n:='['+GenerateNMP+' Media Player Configuration File v'+FileVersion+']';
 writelnstr(f,n);
 writelnstr(f,'');
 writelnstr(f,'[Window Config]');
 writelnstr(f,'MainLeft='+inttostr(MainLeft));
 writelnstr(f,'MainTop='+inttostr(MainTop));
 writelnstr(f,'ShowUpperMenu='+convbool(ShowUpperMenu));
 WindowInitType:=GetInit;
 writelnstr(f,'WindowInitType='+inttostr(WindowInitType));

 writelnstr(f,'');
 writelnstr(f,'[Interface Config]');
 writelnstr(f,'Language='+convbool(Language));
 writelnstr(f,'AlwaysOnTop='+convbool(AlwaysOnTop));
 writelnstr(f,'DblClkShowCtrlMenu='+convbool(DblClkShowCtrlMenu));
 writelnstr(f,'EnableStick='+convbool(EnableStick));

 writelnstr(f,'');
 writelnstr(f,'[Sound volume Config]');
 writelnstr(f,'SoundVolume='+inttostr(SoundVolume));
 writelnstr(f,'DVDSoundVolume='+inttostr(DVDSoundVolume));
 n:='';
 For i:=0 to 16 do
  n:=n+inttostr(VideoVolumeTable[i] div 100)+'|';
 writelnstr(f,'VideoVolumeTable='+n);
 n:='';
 For i:=0 to 16 do
  n:=n+inttostr(DVDVolumeTable[i] div 100)+'|';
 writelnstr(f,'DVDVolumeTable='+n);

 writelnstr(f,'');
 writelnstr(f,'[Playback Config]');
 writelnstr(f,'SaveVideoProportions='+convbool(SaveVideoProportions));
 writelnstr(f,'RunAfterOpen='+convbool(RunAfterOpen));
 writelnstr(f,'RewindAtEndAndStop='+convbool(RewindAtEndAndStop));
 writelnstr(f,'PauseOnModalWindows='+convbool(PauseOnModalWindows));
 writelnstr(f,'UseFileRecognize='+convbool(UseFileRecognize));
 writelnstr(f,'UseResumeFunc='+convbool(UseResumeFunc));

 writelnstr(f,'');
 writelnstr(f,'[PlayList Config]');
writelnstr(f,'LastBrowsingPath='+LastBrowsingPath);
 writelnstr(f,'PlayListLeft='+inttostr(PlayListLeft));
 writelnstr(f,'PlayListTop='+inttostr(PlayListTop));
 writelnstr(f,'PlayListWidth='+inttostr(PlayListWidth));
 writelnstr(f,'PlayListHeight='+inttostr(PlayListHeight));
 writelnstr(f,'PlaylistEnableStick='+convbool(PlaylistEnableStick));
 writelnstr(f,'PlaylistAOT='+convbool(PlaylistAOT));
 writelnstr(f,'PlaylistSorting='+convbool(PlaylistSorting));
 writelnstr(f,'PlaylistSingleFileExist='+convbool(PlaylistSingleFileExist));
 writelnstr(f,'PlaylistoadActionOnLoad='+inttostr(PlaylistoadActionOnLoad));
 writelnstr(f,'PlaylistKillDeadFiles='+convbool(PlaylistKillDeadFiles));
 writelnstr(f,'playlistPlayCycled='+convbool(playlistPlayCycled));
 writelnstr(f,'PlaylistSavePlaylistInConfig='+convbool(PlaylistSavePlaylistInConfig));
 writelnstr(f,'PlaylistSortOnlyNewFiles='+convbool(PlaylistSortOnlyNewFiles));

FileClose(f);
end;


сейчас попробовал сделать следующее:
- добавил левую переменную teststrvar : string;
- дефолтное значение teststrvar:='teststring=TEST+';

в конце записи секции [PlayList Config]
вставил код
 teststrvar:=teststrvar+LastBrowsingPath;
 writelnstr(f,teststrvar);


Пошагово выполняю и вижу что получает новое значение n='teststring=TEST+D:\TEMP\';

но в файл опять попадает "teststring=TEST+С:\"

Новое значение переменной teststrvar сохраняется, а новое значение LastBrowsingPath не хочет!

Вобщем мистика какая то!!! Третий день уже парюсь...

---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13


begin...end   (2005-12-24 13:10:00) [24]

> NailMan ©   (24.12.05 12:51)

> Procedure WriteLnStr(var fHandle:Integer; ...

Почему var?

> if fhandle>0 then

Почему >0, а не <>-1?

> FileWrite(FHandle,pchar(s)^,Length(S));

Почему нет проверки на ошибку? Замените на Win32Check(FileWrite(...) <> -1).

Где находится указатель в файле перед записью (было ли Seek)?

Не приведён код открытия и закрытия файла (кстати, он закрывается?). И всё же не совсем понятно, почему не используются стандартные ini-файлы (TIniFile).


Страницы:   1 2

Наверх

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