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

Вниз

Странное поведение 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.021 c
1-25735
Сергей Петров
2004-02-27 01:26
2004.03.09
Нехватка ресурсов под win98


14-25891
Akvilon
2004-02-15 02:04
2004.03.09
Ресурсы


1-25732
Android
2004-02-26 23:27
2004.03.09
RichEdit


1-25793
Pank
2004-02-26 10:23
2004.03.09
files


3-25715
КомофОнСамый
2004-02-10 13:55
2004.03.09
два грида на TNotebook, как сделать with или присвоение