Автор | Сообщение |
|
| постоянный участник
|
Пост N: 5855
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.05.18 21:33. Заголовок: Вылет из программы...
Всем привет ! Как можно в МиниГуи программе сделать вызов своих функций при аварийном завершении программы (т.е. при вылете) ? Т.е. хочу сделать сразу после появления MsgBox() вызов 2-3 функций и потом сделать DbCloseAll(). Как это реализовать ? Для чего это нужно, поясню: при входе в свою программу я пишу в базу кто и когда вошел в программу (логин пользователя). И при выходе из программы, стираю этого пользователя из базы. Если программа "вылетает", то юзер числится как работающий. Древнее наследие с клипера, хотел переделать, да так и осталось.
|
|
|
Ответов - 173
, стр:
1
2
3
4
5
6
7
8
9
All
[только новые]
|
|
|
| moderator
|
Пост N: 2107
Зарегистрирован: 11.02.10
|
|
Отправлено: 28.02.23 18:44. Заголовок: Andrey пишет: Прога..
Andrey пишет: цитата: | Прога вываливатся там где всегда работала. |
| Andrey Единственное, что приходит в голову, это - замена Харбора из поставки сборки 23.02 на Харбор из сборки 22.12 Надеюсь, это поможет решить проблему...
|
|
|
|
| постоянный участник
|
Пост N: 7310
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.02.23 18:51. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Единственное, что приходит в голову, это - замена Харбора из поставки сборки 23.02 на Харбор из сборки 22.12 |
| Спасибо ! Попробую.
|
|
|
|
| постоянный участник
|
Пост N: 7343
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.03.23 15:44. Заголовок: Блин, опять полная ..
Блин, опять полная У заказчика прога на МиниГуи стала очень медленно работать... Комп быстрый, у заказчика, система Win10. Таблицы строит быстро, а вот при открытие карточки (показ одной записи) - очень медленно 30-50 секунд. У меня открывается за 1-5 секунд. В чем может быть проблема ?
|
|
|
|
| постоянный участник
|
Пост N: 7347
Зарегистрирован: 12.09.06
|
|
Отправлено: 31.03.23 15:07. Заголовок: Установил новую верс..
Установил новую версию - 23.02 (Update 4) Примеры собираются и работают, а моя большая система собирается и сразу вылетает !!! Предыдущая версия - 23.01 (Release) работает без проблем. Вылет такой: Error BASE/1004 Message not found: TWNDDATA:EVENT Args: [1] = O TWNDDATA --------------------------------- Stack Trace --------------------------------- Called from __ERRRT_SBASE(0) Called from TWNDDATA:ERROR(0) Called from (b)HBOBJECT(0) Called from TWNDDATA:MSGNOTFOUND(0) Called from TWNDDATA:EVENT(0) Called from MAIN(205) in module: Source\main.prg Код простой: DEFINE WINDOW Form_Main ; AT 0,0 WIDTH 640 HEIGHT 480 ; TITLE cTitle ICON cIcon ; MAIN NOSHOW ; NOMAXIMIZE NOSIZE NOCAPTION ; ON INIT { || DoEvents(), _wPost(0) } ; ON INTERACTIVECLOSE { || IIF( lStaticErrorClose, MyExit(), Nil ) } ? PROCNL(), "внутри DEFINE WINDOW Form_Main" ..... WITH OBJECT This.Object :Event( 0, {| | _logfile(.t.,"----[ Событие 0 ]--- " + ProcNL() ) ,; MsgInfo("Запуск события 0"), MyInitForm() } ) // строка 205 ..... END WINDOW Form_Main.Timer_1.Enabled := .F. // ОТКЛЮЧИТЬ таймер ? PROCNL(), "_DefineSplashWindow()" _DefineSplashWindow( "Form_Splash",,,,, "SPLASH", 10, {|| IIF( !lStaticErrorClose, Addition_MainForms(), Nil ) } ) ACTIVATE WINDOW Form_Splash, Form_Main Return Nil И ПЕРЕСТАЛА работать _DefineSplashWindow(...), так как прога сразу идёт на ON INIT { || DoEvents(), _wPost(0) } Как это исправить ? Вот логи запуска программы: в старой версии прога запускается и _DefineSplashWindow() отрабатывает. Вызов из: MAIN(178) --> Source\main.prg внутри DEFINE WINDOW Form_Main Вызов из: MAIN(230) --> Source\main.prg _DefineSplashWindow() Вызов из: _DEFINESPLASHWINDOW(266) --> Source\main.prg Вызов из: _SPLASHDELAY(334) --> Source\main.prg и т.д. А в новой версии (23.02-4) вот так: Вызов из: MAIN(161) --> Source\main.prg M->aRunCheck= ARRAY[23] Вызов из: MAIN(167) --> Source\main.prg .F. Вызов из: MAIN(178) --> Source\main.prg внутри DEFINE WINDOW Form_Main ====================> ОШИБКА при завершении программы ! MyExitError() <===== Error BASE/1004 Message not found: TWNDDATA:EVENT Args: [1] = O TWNDDATA Called from __ERRRT_SBASE(0) Called from TWNDDATA:ERROR(0) Called from (b)HBOBJECT(0) Called from TWNDDATA:MSGNOTFOUND(0) Called from TWNDDATA:EVENT(0) Called from MAIN(206) in module: Source\main.prg Не доходит до функции _DefineSplashWindow(), просто вылетает с ошибкой !
|
|
|
|
| постоянный участник
|
Пост N: 7348
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.04.23 07:43. Заголовок: Беру в папку C:\..
Беру в папку C:\MiniGUI (с версией 23.02-4) записываю папку Harbour от версии 23.01 Проект собирается и работает. Блин и что за фигню сделали в этой версии Харбора ? 2 дня геморроя и проблема частично решена. А как быть в дальнейшем ?
|
|
|
|
| moderator
|
Пост N: 2120
Зарегистрирован: 11.02.10
|
|
Отправлено: 01.04.23 13:57. Заголовок: Andrey пишет: что з..
Andrey пишет: цитата: | что за фигню сделали в этой версии Харбора ? |
| Из списка изменений Харбора следует, что были сделаны важные изменения и оптимизации в ядре виртуальной машины и была затронута функция AClone(). Также был расширен обработчик ошибок xhb_ErrorNew в библиотеке xHB и почищен модуль symbol range checking для классов Харбора. Что именно так повлияло на твою программу, остается только догадываться
|
|
|
|
| постоянный участник
|
Пост N: 7349
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.04.23 15:28. Заголовок: Спасибо БОЛЬШОЕ ! Я ..
Спасибо БОЛЬШОЕ ! Я забыл уточнить, что использую BCC 5.5 ! Может из-за этого облом происходит. Не могу перейти на BCC 5.8 - иконки на менюшках не те отображаются. Уже и от ошибок всех избавился, всё равно иконки не те отображаются, которые должны быть.
|
|
|
|
| постоянный участник
|
Пост N: 7368
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.04.23 13:03. Заголовок: Рано радовался. На н..
Рано радовался. На новой версии 23.04 (Release) прога при старте "вылетает"... Выдаёт такую ошибку: Error BASE/1004 Message not found: TWNDDATA:EVENT Args: [1] = O TWNDDATA Called from __ERRRT_SBASE(0) Called from TWNDDATA:ERROR(0) Called from (b)HBOBJECT(0) Called from TWNDDATA:MSGNOTFOUND(0) Called from TWNDDATA:EVENT(0) Called from MAIN(204) in module: Source\main.prg Вот код программы: SET EVENTS FUNCTION TO MyEventsHandler // проверка версии программы DEFINE WINDOW Form_Main ; MAIN NOSHOW ; .... // общее событие для вызова из других программ :Event(111, {|ow,xPar,cdata| ; cdata := hb_defaultValue(cdata, "") ,; _logfile(.t.,"----[ Событие 111 ]--- " + ProcNL() ) ,; _logfile(.t.," ow=",ow,"xPar=",xPar,"cdata=",cdata ) ,; _logfile(.t.," ow:Name",ow:Name,"ow:Handle",ow:Handle ) ,; OnWmCopyData(cData) } ) // строка 204 .... // Обработчик событий программы FUNCTION MyEventsHandler( hHwnd, nMsg, wParam, lParam ) LOCAL cData, nDataID IF nMsg == WM_COPYDATA cData := GetMessageData( lParam, @nDataID ) DO EVENTS // общее событие для вызова из других программ с формы Form_Main _wPost(111, "Form_Main", cData) RETURN 1 // выполненно nMsg == WM_COPYDATA, обрабатывать nMsg больше не надо ENDIF RETURN Events( hHwnd, nMsg, wParam, lParam) И чего в новой версии исправлено ?
|
|
|
|
| постоянный участник
|
Пост N: 4271
Зарегистрирован: 17.02.12
|
|
Отправлено: 29.04.23 17:55. Заголовок: Andrey Попробуй так..
Andrey Попробуй так (возможно WM_COPYDATA пришло когда объекта окна не было) FUNCTION MyEventsHandler( hHwnd, nMsg, wParam, lParam ) LOCAL cData, nDataID, oWnd IF nMsg == WM_COPYDATA cData := GetMessageData( lParam, @nDataID ) DO EVENTS // общее событие для вызова из других программ с формы Form_Main oWnd := _WindowObj( "Form_Main" ) IF HB_ISOBJECT(oWnd) ; _wPost(111, oWnd, cData) ENDIF RETURN 1 // выполненно nMsg == WM_COPYDATA, обрабатывать nMsg больше не надо ENDIF RETURN Events( hHwnd, nMsg, wParam, lParam)
|
|
|
|
| постоянный участник
|
Пост N: 7369
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.04.23 19:04. Заголовок: Не помогает... Тако..
Не помогает... Такой же вылет !!!
|
|
|
|
| постоянный участник
|
Пост N: 7370
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.04.23 00:20. Заголовок: Если ставлю коммента..
Если ставлю комментарий на //SET EVENTS FUNCTION TO MyEventsHandler // проверка версии программы То опять "вылет" проги и другая ошибка: Error BASE/1001 Неизвестная функция: EVENTS Args: [1] = N 723514 [2] = N 129 [3] = N 0 [4] = N 1701896 --------------------------------- Stack Trace --------------------------------- Called from EVENTS(0) Called from INITWINDOW(0) Called from _DEFINEWINDOW(0) Called from MAIN(164) in module: Source\main.prg код вот такой: DEFINE WINDOW Form_Main ; AT 0,0 WIDTH 640 HEIGHT 480 ; TITLE cTitle ICON cIcon ; MAIN NOSHOW ; NOMAXIMIZE NOSIZE NOCAPTION ; ON INIT { || IniGetPosWindow(,,"MAIN"), MyInitForm() } ; ON INTERACTIVECLOSE { || IIF( lStaticErrorClose, MyExit(), Nil ) } // строка 164 И что ему не нравиться в этом коде ? P.S. Замена на Харбор - Version: 3.2.0dev (r2301231146) убирает эту проблему...
|
|
|
|
|
| постоянный участник
|
Пост N: 7380
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.05.23 18:51. Заголовок: SergKis пишет: Надо..
SergKis пишет: цитата: | Надо исп. в модальных окнах _HMG_InplaceParentHandle := hWnd // hWnd - окна родителя ... // после action модального окна _HMG_InplaceParentHandle := 0 иначе у modal окна родитель будет main window (default и вероятно фокус убегает на него) |
| Как быть если вызывается подряд 3 модальных окна ? _HMG_InplaceParentHandle := 0 поставим, а другие модальные окна уже не смогут быть привязанными к родительскому окну, будут привязаны к main window Раньше этим вообще не заморачивался, а в новых версиях МиниГуи приходится самому отслеживать, модальное окно скрывается под WINDOWTYPE STANDARD окном. Можно как то привязывать все модальные окна которые вызываются из WINDOWTYPE STANDARD на это окно ?
|
|
|
|
| постоянный участник
|
Пост N: 4274
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.05.23 19:03. Заголовок: Andrey пишет Раньше ..
Andrey пишет цитата: | Раньше этим вообще не заморачивался, а в новых версиях МиниГуи приходится самому отслеживать |
| Не придумывай, все окна в Гуи имеют родителя, начиная от DeskTop и до контролов (это тоже окна с родителем окном, на котором созданы) и от версии МиниГуи это не зависит. цитата: | Как быть если вызывается подряд 3 модальных окна ? |
| Всем окнам присваивай handle окна родителя.
|
|
|
|
| постоянный участник
|
Пост N: 7381
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.05.23 19:33. Заголовок: SergKis пишет: Всем..
SergKis пишет: цитата: | Всем окнам присваивай handle окна родителя. |
| Т.е. после создания окна делаю: DEFINE WINDOW &cFormName At 0, 0 ; WINDOWTYPE STANDARD ; .... _HMG_InplaceParentHandle := ThisWindow.Handle ... END WINDOW .... _HMG_InplaceParentHandle := 0 И больше не о чём не забочусь ?
|
|
|
|
| постоянный участник
|
Пост N: 4275
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.05.23 19:54. Заголовок: Andrey пишет И больш..
Andrey пишет цитата: | И больше не о чём не забочусь ? |
| Если так сделаешь для трех modal окон и вызывать их будешь с окна STANDARD по одному, то да. А если modal окна вызываешь друг за другом последовательно, то нет. Надо перед каждым модальным окном делать FUNCTION Standard1() ... DEFINE WINDOW &cFormName ... STANDARD ... ... BUTTON ...ACTION Modal1() ... RETURN Nil FUNCTION Modal1() ... _HMG_InplaceParentHandle := ThisWindow.Handle ... DEFINE WINDOW &cFormName MODAL ... ... BUTTON ...ACTION Modal2() ... RETURN Nil FUNCTION Modal2() ... _HMG_InplaceParentHandle := ThisWindow.Handle ... DEFINE WINDOW &cFormName MODAL ... ... BUTTON ...ACTION Modal3() ... RETURN Nil FUNCTION Modal3() ... _HMG_InplaceParentHandle := ThisWindow.Handle ... DEFINE WINDOW &cFormName MODAL ... ... BUTTON ...ACTION ... ... RETURN Nil т.к. вызовы ф-ий происходят в событиях окна или контролов, то _HMG_InplaceParentHandle := ThisWindow.Handle всегда будет handle окна на котором нажали кнопку, например, для вызова след. окна
|
|
|
|
| постоянный участник
|
Пост N: 7382
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.05.23 21:56. Заголовок: Понял. Спасибо ! :s..
Понял. Спасибо !
|
|
|
|
| постоянный участник
|
Пост N: 7383
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.05.23 17:04. Заголовок: Бьюсь уже какой меся..
Бьюсь уже какой месяц с сервером терминалов на Windows Server 2008 R2 Вылетает прога в одном месте постоянно через 2-3 раза по выбору из справочника. Причём прогу смог протестировать на другом точно таком же сервере. Там прога работает без вылетов. Только сейчас дошло до меня, где не работает прога у пользователя урезанный доступ, а где работает полный доступ. Как это может влиять на работу программы МиниГуи ? Но с другой стороны вообще не понятка, одна и таже функция вызывает справочник города и улиц. Города выбираются всегда, а как улицу выбрал, прога вешается, окно закрылось и висит, без ошибки. Если потом нажать любую кнопку на другой форме, то тогда вылет проги. Но почему прога висит ? Форма не закрылась ? Что ещё проге нужно ?
|
|
|
|
| постоянный участник
|
Пост N: 1641
Зарегистрирован: 27.01.07
|
|
Отправлено: 27.05.23 21:59. Заголовок: Andrey пишет: Тольк..
Andrey пишет: цитата: | Только сейчас дошло до меня, где не работает прога у пользователя урезанный доступ, а где работает полный доступ. |
| Ну так дай нужные права или админа попроси.
|
|
|
|
| постоянный участник
|
Пост N: 7384
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.05.23 15:27. Заголовок: PSP пишет: Ну так д..
PSP пишет: цитата: | Ну так дай нужные права или админа попроси. |
| Админ дал права, все равно виснет. Окно закрывается и прога висит.... Почему окно закрылось и управление дальше в программу не даёт ? Делаю вывод в лог вот так: DEFINE WINDOW Form_SelDim .... ON RELEASE {|| _logfile(.t., SPACE(8)+"+-o-+ :Event(99)"+ProcNL(),"ON RELEASE =", 1, "Завершена работа формы=",cFormName ) ,; _logfile(.t., SPACE(8)+"+-o-+ Form:", HMG_GetForms(), HB_ValToExp(HMG_GetForms()) ), DoEvents() } Вывод в лог файл есть, а дальше прога "ВИСИТ"... +-o-+ :Event(99)Вызов из: (b)FORM_SELDIM2(80) --> Sel_Dim_Hmg2frm.prg ON RELEASE=1 Завершена работа формы=Form_SelDim +-o-+ Form: ARRAY[6] { ...., "Form_SeekAdr", "Form_SelDim"} А окно "Form_SelDim" и не закрылось !!! P.S. Ещё заметил такую странность, если выбор осуществлять мышкой то окно НЕ ВЕШАЕТСЯ, а если через ENTER, то окно ПОВЕСИТЬСЯ.
|
|
|
|
| moderator
|
Пост N: 2134
Зарегистрирован: 11.02.10
|
|
Отправлено: 29.05.23 12:21. Заголовок: Andrey пишет: окно ..
Andrey пишет: цитата: | окно "Form_SelDim" и не закрылось |
| Значит, надо пробовать закрывать его в цикле, например DO WHILE IsWindowDefined(Form_SelDim) Form_SelDim.Release ENDDO Andrey пишет: цитата: | если через ENTER, то окно ПОВЕСИТЬСЯ |
| Можно попробовать временно переназначить действие ENTER на другую клавишу, например :UserKeys(VK_RETURN, {|ob| _wPost( 2, ob:cParentWnd), .F. }) заменить на :UserKeys(VK_F10, {|ob| _wPost( 2, ob:cParentWnd), .F. }) также можно попробовать использовать функцию _wSend() вместо _wPost(). Понятно, что это только предложения для пробы
|
|
|
Ответов - 173
, стр:
1
2
3
4
5
6
7
8
9
All
[только новые]
|
|