Это к вопросу о перехвате сообщений про аварию и завершение приложения, нашёл один из вариантов
Была проблема - в случае разрыва сети, проблем с сервером и т.д. оператору выводятся разные сомнительные сообщения об ошибках в View-Browse-Window, не имеющие отношения к действительности. А хочется узнать, что же случилось на самом деле.
Проблема ещё в том, что сообщение об ошибке, генерируемое драйвером, не перехватывается через методы ABC или в обработчике того или иного события. Поэтому идёт перехват Message с ошибкой
Краткий вариант примерно таков
Объявляем процедуру
LocalMessage
Код: Выделить всё
LocalMessage PROCEDURE (STRING Msg,<STRING Header>,<STRING Icon>,<STRING Buttons>,UNSIGNED Default,UNSIGNED Modal) ! Declare Procedure
SaveErr Group,Pre(SE)
Error Cstring(300)
ErrorCode Long
FileError Cstring(1000)
FileErrorCode Long
End
ErrLevel Long,Static,Thread ! Чтобы не отрабатывать повторную ошибку
FstrCount Long
CODE
Se:ErrorCode = ErrorCode()
Se:Error = Error()
Se:FileErrorCode = FileErrorCode()
Se:FileError = FileError()
! Переключаемся на стандартный Message
System{Prop:MessageHook}=0
! Выдаём стандартное сообщение
Ret#=Message(Msg,Header,Icon,Buttons,Default,Modal)
If ERRORCODE() ! Возможно, Inlist(ErrorCode(),90,47)
Case Message('Нет доступа к серверу или базе данных .|' & |
Choose(Se:Error & Se:FileError<>'', ' Ошибка ' & Se:Error & ' ' & Se:FileError,''), |
'Внимание!',Icon:Question,'Перезапуск|Завершить|Дальше')
Of 1
! Перезапуск
Do RunCommand
Of 2
! Завершение
Halt(0)
Of 3
END
End
System{Prop:MessageHook} = Address(LocalMessage)
Return Ret#
RunCommand Routine ! Перезапуск приложения
Data
Code
....
Chain( Command(''))
Halt(0)
Exit
В начале программы указываем
System{Prop:MessageHook} = Address(LocalMessage) и радуемся