Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  20:10[Войти] | [Зарегистрироваться]
Ответ на вопрос № 57687

11-12-2007 04:04
Доброго времени суток всем!

пишу программу, в теле на моменте инициализации надо брать настройки из ини-файла.
кусок кода:

  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: Не удается найти указанный файл.



Теперь самый интересный момент - на компе, где программа пишется и проверяется - все отлично. На других - вот такая вот проблема.
Подскажите, в чем проблема...

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

11-12-2007 05:40
1. Записывай информацию об исключениях в лог.

Например, можно использовать JCL (http://sourceforge.net/project/showfiles.php?group_id=47514). Устанавливаем, открываем проект, включаем Project/Insert JCL Debug data, отключаем компиляцию с bpl-пакетами, включи Stack frames и пишем примерно такой код:

uses JclDebug, JclHookExcept;

...

procedure WriteDebugLog(ExceptObj: TObject; ExceptAddr: Pointer; OSException: Boolean);
var
  ErrorMessage, FileName: String;
  X: Integer;
  FS: TFileStream;
begin
  try
    ErrorMessage := 'An exception raised at ' + DateTimeToStr(Now) + #13#10 +
                    Exception(ExceptObj).Message + #13#10 +
                    GetLocationInfoStr(ExceptAddr, True, True, True, True) + #13#10 +
                    #13#10 +
                    'Call stack:'#13#10;
    if JclLastExceptStackList = nil then
      ErrorMessage := ErrorMessage + '  [NOT AVAILABLE]'#13#10
    else
      for X := 0 to JclLastExceptStackList.Count - 1 do
        ErrorMessage := ErrorMessage + '  ' + GetLocationInfoStr(JclLastExceptStackList.Items[X].CallerAdr, True, True, True, True) + #13#10;
    ErrorMessage := ErrorMessage + #13#10;
    FileName := ChangeFileExt(Application.ExeName, '.log');
    if FileExists(FileName) then
      FS := TFileStream.Create(FileName, fmOpenReadWrite, fmShareExclusive)
    else
      FS := TFileStream.Create(FileName, fmCreate, fmShareExclusive);
    try
      FS.Position := FS.Size;
      FS.WriteBuffer(ErrorMessage[1], Length(ErrorMessage));
    finally
      FreeAndNil(FS);
    end;
  except
  end;
end;

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

Call stack:
  (0000D675){OrderForm.pgi} [0D0BE675] SysUtils.RaiseLastOSError + $75
  (000DA0D4){OrderForm.pgi} [0D18B0D4] UnitMain.TfmMain.btReportClick (Line 1707, "UnitMain.pas" + 86) + $0      << видно, что ошибка сидит в модуле UnitMain в строке 1707
  (0006C278){OrderForm.pgi} [0D11D278] Controls.TControl.Click + $64
  (0006EF6F){OrderForm.pgi} [0D11FF6F] Controls.TWinControl.WndProc + $157
  (0006F0A7){OrderForm.pgi} [0D1200A7] Controls.DoControlMsg + $23
  (0006EF6F){OrderForm.pgi} [0D11FF6F] Controls.TWinControl.WndProc + $157
  (0006EBEC){OrderForm.pgi} [0D11FBEC] Controls.TWinControl.MainWndProc + $2C
  (00026D08){OrderForm.pgi} [0D0D7D08] Classes.StdWndProc + $14


Также можно использовать madExcept (http://www.madshi.net/madExceptDescription.htm), eurekalog (http://www.eurekalog.com/).

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: Не удается найти указанный файл."?

11-12-2007 05:08
попробуйте без вот этой строчки:

if not FileExists(ExtractFilePath(Application.ExeName)+'Engineering.ini'then
  begin
  CreateNewFile(ExtractFilePath(Application.ExeName)+'Engineering.ini');
end;


11-12-2007 04:59 | Сообщение от автора вопроса
Delphi Professional SE 7.2

11-12-2007 04:56 | Сообщение от автора вопроса
CreateNewFile - неважно, от замены этого на

if FileExists(ExtractFilePath(Application.ExeName)+'Engineering.ini'then
  begin
  //окно тестовое или еще какая сигналка
end;


не меняется ничего

procedure CreateNewFile(aPath : string);
Var
  Stream : TFileStream;
begin
  Stream := Nil;
  try
    Stream := TFileStream.Create(aPath, fmCreate);
  finally
    Stream.Free;
  end;
end;



Александр Алексеев
после этой строки дальнейшие строки не обрабатываются, вот и все.

Повторюсь, на машине с Дэльфами - все работает отлично, так что отладкой нормальной сложно заниматься, приходится баловаться всякими тестовыми сообщениями и прочими

11-12-2007 04:45 | Вопрос к автору: запрос дополнительной информации
На моей Delphi 7 конструктор TIniFile.Create состоит в запоминании FileName и не может генерировать ошибки открытия файла, т.к. никакого файла не открывает.

Это какая версия Delphi? Класс TIniFile - стандартный из IniFiles? Также дайте посмотреть на CreateNewFile.

Уверены, что программа встаёт именно там, где вы сказали? Как вы это огпределили?

11-12-2007 04:41
CreateNewFile(ExtractFilePath(Application.ExeName)+'Engineering.ini'); Непонятна эта строка. CreateNewFile - это ваша процедура? Вообще, проверку существует ли ini-файл делать не нужно, она уже выполняется при создании файла.

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Зимой — белый, летом — серый. Кто?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования