Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.03 c
15-1136444105
WondeRu
2006-01-05 09:55
2006.01.29
Впечатление от праздника - неимоверно скучно!


2-1137054612
pathfinder
2006-01-12 11:30
2006.01.29
Организация транзакции.


6-1129277703
Razor
2005-10-14 12:15
2006.01.29
NTLM авторизация и Indy


4-1131065389
gdaujk
2005-11-04 03:49
2006.01.29
Способы автозагрузки


15-1136380135
Dasor
2006-01-04 16:08
2006.01.29
Помогите найти драйвер для мобилы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский