Форум: "Основная";
Текущий архив: 2004.03.09;
Скачать: [xml.tar.bz2];
ВнизСтранное поведение TIniFile Найти похожие ветки
← →
Danilin (2004-02-25 13:30) [0]Я храню сообщения в TIniFile. Но при попытке выполнить код :
if FileExists("c:/SVGA.ini") then begin
SVGAIniFile:=TIniFile.Create("c:/SVGA.ini");
Edit1.Text:= SVGAIniFile.ReadString("Game1","Name","Game 1") ;
Edit2.Text:= SVGAIniFile.ReadString("Game2","Name","Game 2") ;
Edit3.Text:= SVGAIniFile.ReadString("Game3","Name","Game 3") ;
и т. д.
на втором ReadString получаю ошибку времени выполнения. Почему? Ошибка возникает под 6 и 7 делфях.
← →
Sandman25+1 (2004-02-25 13:31) [1]Какую ошибку?
← →
Anatoly Podgoretsky (2004-02-25 13:33) [2]Неверный синтаксис в имени файла. Это не Интернет, а файловая система MS DOS
← →
Ega23 (2004-02-25 13:35) [3]А почему слэш прямой?
Какого размера SVGA.ini?
← →
Андрей Сенченко (2004-02-25 13:37) [4]"c :/SVGA.ini"
Правда каким образом при этом FileExists возвращает TRUE - непонятно ...
← →
Sandman25+1 (2004-02-25 13:37) [5]Слэш только сейчас заметил.
А почему сработал FileExists???
← →
Anatoly Podgoretsky (2004-02-25 13:41) [6]А может он и не сработвал, просто там отладчик остановился. Информации подробной нет.
← →
PVOzerski (2004-02-25 13:41) [7]А в NT-системах и прямой слэш работает правильно, кстати.
← →
Anatoly Podgoretsky (2004-02-25 13:43) [8]PVOzerski © (25.02.04 13:41) [7]
А как тогда различается имя от параметра?
← →
Андрей Сенченко (2004-02-25 13:44) [9]PVOzerski © (25.02.04 13:41) [7]
Тогда дело было не в бобине - все ReadString-и должны отработать.
Danilin (25.02.04 13:30)
А можно воочию увидеть раздел GAME2 Вашего INI-файла ?
← →
Андрей Сенченко (2004-02-25 13:45) [10]Anatoly Podgoretsky © (25.02.04 13:43) [8]
По всей видимости по наличию пробела ?
← →
Anatoly Podgoretsky (2004-02-25 13:50) [11]Проверил принимает ключи и без пробела перед ними
cmd/? и cmd /? восриняты одинаково
← →
Danilin (2004-02-25 14:17) [12]Размер SVGA.ini 136 байт. Все секции заведомо есть. Замена слеша не помогло. При этом при пошаговой трассировке программа входит в блок, первый .ReadString обрабатывается коректно, а на втором получаю ошибку доступа EAccessViolation .
← →
Anatoly Podgoretsky (2004-02-25 14:21) [13]Приведи текущий исправленный код, часть ини файла относящегося к этому коду и подтверди, что объекты
Edit1, Edit2, Edit3 существуют созданы и в пределах видимости именно те о которых ты подразумеваешь. Это можно проверить и в отладчике, в окне Watch
← →
PVOzerski (2004-02-25 14:23) [14]2Anatoly Podgoretsky © (25.02.04 13:50) [11]:
Я успешно запустил c:/winnt/system32/command.com :^)
Однако замечу: из-под cmd.exe, а не из-под command.com. Во 2-м случае прямой слэш не годится.
← →
Anatoly Podgoretsky (2004-02-25 14:28) [15]Я тоже проверял из под cmd.exe, возможно существует какой то элемент интеллектуальности, когда система разбирается где путь, а где начинается параметр, но обе проверки упрощенные, и проще просто соблюдать правила, чем рисковать каждый раз, "а как это система поймет"
← →
Anatoly Podgoretsky (2004-02-25 14:33) [16]Вот такую проверку не поняла c:/winnt/system32/cmd/?
А такую проверку поняла c:/winnt/system32/cmd /?
И такую проверку поняла c:\winnt\system32\cmd/?
Последняя соответствует системным требованиям
← →
PVOzerski (2004-02-25 14:42) [17]Во всяком случае, когда надо делать разбор путей, я учитываю и возможность встречи "прямого" слэша.
← →
Anatoly Podgoretsky (2004-02-25 14:48) [18]Проверять не охота, но вот как отработает ParamStr(0) во всех трех случаях, насколько ожидаемо.
При разборе конечно, но проблема интерпритации последнего слеша остается.
← →
Delphin (2004-02-25 14:53) [19]if FileExists("c:\SVGA.ini") then begin
SVGAIniFile:=TIniFile.Create("c:\SVGA.ini");
IF SVGAiniFile.ValueExists("Game1","Name") Then
Edit1.Text:= SVGAIniFile.ReadString("Game1","Name","Game 1") ;
IF SVGAiniFile.ValueExists("Game2","Name") Then
Edit2.Text:= SVGAIniFile.ReadString("Game2","Name","Game 2") ;
IF SVGAiniFile.ValueExists("Game3","Name") Then
Edit3.Text:= SVGAIniFile.ReadString("Game3","Name","Game 3") ;
end;
End;
Так по идее должно работать
← →
PVOzerski (2004-02-25 14:56) [20]{$apptype console}
var
f:text;
begin
writeln(paramstr(0));
assign(f,"D:/User/PAVEL/aaa/aaa.txt");
rewrite(f);
close(f);
end.
Итог проверки (D6 и FPC1.9):
1) в paramstr(0) слэши автоматически заменились на обратные.
2) файл с "прямыми" слэшами успешно создался.
← →
olookin (2004-02-25 15:03) [21]if FileExists("c:/SVGA.ini") then begin
SVGAIniFile:=TIniFile.Create("c:/SVGA.ini");
Edit1.Text:= SVGAIniFile.ReadString("Game1","Name","Game 1") ;
Edit2.Text:= SVGAIniFile.ReadString("Game2","Name","Game 2") ;
Edit3.Text:= SVGAIniFile.ReadString("Game3","Name","Game 3") ;
Все работает! Ищите в другом месте проблему.
← →
Владислав (2004-02-25 15:05) [22]Все дело в paramstr(0)
Ей пофигу, что там GetCommandLine возвращает.
← →
Anatoly Podgoretsky (2004-02-25 15:12) [23]olookin © (25.02.04 15:03) [21]
Скажем из за неакуратной работы с памятью портим в однм месте, а ошибка вылетает в другом месте, я даже уверен, что проверка диапазонов в проекте отключена, а не помешало бы включить и перестроить весь проект, может сразу ключа глюков вылезет.
← →
olookin (2004-02-25 15:26) [24][23] Anatoly Podgoretsky © (25.02.04 15:12)
Скажем из за неакуратной работы с памятью портим в однм месте, а ошибка вылетает в другом месте
Согласен, вынужден согласиться, сам с таким сталкивался!
← →
Danilin (2004-02-26 10:54) [25]Думаете память портится в другом месте? Слеш точно не причем. В явном виде (New и т.д. ) операции с памятью не проводились.
SVGA.ini :
[Game1]
Name=DSA
[Game2]
Name=DSA2
[Game3]
Name=DSA3
[Game4]
Name=DSA4
[Game5]
Name=5
[Game6]
Name=6
[Game7]
Name=7
[Game8]
Name=8
← →
Danilin (2004-02-26 12:22) [26]Всем спасибо. Разобрался сам. Странное поведение обусловлено тем, у Edit -ов есть обработчик onChange. Где так-же происходит SVGAIniFile.Create и SVGAIniFile.Free . Это и приводит к возникновении ошибки в втором .ReadString .
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.03.09;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.008 c