![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюк Дельфи с записью строковой переменной [D6, WinXP]
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 23:57:00) [1]Аа, блин, допер в каком случае координаты сохранялись....ладно, тему можно считать закрытой! Всем шпасибо... ;-))
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
NailMan (2005-12-24 23:48:00) [2]Джо ©
Ну я же собственными глазами видел новые координаты в том файле что создавался рядом с прогой, при том варианте открытия файла какой был! Если новые координаты в тот файл который создавался вносились нормально, то значит это как-то работало...чет я совсем запутался...
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
Джо (2005-12-24 23:44:00) [3]
> PS: Все таки мне до сих пор не понятно почему в ошибочном
> варианте сохранения файла, строковая переменная криво сохранялась,
>
Ты это серьезно, или шутишь?
NailMan (2005-12-24 22:37:00) [4]Verg ©
> Это твои координаты в параллельном мире?
Конечно мои!
PS: Все таки мне до сих пор не понятно почему в ошибочном варианте сохранения файла, строковая переменная криво сохранялась, а конверченные в строку числовые и булевые переменные сохранялись в файл нормально...если с каждым запуском передвигать форму, то ее координаты в конфиге сохранялись и потом успешно считывались. :-\
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
Verg (2005-12-24 21:12:00) [5]
> 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 20:45:00) [6]Verg ©
Да кто ж не отрицает того что я псих? Конечно психъ...пойду ка отдохну за склеиванием элеронов...программу на поздний вечер оставлю :-)
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
Verg (2005-12-24 20:11:00) [7]
> NailMan © (24.12.05 15:16) [6]
> Verg ©
> "Я псих, но не настолько!" (С) пилот вертолета в "Крепкий
> орешек-2"
Ну, так как? Насчет "психа"?
vertal (2005-12-24 20:02:00) [8]Пользуйся TOptionsDialog из кладовки :)))
Джо (2005-12-24 18:36:00) [9]В папке Windows в любом случае нельзя, ибо не будет работать на нормально настроенной NT-системе.
Джо (2005-12-24 18:34:00) [10]
> [14] NailMan © (24.12.05 18:15)
> Джо ©
> Сделал ужо фичу выбора - либо в винде держать, либо вместе
> с прогой. :-)
Рекоммендуют вообще в ApplicationData для конкретного (или всех — AllUsers) пользователей.
NailMan (2005-12-24 18:15:00) [11]Джо ©
Сделал ужо фичу выбора - либо в винде держать, либо вместе с прогой. :-)
Реестр для настроек полюбому юзать не буду.
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
Джо (2005-12-24 18:12:00) [12]
> Вообще, в конце концов прога держит конфиг в папке C:\WINDOWS
> или куда там система установлена,
Некошерно там держать.
NailMan (2005-12-24 16:27:00) [13]Джо ©
Упс, точняк.
Вообще, в конце концов прога держит конфиг в папке C:\WINDOWS или куда там система установлена, а на время написания новой версии решил держать там где лежит проект(чтобы старой пользоваться пока)... Вобщем заработала шарманка :-)) Пасиб.
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
Джо (2005-12-24 16:16:00) [14]
Procedure SaveVariables;
...
f:=FileCreate( ExtractFilePath(Application.ExeName) +ConfigName);
Ты при старте и выходе писал в совершенно разные файлы. Дед Мазай будет полный путь указывать? ;-)
NailMan (2005-12-24 15:48:00) [15]Джо ©
Каюсь каюсь, грю же почти с ума сошел ;-) забыл.. но см. выше как без них запуститься.
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
Джо (2005-12-24 15:47:00) [16]Если уж выкладываешь исходники, то выкладывал бы полностью... Где DirectShow.pas?
NailMan (2005-12-24 15:43:00) [17]PPS:
Чтобы без DirecShow модулей запустилось надо в NMPlayer.dpr закоментировать в Uses модуль NM_VideoEngine
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
NailMan (2005-12-24 15:18:00) [18]PS: Объявление проблемной переменной и сохранение на винт в конфиге в модуле NM_Vars, использование(изменение) по назначению в модуле NM_PlaylistForm
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
NailMan (2005-12-24 15:16:00) [19]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
Verg (2005-12-24 14:59:00) [20]Полное ощущение, что смотришь ты не тот файл, в который записываешь.