Автор | Сообщение |
|
| постоянный участник
|
Пост N: 5855
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.05.18 21:33. Заголовок: Вылет из программы...
Всем привет ! Как можно в МиниГуи программе сделать вызов своих функций при аварийном завершении программы (т.е. при вылете) ? Т.е. хочу сделать сразу после появления MsgBox() вызов 2-3 функций и потом сделать DbCloseAll(). Как это реализовать ? Для чего это нужно, поясню: при входе в свою программу я пишу в базу кто и когда вошел в программу (логин пользователя). И при выходе из программы, стираю этого пользователя из базы. Если программа "вылетает", то юзер числится как работающий. Древнее наследие с клипера, хотел переделать, да так и осталось.
|
|
|
Ответов - 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
|
|
|
|
| |
Пост N: 7405
Зарегистрирован: 17.05.05
|
|
Отправлено: 04.07.21 19:26. Заголовок: Andrey пишет: Почем..
Andrey пишет: цитата: | Почему срабатывает вот этот код после ShellExecute() ? |
| ShellExecute ведь не приостанавливает работу программы , поэтому и срабатывает код далее. Или ShellExecute чем то отличается от WAPI_ShellExecute ?
|
|
|
|
| постоянный участник
|
Пост N: 1617
Зарегистрирован: 27.01.07
|
|
Отправлено: 04.07.21 19:39. Заголовок: Так что в переменной..
Так что в переменной cFileLog?
|
|
|
|
| Администратор
|
Пост N: 4033
Зарегистрирован: 23.05.05
|
|
Отправлено: 04.07.21 21:28. Заголовок: Возможно, при вызове..
Возможно, при вызове ShellExecute вызывается LostFocus для какого-то объекта, внутри LostFocus вызывается Destroy для какого-то объекта, и в этом Destroy уже идет вызов Upper с параметром nil Дополню: при выполнении ShellExecute вызывается (почему - вопрос) Destroy для объекта класса TCnlData, у которого свойство ::cName равно nil.
|
|
|
|
| постоянный участник
|
Пост 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. ) Она тоже есть.
|
|
|
|
| постоянный участник
|
Пост N: 6978
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.07.21 10:50. Заголовок: Поставил вместо MG_S..
Поставил вместо MG_Stop() обычный: MsgStop( cMsg , "Ошибки печати" ) Убрал своё окно ошибок. Всё равно вылет после ShellExecute() Вот такое окно: Как исправить данную ситуацию ?
|
|
|
|
| |
Пост 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.......
|
|
|
|
| постоянный участник
|
Пост N: 3781
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.07.21 11:35. Заголовок: Andrey пишет Как исп..
Andrey пишет цитата: | Как исправить данную ситуацию ? |
| Смотреть код, что дальше работает после ShellExecute(). Паша верно указал направление, после ShellExecute() попадаем на Destroy окна (TWndData), идет Destroy контролам (TCnlData) и в списке регистрации на окно контролов по имени и handle получаем nil (Get(xName))
|
|
|
|
| Администратор
|
Пост 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 ) программа сваливается
|
|
|
|
| постоянный участник
|
Пост 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 ?
|
|
|
|
| постоянный участник
|
Пост N: 6980
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.07.21 12:13. Заголовок: Pasha пишет: вызыва..
Pasha пишет: цитата: | вызывается метод Del, и затем в неи (это строка 795 в последней версии 21.05 ) |
| Вот я про это и писал, почему так происходит ? Как исправить эту ситуацию ?
|
|
|
|
|
| Администратор
|
Пост N: 4035
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.07.21 12:16. Заголовок: В том то и дело, что..
В том то и дело, что ошибка возникает не после ShellExecute(), а в процессе его выполнения, иначе ShellExecute() не было бы в логе ошибок Ну а Destroy не надо вызывать напрямую. Он вызовется из деструктора объекта, а деструктор вызовется, если очистить переменную, содержащую объект, либо при завершении функции, в которой объект был создан, если этот объект не был присвоен другой переменной
|
|
|
|
| Администратор
|
Пост N: 4036
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.07.21 12:18. Заголовок: Andrey пишет: Как и..
Andrey пишет: цитата: | Как исправить эту ситуацию ? |
| Можно хоть двадцать раз повторять эту мантру, и через сообщения кидать лог ошибок Надо разбираться в коде, а по одному логу ничего не сделать. Все, что можно вытащить из лога, я вытащил
|
|
|
|
| постоянный участник
|
Пост 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
|
|
|
|
| |
Пост N: 7409
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.07.21 09:07. Заголовок: Andrey пишет: Блин ..
Andrey пишет: цитата: | Блин и в других местах стало так же вылетать при вызове ShellExecute( |
| Видимо в новой версии MG косячок
|
|
|
|
| постоянный участник
|
Пост 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)
|
|
|
|
| постоянный участник
|
Пост N: 6985
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.07.21 11:57. Заголовок: SergKis пишет: Попр..
SergKis пишет: Спасибо БОЛЬШОЕ !!! Буду пробовать.
|
|
|
|
| постоянный участник
|
Пост N: 6989
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.07.21 21:07. Заголовок: SergKis пишет: В не..
SergKis пишет: Потестировал ! Вроде не вылетает !!! Надо бы добавить эту правку Григорию для новой версии МиниГуи !
|
|
|
|
| moderator
|
Пост N: 1896
Зарегистрирован: 11.02.10
|
|
Отправлено: 13.07.21 09:36. Заголовок: Andrey пишет: добав..
Andrey пишет: Уже добавил Благодарю за проверку
|
|
|
|
| Администратор
|
Пост 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 - сделать функцию выводе текста в файл, или использовать аналог
|
|
|
Ответов - 167
, стр:
1
2
3
4
5
6
7
8
9
All
[только новые]
|
|