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

Вниз

Нету ли директивы компилятора, которая показывает строку в коде   Найти похожие ветки 

 
Song ©   (2003-08-30 18:06) [0]

где эта директива стоит?
Давно хотел узнать.


 
Song ©   (2003-08-30 18:07) [1]

В смысле её номер.


 
Юрий Зотов ©   (2003-08-30 18:41) [2]

Директивы нет, но можно использовать Assert с отловом Exception (можно и глобальным). В сообщении есть номер строки, парсится элементарно.


 
Song ©   (2003-08-30 18:50) [3]

Хотелось бы чего-нибудь такого:

MessageDlg("... Ошибка. Код ошибки: "+SysErrorMessage(GetLastError+". CurrentUnit x "+{$LineNumber}+". Обратитесь к разработчику.",mtError,[mbOk],0);

А как через Assert.. даже пока не представляю, сейчас гляну.


 
Юрий Зотов ©   (2003-08-30 19:10) [4]

В нужных местах просто вызываете Assert, а в OnExeption получаете сообщение с номером строки вызова.


 
Anatoly Podgoretsky ©   (2003-08-30 19:19) [5]

Кроме Assert вроде ничего нет


 
vuk ©   (2003-08-30 19:20) [6]

По большому счету, если нужно знать, где ошибка произошла, то можно попробовать использовать трассировку стека исключений из JVCL. Правда там понадобится либо отладочная информация либо .map файл.


 
Avsam ©   (2003-08-31 00:33) [7]

{$LineNumber} - что это?


 
Anatoly Podgoretsky ©   (2003-08-31 00:52) [8]

Avsam © (31.08.03 00:33) [7]
Это где?


 
Alex Konshin ©   (2003-08-31 03:13) [9]

В JCL есть, там целый раздел посвящен использованию отладочной информации.
Смотри http://sourceforge.net/projects/jcl/


 
Song ©   (2003-08-31 09:54) [10]

2[7] Avsam © (31.08.03 00:33)

> {$LineNumber} - что это?


Я ж написал: "хотелось бы"


 
Song ©   (2003-09-03 13:16) [11]

Сделал через Assert, строчку в тексте выцепляю,но повилась проблема.


Var ErrorLineNumber: String; // глобальная

procedure TMain.FormCreate(Sender: TObject);
begin
With Application Do
Begin
onMessage:=OnMessageProc;
onException:=onExceptionProc;
End; {With}
end;

procedure TMain.onExceptionProc(Sender: TObject; E: Exception);
Var S: String;
begin
IF Pos("line",E.Message)>0 then
Begin
S:=E.Message;
S:=Copy(S,Pos("line",S)+5,Length(S));
ErrorLineNumber:=Copy(S,1,Length(S)-1);
Application.HandleException(Sender);
End else
{ ????? ?????? ????????? ?? ?????? }
Begin
NewSp5Form.MakeSound(300,300);
MessageDlg("?????????? ???????????? ??????. ??? ??????: "+E.Message+"."#13#10+
"??? ?????????? ???????? ???????? ? ?????????? ?????????? ? ????????????, ?????? ??????? ? ???????? ????????????? ??????.",mtError,[mbOk],0);
End; {else}
end;

Из другого модуля

try
...
// Здесь что-то, что может привести к исключению
except
{ Достаём номер строчки }
Assert(False);
MessageDlg("Ошибка. Код ошибки: "+SysErrorMessage(GetLastError)+". Модуль XXX x "+ErrorLineNumber,mtError,[mbOk],0);
end;

Вроде всё должно работать, т.е. перед выводом сообщения о ошибке получаем номер строки, для этого вызываем Assert, а потом передаём этот номер в MessageDlg(). Но вызов Assert даёт исключение EAssertException, что прерывает ход программы и MessageDlg() не запускается. Как лечить?


 
Song ©   (2003-09-03 13:17) [12]

Вот этой строчки быть не должно: Application.HandleException(Sender)


 
Song ©   (2003-09-03 15:14) [13]

Всем спасибо, кто заинтересовался.
Вопрос решил, правда грубовато, но решил.



Страницы: 1 вся ветка

Текущий архив: 2003.09.15;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.033 c
1-48610
MakNik
2003-09-03 13:42
2003.09.15
DBLookupComboBox1


3-48467
Xmen
2003-08-22 08:49
2003.09.15
MasterSource


3-48399
rh
2003-08-26 12:39
2003.09.15
Записать текущую дату


1-48537
VID
2003-09-02 09:21
2003.09.15
Не могу понять, что за фигня...


1-48594
MakNik
2003-09-03 12:11
2003.09.15
FloatToStr