пишу программу, в теле на моменте инициализации надо брать настройки из ини-файла.
кусок кода:
if not FileExists(ExtractFilePath(Application.ExeName)+'Engineering.ini') then
begin
CreateNewFile(ExtractFilePath(Application.ExeName)+'Engineering.ini');
end;
эта проверка проходит, файл и в самом деле есть. и содержимое у него самое что ни на есть правильное.
IniSet := TIniFile.Create(ExtractFilePath(Application.ExeName)+'Engineering.ini');
BaseName := IniSet.ReadString('Base', 'BaseName', cEmpty);
if BaseName=cEmpty then MsgBox('Ошибка', 'тест', mb_IconError + mb_OkCancel);
и вот именно на первой строке - оно спотыкается. т.е. 2 и 3я просто не отрабатываются.
Ошибка:
Error while trying to open file: Не удается найти указанный файл.
Теперь самый интересный момент - на компе, где программа пишется и проверяется - все отлично. На других - вот такая вот проблема.
Подскажите, в чем проблема...
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
11-12-2007 05:40
1. Записывай информацию об исключениях в лог.
Например, можно использовать JCL (http://sourceforge.net/project/showfiles.php?group_id=47514). Устанавливаем, открываем проект, включаем Project/Insert JCL Debug data, отключаем компиляцию с bpl-пакетами, включи Stack frames и пишем примерно такой код:
initialization
JclDebug.JclStackTrackingOptions := [stStack]; // обычный режим
// JclDebug.JclStackTrackingOptions := [stStack, stRawMode]; // более подробный режим
JclAddExceptNotifier(WriteDebugLog, npNormal);
JclStartExceptionTracking;
JclTrackExceptionsFromLibraries;
finalization
JclStopExceptionTracking;
end.
По каждому возникшему исключению будет создан подробный лог с указанием места возникновения ошибки:
An exception raised at 2007.11.30 12:26:38
System Error. Code: 126.
Не найден указанный модуль
(0000D67A){OrderForm.pgi} [0D0BE67A] SysUtils.RaiseLastOSError + $7A
2. Используется ли в проекте сторонние компоненты или код? Если да, то какие. Дело в том, что в стандартных сообщениях Delphi строку "Error while trying to open file" я не вижу. А сообщения ОС должны идти на русском языке (например, "Не удается найти указанный файл"). Следовательно, строку с сообщением об ошибке формирует не код Delphi и не код ОС.
3.
приходится баловаться всякими тестовыми сообщениями и прочими
Я правильно понял, что был проверен код наподобие:
ShowMessage('1');
IniSet := IniFile.Create(ExtractFilePath(Application.ExeName)+'Engineering.ini');
ShowMessage('2');
BaseName := IniSet.ReadString('Base', 'BaseName', cEmpty);
ShowMessage('3');
if BaseName=cEmpty then MsgBox('Ошибка', 'тест', mb_IconError + mb_OkCancel);
ShowMessage('4');
и при выполнении программы были показаны два сообщения: "1" и "Error while trying to open file: Не удается найти указанный файл."?
if not FileExists(ExtractFilePath(Application.ExeName)+'Engineering.ini') then
begin
CreateNewFile(ExtractFilePath(Application.ExeName)+'Engineering.ini');
end;
Александр Алексеев
после этой строки дальнейшие строки не обрабатываются, вот и все.
Повторюсь, на машине с Дэльфами - все работает отлично, так что отладкой нормальной сложно заниматься, приходится баловаться всякими тестовыми сообщениями и прочими
11-12-2007 04:45 | Вопрос к автору: запрос дополнительной информации
На моей Delphi 7 конструктор TIniFile.Create состоит в запоминании FileName и не может генерировать ошибки открытия файла, т.к. никакого файла не открывает.
Это какая версия Delphi? Класс TIniFile - стандартный из IniFiles? Также дайте посмотреть на CreateNewFile.
Уверены, что программа встаёт именно там, где вы сказали? Как вы это огпределили?
CreateNewFile(ExtractFilePath(Application.ExeName)+'Engineering.ini'); Непонятна эта строка. CreateNewFile - это ваша процедура? Вообще, проверку существует ли ini-файл делать не нужно, она уже выполняется при создании файла.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.