Форум » GUI » Вылет из программы... » Ответить

Вылет из программы...

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

Ответов - 173, стр: 1 2 3 4 5 6 7 8 9 All

Haz: Andrey пишет: Не понял, это как ? может в личку перейдете ? От обсуждения mg как то незаметно перешли в help desk Андрея.

SergKis: Andrey пишет Не понял, это как ? :Event(VK_RETURN, {|ow| /*1*/ my_Modal(ow, 0), /*2*/ my_Modal(ow, 1)}) ...[pre2] FUNC my_Modal(oWnd, nVxod) ... 0. ON INIT {|| iif(nVxod > 0, OnInitFormTvr(), ( This.Minimize, _wPost(99) ) ) } 1. ON INIT {|| This.Minimize, DoEvents(), _wPost( iif(nVxod > 0, 0, 99) } ... :Event( 0, {|| This.Restore, DoEvents(), OnInitFormTvr() }) :Event(99, {|ow| ow:Release() }) [/pre2]

SergKis: Haz пишет может в личку перейдете ? От обсуждения mg как то незаметно перешли в help desk Андрея. Перейдем, но ситуация взаимодействия фокуса окон main, несколько standard, к ним по нескольку modal никуда не денется, т.к. один раз вход со standard (бывает и всегда) на modal и выход из modal, окно standard прячется под main (к desktopу прижимается), а запуск с modal др. modal и возврат с него, приводит к убеганию фокуса куда то типа на main, а сверху модал 1 и вернуть фокус на это модал не получается (_HMG_InplaceParent задан). там еще есть ситуции, сверху standard modal окно 1 (с него по Enter можем входить в modal 2 и на нем по Enter можем вызывать окно AlertInfo(), тоже модал), часть окна standard видна из под модал 1. Любой клик на любом месте standard окна активирует несколько нажатий Enter на modal 1 окне и мы попадаем на окно 2 модал и с него на AlertInfo(). Эта ситуация видна в примере, который я выкладывал выше. Причем это происходит один раз при первом вызове со standard окна modal 1. Потом со standard -> modal 1 -> ... все работает ok!. Выходим из окна standard на main и снова нажимаем кнопку -> standard -> modal 1, кликаем на standard и вся сбойная ситуация повторяется 1 раз. На всех окнах standard и модал таблицы тсб на customer.dbf


Haz: SergKis пишет: Перейдем, но ситуация взаимодействия фокуса окон main, несколько standard, к ним по нескольку modal никуда не денется, Сергей, без обид. Решение уже есть ? Молодцы ,что поймали косяк , но это частная ситуация. Если еще 2 человека напишут сюда о такой же проблеме у них, готов публично перед всеми извиниться. Возможно эта проблема связана со стилем программирования и использования функционала МГ, но это не глобальная проблема. За 20 лет моего опыта использования МГ , все фокусы с фокусами решались стандартными средствами МГ.

Andrey: Есть у заказчика Windows 11, прога на МиниГуи за день 8 раз упала. Какие то непонятные ошибки: [pre2]Time from start: 0 days 2 hours 35 mins 13 secs Error BASE/0 MiniGUI Err.: _GETCLIENTRECT Args: [1] = U --------------------------------- Stack Trace --------------------------------- Called from _GETCLIENTRECT(0) Called from ERRORWINDOWS(798) in module: Source\ErrorSys3.prg Called from SHOWERROR(253) in module: Source\ErrorSys3.prg В коде вот это стоит: nW := This.ClientWidth // строка 798 nH := This.ClientHeight Time from start: 0 days 1 hours 23 mins 47 secs Error BASE/0 MiniGUI Err.: _GETCLIENTRECT Args: [1] = U --------------------------------- Stack Trace --------------------------------- Called from _GETCLIENTRECT(0) Called from ASK3MENU(3427) in module: Source\form_Abonent.prg Called from ASK_TARIF(55) in module: Source\form_Abonent.prg В коде вот это стоит: nMaxWidth := This.ClientWidth // строка 3427 nMaxHeight := This.ClientHeight Time from start: 0 days 0 hours 34 mins 59 secs Error BASE/1093 Неверный аргумент: MAX Args: [1] = U [2] = N 34.00 --------------------------------- Stack Trace --------------------------------- Called from MAX(0) Called from _SETGETBOXCARET(0) Called from OGETEVENTS(0) Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(0) Called from SHOW_CARD(444) in module: Source\Tbrw_fCard.prg ACTIVATE WINDOW Form_Card // строка 444 Time from start: 0 days 2 hours 27 mins 42 secs Error BASE/5001 MiniGUI Error: _SETFONT Args: [1] = N 0 [2] = C Tahoma [3] = N 20 [4] = L F [5] = L F [6] = L F [7] = L F --------------------------------- Stack Trace --------------------------------- Called from _SETFONT(0) Called from _DEFINEGETBOX(0) Called from MYCARDFIELDGETBOX(1787) in module: Source\Tbrw_fCard.prg Called from SHOWPAGECARD(1288) in module: Source\Tbrw_fCard.prg [/pre2] Причём видно же, что прога поработает и только спустя какое то время падает. ПОЧЕМУ ? На Win10 нет таких ошибок, там редко падает. Что можно сделать ?

Andrey: У моего юзера Win10, нормальный комп. Моя прога постоянно падает или виснет в течении дня, раза 4-8 за день. Бьюсь с этой проблемой порядка 2-х лет. После долгих проб и помощи Сергея выяснилось... НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ в большой проге таймера на главной форме !!! После нескольких срабатываний таймера портят окружение и работающие функции начинают виснуть или вылетать !!! Вчера ради эксперимента отключил в своей проге таймера. Прога за день ни разу НЕ ПОВИСЛА и НЕ ВЫЛЕТЕЛА !!! Что-то с таймерами в МиниГуи не то....

Haz: Andrey пишет: НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ в большой проге таймера на главной форме !!! Ну не знаю, один проект пять лет живет с тремя таймерами на главной форме, причем один ежесекундно работает. Ничего не виснет. Правда все процедуры таймера в потоках идут. Окружение не пользую, все контролы стараюсь задавать явно. Скорее проблема в окружении и его использовании, а таймер просто обозначил проблему PS. С днём рождения тебя 👍

Andrey: Haz пишет: Правда все процедуры таймера в потоках идут Вот это и отличается ! Так и нужно делать, а не как я. Haz пишет: С днём рождения тебя 👍 Спасибо БОЛЬШОЕ !

Andrey: Как избавиться от ошибок в МиниГуи ? Можно ли поставить доп. проверки ? Вот такая ошибка появляется часто, за 5 дней была 4 раза. Комп новый Core-i5, Win10 64bit [pre2]Time from start: 0 days 0 hours 34 mins 59 secs Error BASE/1093 Неверный аргумент: MAX Args: [1] = U [2] = N 34.00 --------------------------------- Stack Trace --------------------------------- Called from MAX(0) Called from _SETGETBOXCARET(0) Called from OGETEVENTS(0) Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(0) Called from SHOW_CARD(444) in module: Source\Tbrw_fCard.prg [/pre2] Сергей мне написал что это ошибка в коде: [pre2]Это где то тут (в целом работа с GETBOX {каретка\вид курсора} идет в обработчике: "Called from OGETEVENTS(0)") *-----------------------------------------------------------------------------* STATIC PROCEDURE _SetGetBoxCaret( hWnd ) *-----------------------------------------------------------------------------* LOCAL hDC LOCAL aMetr LOCAL nEnd LOCAL cChar LOCAL nWidth LOCAL nHeight HideCaret( hWnd ) DestroyCaret() IF ! IsWindowHasStyle( hWnd, ES_READONLY ) nEnd := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) cChar := HMG_EditControlGetChar( hWnd, nEnd ) hDC := GetDC( hWnd ) aMetr := GetTextMetric( hDC ) ^^^^^ - тут: aMetr[ 1 ] == "U" or aMetr[ 2 ] == "U" возможно hDC не выделился, может ресурсов не хватило, но ХЗ что на самом деле ReleaseDC( hWnd, hDC ) nHeight := aMetr[ 1 ] nHeight := Max( nHeight, .85 * GetWindowHeight( hWnd ) ) ^^^^^^^ - U nWidth := aMetr[ 2 ] nWidth := Max( nWidth, .75 * HMG_GetCharWidth( hWnd, cChar ) ) ^^^^^^^ - U #define SM_CXBORDER 5 CreateCaret( hWnd, 0, iif( lInsert, GetSystemMetrics( SM_CXBORDER ), Int( nWidth ) ), nHeight ) ShowCaret( hWnd ) ENDIF RETURN[/pre2] Григорий, сделай что то, а то юзер прав, а я не знаю что делать....

Dima: Andrey пишет: Григорий, сделай что то, а то юзер прав, а я не знаю что делать.... Так он же писал После 18-ти лет активной разработки этот проект подошел для меня к концу по понятным причинам

PSP: Andrey пишет: Григорий, сделай что то "А что, так можно было?"))) Ты очень много лет занимался копипастом. Пора взяться за ум)) Без обид.

Haz: Andrey пишет: Григорий, сделай что то, а то Григорий и так слишком долго и много делал для этого проекта. Дальше сам или ищи другого спонсора. Ничего невозможного нет, просто нужно начать делать своими руками и думать своей головой

gfilatov2002: SergKis пишет: Это где то тут (в целом работа с GETBOX {каретка\вид курсора} идет в обработчике: "Called from OGETEVENTS(0)") *-----------------------------------------------------------------------------* STATIC PROCEDURE _SetGetBoxCaret( hWnd ) *-----------------------------------------------------------------------------* LOCAL hDC LOCAL aMetr LOCAL nEnd LOCAL cChar LOCAL nWidth LOCAL nHeight HideCaret( hWnd ) DestroyCaret() IF ! IsWindowHasStyle( hWnd, ES_READONLY ) nEnd := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) cChar := HMG_EditControlGetChar( hWnd, nEnd ) hDC := GetDC( hWnd ) aMetr := GetTextMetric( hDC ) ^^^^^ - тут: aMetr[ 1 ] == "U" or aMetr[ 2 ] == "U" возможно hDC не выделился, может ресурсов не хватило, но ХЗ что на самом деле ReleaseDC( hWnd, hDC ) nHeight := aMetr[ 1 ] nHeight := Max( nHeight, .85 * GetWindowHeight( hWnd ) ) ^^^^^^^ - U nWidth := aMetr[ 2 ] nWidth := Max( nWidth, .75 * HMG_GetCharWidth( hWnd, cChar ) ) ^^^^^^^ - U #define SM_CXBORDER 5 CreateCaret( hWnd, 0, iif( lInsert, GetSystemMetrics( SM_CXBORDER ), Int( nWidth ) ), nHeight ) ShowCaret( hWnd ) ENDIF RETURN Предлагаю для проверки исправленную редакцию этой функции: [pre2] *-----------------------------------------------------------------------------* STATIC PROCEDURE _SetGetBoxCaret( hWnd ) *-----------------------------------------------------------------------------* LOCAL hDC LOCAL aMetr LOCAL nEnd LOCAL cChar LOCAL nDefHeight LOCAL nDefWidth LOCAL nHeight LOCAL nWidth HideCaret( hWnd ) DestroyCaret() IF ! IsWindowHasStyle( hWnd, ES_READONLY ) nEnd := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) cChar := HMG_EditControlGetChar( hWnd, nEnd ) nDefHeight := .85 * GetWindowHeight( hWnd ) nDefWidth := .75 * HMG_GetCharWidth( hWnd, cChar ) hDC := GetDC( hWnd ) aMetr := GetTextMetric( hDC ) ReleaseDC( hWnd, hDC ) IF aMetr[ 1 ] != NIL nHeight := aMetr[ 1 ] nHeight := Max( nHeight, nDefHeight ) ELSE nHeight := nDefHeight ENDIF IF aMetr[ 2 ] != NIL nWidth := aMetr[ 2 ] nWidth := Max( nWidth, nDefWidth ) ELSE nWidth := nDefWidth ENDIF #define SM_CXBORDER 5 CreateCaret( hWnd, 0, iif( lInsert, GetSystemMetrics( SM_CXBORDER ), Int( nWidth ) ), nHeight ) ShowCaret( hWnd ) ENDIF RETURN [/pre2] Ваши комментарии приветствуются

Andrey: Григорий ! Спасибо ОГРОМНОЕ ! А код библиотеки подправишь, чтобы было одинаково у всех ? P.S. такая ошибка пошла примерно после февральской версии, до этого такой ошибки не было, я смотрел лог ошибок у своих пользователей. Я до этого собирал январской версией МиниГуи.

SergKis: gfilatov2002 пишет Предлагаю для проверки исправленную редакцию этой функции Так возможно использовать, если мы уверены, что hWnd правильный, а если нет, то мы будем в той же ситуации, т.е. hDC будет NULL. В OGETEVENTS() кроме i := AScan ( _HMG_aControlHandles, hWnd ) и IF i <= 0 ; RETURN( 0 ) по hWnd нет ничего. Может использовать IsWindowHandle(hWnd) ? При этом причину не правильного значения hWnd вряд ли поймем.

gfilatov2002: SergKis пишет: Может использовать IsWindowHandle(hWnd) ? Добавил такую проверку Благодарю за подсказку

Andrey: gfilatov2002 пишет: Добавил такую проверку Григорий, а как получить исправления по этой ошибке ? У юзера сегодня за 4 часа, прога 4 раза падала... [pre2]Вот с такой ошибкой: Time from start: 0 days 0 hours 46 mins 21 secs Error BASE/1093 Неверный аргумент: MAX Args: [1] = U [2] = N 34.00 --------------------------------- Stack Trace --------------------------------- Called from MAX(0) Called from _SETGETBOXCARET(0) Called from OGETEVENTS(0) Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(0) Called from SHOW_CARD(446) in module: Source\Tbrw_fCard.prg [/pre2] Комп хороший, Win10, спящего режима нет, в инет не входят, работают только в моей проге. Прога собрана на MiniGUI Extended Edition 23.07.0 (32-bit) ANSI

gfilatov2002: Andrey пишет: Григорий, а как получить исправления по этой ошибке ? На следующей неделе выложу обновление

Andrey: Нашёл причину вылета программы с таким сообщением: [pre2]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(181) in module: Source\main.prg[/pre2] Использую у себя в проекте С-код для ключа HASP, написанный давно ещё в 2013 году и который работал без проблем всё это время. Как убираю эти функции, проект нормально запускается ! Без этих функций никак... Пошёл по другому пути. В МиниГуи 29.09.2 записываю Harbour с версии МиниГуи 23.01 [pre2]Built on: Jan 23 2023 Last ChangeLog entry: 2023-01-23 12:46 UTC+0100 Przemyslaw Czerpak ChangeLog ID: a6a86c100291b3ed33a2a0a680f0e5a17d627ce0[/pre2] Мой проект так же успешно запускается !!! Значит беда в самом Harbour... Вопрос к знатокам Harbour, чем грозит использование старой версии Harbour в новом МиниГуи ? Т.е. в версии МиниГуи 29.09.2 буду использовать Harbour с версии МиниГуи 23.01 P.S. Но проблема подвисание окон, т.е. в окне НЕЛЬЗЯ нажать любую кнопку - осталась. Если делаешь выход из окна по ESC (хорошо хоть это есть), то при повторном вызове окна зависание пропадает. Это происходит не везде, в моей программе 4 таких окна.

Andrey: Всех с наступающим Новым Годом ! Моя большая прога стабильно работает на версии МиниГуи 29.09.2 + Harbour с версии МиниГуи 23.01 Но иногда падает вот с такой ошибкой у некоторых юзеров. [pre2]Date: 30.11.2023 Time: 16:17:13 User: SERVER/User2/Оксана DbInfo: Alias - ZAIVKA, Ord - TEMP2INDEX, Recno - 9878/9878 Time from start: 0 days 6 hours 43 mins 0 secs Error BASE/5001 MiniGUI Error: _SETFONT Args: [1] = N 0 [2] = C Tahoma [3] = N 20 [4] = L F [5] = L F [6] = L F [7] = L F --------------------------------- Stack Trace --------------------------------- Called from _SETFONT(0) Called from _DEFINEGETBOX(0) Called from ADDTABNEWPAGE1(396) in module: Source\form_Zaivka3.prg Called from FORM_ZAIVDEFECT(111) in module: Source\form_Zaivka3.prg Called from ZAIVDEFECT(37) in module: Source\form_Zaivka3.prg Called from (b)HB_MACROBLOCK(0) Called from SHOWPAGECARD(1205) in module: Source\Tbrw_fCard.prg Date: 26.12.2023 Time: 16:36:31 User: SERVER/User2/Оксана DbInfo: Alias - ZAIVKA, Ord - TEMP2INDEX, Recno - 10114/10114 Time from start: 0 days 7 hours 34 mins 6 secs Error BASE/5001 MiniGUI Error: _SETFONT Args: [1] = N 0 [2] = C Tahoma [3] = N 20 [4] = L F [5] = L F [6] = L F [7] = L F --------------------------------- Stack Trace --------------------------------- Called from _SETFONT(0) Called from _DEFINEGETBOX(0) Called from ADDTABNEWPAGE1(396) in module: Source\form_Zaivka3.prg Called from FORM_ZAIVDEFECT(111) in module: Source\form_Zaivka3.prg Called from ZAIVDEFECT(37) in module: Source\form_Zaivka3.prg Called from (b)HB_MACROBLOCK(0) [/pre2] Мой код вообще не причём: [pre2] @ nRow1, nCol GETBOX Text_6x2 WIDTH nWTxt HEIGHT nFontSize*2 VALUE M->oPubDefect:c6x2 ; FONTCOLOR BLACK BACKCOLOR WHITE SIZE nFontSize PICTURE cFormat ; ON GOTFOCUS {|| ReViewGBox() } ; ON CHANGE {|| myEditGBox(), M->oPubDefect:c6x2 := GetProperty(ThisWindow.Name, This.Name, "Value") } // строка 396 AADD( aObj, { 'Text_6x2', "c6x2" } ) _AddTabControl ( cTabObj, 'Text_6x2', cForm , nPage , nRow, nCol )[/pre2] Можно как то избавиться от такой ошибки ?



полная версия страницы