On-line: Мирослав, гостей 0. Всего: 1 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 5855
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.05.18 21:33. Заголовок: Вылет из программы...


Всем привет !
Как можно в МиниГуи программе сделать вызов своих функций при аварийном завершении программы (т.е. при вылете) ?
Т.е. хочу сделать сразу после появления MsgBox() вызов 2-3 функций и потом сделать DbCloseAll().
Как это реализовать ?

Для чего это нужно, поясню: при входе в свою программу я пишу в базу кто и когда вошел в программу (логин пользователя).
И при выходе из программы, стираю этого пользователя из базы.
Если программа "вылетает", то юзер числится как работающий.
Древнее наследие с клипера, хотел переделать, да так и осталось.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 167 , стр: 1 2 3 4 5 6 7 8 9 All [только новые]


постоянный участник




Пост N: 6976
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 04.07.21 18:57. Заголовок: PSP пишет: Вот и пр..


PSP пишет:

 цитата:
Вот и проверяй, что за херня в cFileLog в этот момент содержится.


Файл нормальный, ошибки в него печатаю, потом поднимаю:
      IF FILE(cFileLog) 
cMsg := "Исправьте ошибки и повторите печать заново;"
cMsg += "Всего ошибок = " + HB_NtoS( nErr ) + ";;"
cMsg += "Список ошибок появиться после этого окна !"
MG_Stop( cMsg, "Ошибки печати" ) // функция на базе HMG_Alert()
DO EVENTS
cMsg := CRLF + "Исправьте ошибки и повторите печать заново !" + CRLF
cMsg += "Всего ошибок = " + HB_NtoS( nErr )
STRFILE( cMsg + CRLF, cFileLog, .T. )
DO EVENTS
ShellExecute( , 'open', cFileLog, , , SW_SHOWNORMAL) // строка 1437
DO EVENTS
ENDIF

Блокнот открывает его и показывает !
Почему после открытия блокнота прога валиться ?
Почему срабатывает вот этот код после ShellExecute() ?
Called from UPPER(0)
Called from (b)TCNLDATA(795) in module: h_objects.prg
Called from TCNLDATA:DEL(0)
Called from (b)TCNLDATA(834) in module: h_objects.prg
Called from TCNLDATA:DESTROY(0)
Called from TWNDDATA:__msgDestructor(736) in module: h_objects.prg

Вот исходник h_objects.prg:
#ifndef __XHARBOUR__ 
METHOD PROCEDURE DestroyObject() CLASS TWndData

::Destroy() // строка 736

RETURN
#endif


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7405
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 04.07.21 19:26. Заголовок: Andrey пишет: Почем..


Andrey пишет:

 цитата:
Почему срабатывает вот этот код после ShellExecute() ?


ShellExecute ведь не приостанавливает работу программы , поэтому и срабатывает код далее.
Или ShellExecute чем то отличается от WAPI_ShellExecute ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1617
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 04.07.21 19:39. Заголовок: Так что в переменной..


Так что в переменной cFileLog?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 4033
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 04.07.21 21:28. Заголовок: Возможно, при вызове..


Возможно, при вызове ShellExecute вызывается LostFocus для какого-то объекта, внутри LostFocus вызывается Destroy для какого-то объекта, и в этом Destroy уже идет вызов Upper с параметром nil

Дополню: при выполнении ShellExecute вызывается (почему - вопрос) Destroy для объекта класса TCnlData, у которого свойство ::cName равно nil.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6977
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 05.07.21 10:36. Заголовок: PSP пишет: Так что ..


PSP пишет:

 цитата:
Так что в переменной cFileLog?


Имя файла. Файл создаётся нормально.
В файле не особо много (20-30) строк.
В конце вот эта строка:
          cMsg := CRLF + "Исправьте ошибки и повторите печать заново !" + CRLF  
cMsg += "Всего ошибок = " + HB_NtoS( nErr )
STRFILE( cMsg + CRLF, cFileLog, .T. )

Она тоже есть.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6978
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 05.07.21 10:50. Заголовок: Поставил вместо MG_S..


Поставил вместо MG_Stop() обычный:
         MsgStop( cMsg , "Ошибки печати" )

Убрал своё окно ошибок.
Всё равно вылет после ShellExecute()
Вот такое окно:

Как исправить данную ситуацию ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7406
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.07.21 11:12. Заголовок: А вот тут точно Xnam..


А вот тут точно Xname должно быть ?
 
METHOD Get( xName ) INLINE iif( HB_ISCHAR( xName ), ::oWin:oName:Get( Upper( xName ) ), ;
::oWin:oHand:Get( xName ) )


Может Cname.......

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3781
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 05.07.21 11:35. Заголовок: Andrey пишет Как исп..


Andrey пишет
 цитата:
Как исправить данную ситуацию ?


Смотреть код, что дальше работает после ShellExecute().
Паша верно указал направление, после ShellExecute() попадаем на Destroy окна (TWndData), идет Destroy контролам (TCnlData) и в списке регистрации на окно контролов по имени и handle получаем nil (Get(xName))

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 4034
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 05.07.21 11:51. Заголовок: Только не после Shel..


Только не после ShellExecute(), а в процессе его выполнения вызывается (по неизвестной причине) Destroy какого-то контрола

из Destroy:

METHOD Destroy() INLINE ( ::Del(), ;
::oCargo := iif( HB_ISOBJECT( ::oCargo ), ::oCargo:Destroy(), Nil ), ;
::oEvent := iif( HB_ISOBJECT( ::oEvent ), ::oEvent:Destroy(), Nil ), ;
::oOnEventBlock := iif( HB_ISOBJECT( ::oOnEventBlock ), ::oOnEventBlock:Destroy(), Nil ), ;
::oUserKeys := iif( HB_ISOBJECT( ::oUserKeys ), ::oUserKeys:Destroy(), Nil ), ;
::oName := iif( HB_ISOBJECT( ::oName ), ::oName:Destroy(), Nil ), ;
::oHand := iif( HB_ISOBJECT( ::oHand ), ::oHand:Destroy(), Nil ), ;
::nParent := ::nIndex := ::cName := ::cType := ::cVar := ::cChr := NIL, ;
hmg_DelWindowObject( ::nHandle ), ::nHandle := Nil )

вызывается метод Del, и затем в неи (это строка 795 в последней версии 21.05 )

METHOD Del() INLINE ( iif( HB_ISOBJECT( ::oWin:oName ), ::oWin:oName:Del( Upper( ::cName ) ), ), ;
iif( HB_ISOBJECT( ::oWin:oHand ), ::oWin:oHand:Del( ::nHandle ), ) )

на Upper( ::cName ) программа сваливается

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6979
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 05.07.21 11:58. Заголовок: SergKis пишет: посл..


SergKis пишет:

 цитата:
после ShellExecute() попадаем на Destroy окна (TWndData), идет Destroy контролам (TCnlData) и в списке регистрации на окно контролов по имени и handle получаем nil (Get(xName))


Блин, не там искал... Всё мыслю старыми категориями.
На кнопке вызова печати имею такое событие:
         :Event(  2, {|  | Form_1Prn.Btn_02.Enabled := .F. ,; 
Darken2Open(hForm) ,; // Затенение на форме
Print_A81(.....) ,; // сама печать
lStaticOkPrintA81 := .T. ,; // кнопка печати нажата
Form_1Prn.Btn_02.Enabled := .T. ,;
Darken2Close(hForm) ,; // Затенение на форме
RefreshWin( hForm ) ,; // перерисовать объекты на форме
DoEvents(), This1Focus() } )

И где тут идёт Destroy ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6980
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 05.07.21 12:13. Заголовок: Pasha пишет: вызыва..


Pasha пишет:

 цитата:
вызывается метод Del, и затем в неи (это строка 795 в последней версии 21.05 )


Вот я про это и писал, почему так происходит ?
Как исправить эту ситуацию ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 4035
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 05.07.21 12:16. Заголовок: В том то и дело, что..


В том то и дело, что ошибка возникает не после ShellExecute(), а в процессе его выполнения, иначе ShellExecute() не было бы в логе ошибок
Ну а Destroy не надо вызывать напрямую. Он вызовется из деструктора объекта, а деструктор вызовется, если очистить переменную, содержащую объект, либо при завершении функции, в которой объект был создан, если этот объект не был присвоен другой переменной

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 4036
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 05.07.21 12:18. Заголовок: Andrey пишет: Как и..


Andrey пишет:

 цитата:
Как исправить эту ситуацию ?



Можно хоть двадцать раз повторять эту мантру, и через сообщения кидать лог ошибок
Надо разбираться в коде, а по одному логу ничего не сделать. Все, что можно вытащить из лога, я вытащил

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6983
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.07.21 01:55. Заголовок: Блин и в других мест..


Блин и в других местах стало так же вылетать при вызове ShellExecute()
Раньше не вылетало....
Вот ошибка пример:
Error BASE/1102  Неверный аргумент: UPPER 
Args:
[1] = U

Called from UPPER(0)
Called from (b)TCNLDATA(795) in module: h_objects.prg
Called from TCNLDATA:DEL(0)
Called from (b)TCNLDATA(834) in module: h_objects.prg
Called from TCNLDATA:DESTROY(0)
Called from TWNDDATA:__msgDestructor(736) in module: h_objects.prg
Called from SHELLEXECUTE(0)
Called from PASTERTFTOFIELD(373) in module: Source\util_Word.prg
Called from WORD_WRITE(87) in module: Source\util_Word.prg


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7409
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 12.07.21 09:07. Заголовок: Andrey пишет: Блин ..


Andrey пишет:

 цитата:
Блин и в других местах стало так же вылетать при вызове ShellExecute(


Видимо в новой версии MG косячок

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3782
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.07.21 09:52. Заголовок: Andrey Попробуй min..


Andrey
Попробуй minigui.lib, которую положил на ftp. В ней правка такая
 
CLASS TWndData
...
METHOD Del() INLINE ( iif( HB_ISOBJECT( ::oWin:oName ), ;
iif( HB_ISCHAR(::cName), ::oWin:oName:Del( Upper( ::cName ) ), ), ), ;
iif( HB_ISOBJECT( ::oWin:oHand ), ;
iif( HB_ISNUMERIC( ::nHandle ), ::oWin:oHand:Del( ::nHandle ), ), ) )

PS.
это проверка наличия контрола, т.к. похоже возникает ситуация destroy для контрола, которого нет или уже нет (повторный destroy)

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6985
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.07.21 11:57. Заголовок: SergKis пишет: Попр..


SergKis пишет:

 цитата:
Попробуй minigui.lib


Спасибо БОЛЬШОЕ !!!
Буду пробовать.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6989
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.07.21 21:07. Заголовок: SergKis пишет: В не..


SergKis пишет:

 цитата:
В ней правка такая


Потестировал ! Вроде не вылетает !!!

Надо бы добавить эту правку Григорию для новой версии МиниГуи !

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 1896
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.07.21 09:36. Заголовок: Andrey пишет: добав..


Andrey пишет:

 цитата:
добавить эту правку


Уже добавил
Благодарю за проверку

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 4037
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 14.07.21 08:13. Заголовок: Если такая ошибка в ..


Если такая ошибка в прежней версии возникает стабильно, то можно поймать первопричину, и попытаться ее устранить
В тестовой версии библиотеки добавить что-то вроде:

METHOD Del() INLINE ( iif( HB_ISOBJECT( ::oWin:oName ), ;
iif( HB_ISCHAR(::cName), ::oWin:oName:Del( Upper( ::cName ) ), writelog(::ClassName) ), ), ;
iif( HB_ISOBJECT( ::oWin:oHand ), ;
iif( HB_ISNUMERIC( ::nHandle ), ::oWin:oHand:Del( ::nHandle ), ), ) )

чтобы хоть понять, какой наследник TCnlData генерирует ошибку.
Для дальнейшей локализации можно в лог выдавать и другие параметры объекта
wrilelog - сделать функцию выводе текста в файл, или использовать аналог

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 167 , стр: 1 2 3 4 5 6 7 8 9 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 507
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет