Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.29;
Скачать: CL | DM;

Вниз

Глюк Дельфи с записью строковой переменной   Найти похожие ветки 

 
NailMan ©   (2005-12-24 12:51) [0]

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

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

Имеется программа(видеоплеер) которую только начал переписывать заново. На данном этапе интерфейсную часть переделываю. Имеется  строковая переменная:
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 или файл инишника не использует!

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


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

> 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).


 
NailMan ©   (2005-12-24 13:51) [2]

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


 
NailMan ©   (2005-12-24 13:52) [3]

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

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


 
NailMan ©   (2005-12-24 13:57) [4]

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

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


 
Verg ©   (2005-12-24 14:59) [5]

Полное ощущение, что смотришь ты не тот файл, в который записываешь.


 
NailMan ©   (2005-12-24 15:16) [6]

Verg ©
"Я псих, но не настолько!" (С) пилот вертолета в "Крепкий орешек-2"

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

Исходники проекта.
http://nailman.cyborghome.ru/zakroma/archives/_nmptest.rar

Для того чтобы изменить значение проблемной переменной нужно запустить проект, открыть плейлист, нажать кнопочку "+" выбрать любой доступный видеофайл находящийся не в корне c:\, закрыть плейлист и само приложение. Далее смотреть текстредактором в появившемся конфиге NMPlayer.ini в начале последней секции. В хорошем случае, после "LastOpenedFolder=" не должно быть "c:\"

проверьте плз, кто может!!! Я скоро с ума сойду!

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


 
NailMan ©   (2005-12-24 15:18) [7]

PS: Объявление проблемной переменной и сохранение на винт в конфиге в модуле NM_Vars, использование(изменение) по назначению в модуле NM_PlaylistForm

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


 
NailMan ©   (2005-12-24 15:43) [8]

PPS:

Чтобы без DirecShow модулей запустилось надо в NMPlayer.dpr закоментировать в Uses модуль NM_VideoEngine

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


 
Джо ©   (2005-12-24 15:47) [9]

Если уж выкладываешь исходники, то выкладывал бы полностью... Где DirectShow.pas?


 
NailMan ©   (2005-12-24 15:48) [10]

Джо ©
Каюсь каюсь, грю же почти с ума сошел ;-) забыл.. но см. выше как без них запуститься.

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


 
Джо ©   (2005-12-24 16:16) [11]


Procedure SaveVariables;
...
f:=FileCreate(ExtractFilePath(Application.ExeName) + ConfigName);

Ты при старте и выходе писал в совершенно разные файлы. Дед Мазай будет полный путь указывать? ;-)


 
NailMan ©   (2005-12-24 16:27) [12]

Джо ©
Упс, точняк.

Вообще, в конце концов прога держит конфиг в папке C:\WINDOWS или куда там система установлена, а на время написания новой версии решил держать там где лежит проект(чтобы старой пользоваться пока)... Вобщем заработала шарманка :-)) Пасиб.

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


 
Джо ©   (2005-12-24 18:12) [13]


> Вообще, в конце концов прога держит конфиг в папке C:\WINDOWS
> или куда там система установлена,

Некошерно там держать.


 
NailMan ©   (2005-12-24 18:15) [14]

Джо ©
Сделал ужо фичу выбора - либо в винде держать, либо вместе с прогой. :-)

Реестр для настроек полюбому юзать не буду.

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


 
Джо ©   (2005-12-24 18:34) [15]


>  [14] NailMan ©   (24.12.05 18:15)
> Джо ©
> Сделал ужо фичу выбора - либо в винде держать, либо вместе
> с прогой. :-)

Рекоммендуют вообще в ApplicationData для конкретного (или всех — AllUsers) пользователей.


 
Джо ©   (2005-12-24 18:36) [16]

В папке Windows в  любом случае нельзя, ибо не будет работать на нормально настроенной NT-системе.


 
vertal ©   (2005-12-24 20:02) [17]

Пользуйся TOptionsDialog из кладовки :)))


 
Verg ©   (2005-12-24 20:11) [18]


> NailMan ©   (24.12.05 15:16) [6]
> Verg ©
> "Я псих, но не настолько!" (С) пилот вертолета в "Крепкий
> орешек-2"


Ну, так как? Насчет "психа"?


 
NailMan ©   (2005-12-24 20:45) [19]

Verg ©  
Да кто ж не отрицает того что я псих? Конечно психъ...пойду ка отдохну за склеиванием элеронов...программу на поздний вечер оставлю :-)

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


 
Verg ©   (2005-12-24 21:12) [20]


> NailMan ©   (24.12.05 20:45) [19]


OK!
Последую твоему примеру :)))

P.S.

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


Это твои координаты в параллельном мире?


 
NailMan ©   (2005-12-24 22:37) [21]

Verg ©
> Это твои координаты в параллельном мире?

Конечно мои!

PS: Все таки мне до сих пор не понятно почему в ошибочном варианте сохранения файла, строковая переменная криво сохранялась, а конверченные в строку числовые и булевые переменные сохранялись в файл нормально...если с каждым запуском передвигать форму, то ее координаты в конфиге сохранялись и потом успешно считывались. :-\

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


 
Джо ©   (2005-12-24 23:44) [22]


> PS: Все таки мне до сих пор не понятно почему в ошибочном
> варианте сохранения файла, строковая переменная криво сохранялась,
>

Ты это серьезно, или шутишь?


 
NailMan ©   (2005-12-24 23:48) [23]

Джо ©
Ну я же собственными глазами видел новые координаты в том файле что создавался рядом с прогой, при том варианте открытия файла какой был! Если новые координаты в тот файл который создавался вносились нормально, то значит это как-то работало...чет я совсем запутался...



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


 
NailMan ©   (2005-12-24 23:57) [24]

Аа, блин, допер в каком случае координаты сохранялись....ладно, тему можно считать закрытой! Всем шпасибо... ;-))

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



Страницы: 1 вся ветка

Текущий архив: 2006.01.29;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.043 c
2-1137133159
Неумейка
2006-01-13 09:19
2006.01.29
Помогите пожалуйста уважаемые программисты с процедурами !


2-1136963652
vinali
2006-01-11 10:14
2006.01.29
Вопрос по созданию таблиц????????????


2-1136967660
Slaga
2006-01-11 11:21
2006.01.29
Ошибки при запуске сервиса


3-1133163291
boalse
2005-11-28 10:34
2006.01.29
Хэш-функция и поиск


15-1136731107
Kobik
2006-01-08 17:38
2006.01.29
Тупим. Помогите решить :)