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

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

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

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

SergKis: gfilatov2002 Андрей присылал мне кино с зависанием. Думаю виснет на прорисовке тсб, т.к. используется установка :FilterFTS() и на короткий просмотр (строк < :nRowCount()) прорисовка тсб и подсчет :nLen успевает сработать, если строк в тсб > :nRowCount(), то на тсб клинит, т.к. кнопка вызова справочника остается Disable. Набор символов поиска происходит в :HandleEvents() -> : KeyDown() -> :bUserKeys символы набираются в Static переменную и Label отображает. Еще у него исп. :bEvents с отображением на каждом нажатии[pre2] STATIC FUNCTION MyEventBrowse(oBrw, nMsg) // "RUS/LAT" LOCAL cForm := oBrw:cParentWnd, cAlias := oBrw:cAlias IF nMsg != WM_PAINT .and. _IsControlDefined( "Label_KB", cForm ) SetProperty(cForm, "Label_KB", "Value", '('+KB_LANG()+')' ) ENDIF RETURN 0[/pre2] Думаю здесь из за разницы скоростей набора символов и прорисовки тсб получается подвис. Ранее :FilterFTS() делался тут же в :bUserKeys, сейчас ушло на _wPost() и Андрей написал, что стало лучше Сейчас 6 раз выбрал мышкой, всё отлично. 5 раз выбрал через ENTER и повис. Ну хоть больше стало выбирать... Предложение перевести ввод данных для фильтра в GETBOX\TEXTBOX он пока отвергает. PS. Это происходит у него только на PC с WinServer 2008

Andrey: SergKis пишет: Предложение перевести ввод данных для фильтра в GETBOX\TEXTBOX он пока отвергает. Я убрал совсем TEXTBOX и поставил только LABEL, чтобы проверить. Т.е. только отображение что набрали на клавиатуре, убрал одну причину СОВСЕМ для проверки. Или я что-то не понимаю с этим GETBOX\TEXTBOX, мне он не нужен пока ? После того как переделал на LABEL всё равно ВИСНЕТ прога по клавише ENTER, на 5-6-7 раз, как повезёт

Andrey: Фигня получается... Вылет был из-за потери окна ! 1,5 года была плавающая ошибка, то есть, то нет. Вылетало только на одном сервере-терминалов. Сейчас с переходом на новый BCC 7.30 ошибка получилась постоянной и всегда ! Наверное более жесткий контроль установлен. В принципе это хорошо. И понятней стала причина ошибки - потеря MODAL окна, т.е. вызываем несколько MODAL окон, и при возврате окно теряется, улетает под главную форму. Вот и вся ошибка была. Причём, чем больше весит ехе-ник, тем больше вероятность возникновения такой ошибки !!! Сергей дал функцию для предотвращения таких ситуаций, выкладываю сюда, может ещё кому понадобиться. Событие на кнопку. [pre2] (This.Object):Event(11,{|obtn,ky,abtn| // объект,event,параметр получаем Local ow, cw, cn, lbtn, lwnd, aRet, nRet, cRet, aForm, hWnd Local nButton := abtn[1] // nButton Local cButton := aBtn[2] // This.Name lbtn := obtn:IsControl // переменная контрол\окно .T.\.F. lwnd := obtn:IsWindow // переменная окно\контрол .T.\.F. ow := obtn:Window // если lbtn == .T. окно берем так cw := ow:Name // аналог ThisWindow.Name cn := obtn:Name // аналог This.Name //SetProperty(cw, "Topmost", .T.) ; DO EVENTS // 18.06.23 //SetProperty(cw,cn, "Enabled", .F.) // блокировка кнопки //This.&(cn).Enabled := .F. // блокировка кнопки Darken2Open(ow:Handle) // затенение на окно aRet := ButtonSpavki(aDim,nButton,cw) // вызов другого MODAL окна Darken2Close(ow:Handle) // убрать затенение с окна DO EVENTS aForm := HMG_GetForms() // все открытые окна ? " === ButtonSpavki(...)=", ProcNL(), "aRet=", HB_ValToExp(aRet) ? " === aForm=", aForm ; ?v aForm ? " === !", cw, _IsWindowActive(cw), _IsWindowDefined(cw), cn, _IsControlDefined(cn, cw) IF _IsWindowDefined(cw) SET WINDOW THIS TO cw SetProperty( cw, cn, "Caption", cRet ) ? " === ThisWindow =", cw, ThisWindow.Name ? " === This =", cn, This.Name This.&(cn).Enabled := .T. This.Label_Buff.SetFocus() SET WINDOW THIS TO ELSE ? "==== *** ERROR *** WINDOW ["+cw+"] not found ! " ENDIF IF ! To_Focus(cw) AlertStop("Window not found ! " + cw, "ERROR") ENDIF //ow:SetFocus('Label_Buff') // на форме должен быть LABEL Label_Buff ? " === End = :Event(11)" ; ? " ..." Return Nil } )[/pre2] Вот сама функция: [pre2]FUNCTION To_Focus( cForm, cControl ) LOCAL hForm, lRet := _IsWindowDefined(cForm) DEFAULT cControl := "Label_Buf" IF lRet hForm := GetFormHandle(cForm) IF hForm != 0 IF IsIconic( hForm ) ; _Restore( hForm ) ENDIF SetProperty(cForm, "Topmost", .T.) DoMethod(cForm, "SetFocus") IF _IsControlDefined(cControl, cForm) DoMethod(cForm, cControl, "SetFocus") ENDIF SetProperty(cForm, "Topmost", .F.) ENDIF ENDIF RETURN lRet [/pre2]


SergKis: Andrey пишет В принципе это хорошо. И понятней стала причина ошибки - потеря MODAL окна, т.е. вызываем несколько MODAL окон, и при возврате окно теряется, улетает под главную форму. Не уверен, что это хорошо, т.к. получается не работает механизм назначения modal окну родителя, т.е.[pre2] FUNCTION _DefineModalWindow ( FormName, Caption, x, y, w, h, Parent, nosize, nosysmenu, nocaption, aMin, aMax, ; ... IF _HMG_InplaceParentHandle <> 0 Parent := _hmg_InplaceParentHandle ELSEIF ! _HMG_BeginWindowMDIActive Parent := _hmg_MainHandle ENDIF ... [/pre2] Для др. окон (например STANDARD, ...) тоже приходится городить hOld := _hmg_MainHandle _hmg_MainHandle := ThisWindow.Handle // or ow:Handle ... DEFINE WINDOW ... _hmg_MainHandle := hOld ... END WINDOW получается и этот механизм, задания Parent тоже под вопросом ? Parent := _hmg_MainHandle

Andrey: Столкнулся теперь с другой проблемой, прога виснет НАГЛУХО в некоторых режимах через несколько раз. Подозреваю потерю фокуса в MODAL окне. У юзера прога работает в режиме сервер-терминалов. Это когда ярлык на рабочем столе, а прога запускается на сервере. Так в этом режиме и прога наглухо вешается, по окнам проскочить невозможно, STANDART окна показывает, а MODAL спряталось под ним. Помогает только убивание проги на сервере, юзер вообще ничего сделать не может. Главное меню тоже висит... Можно сделать спец-менюшку в проге для показа открытых окон и активации спрятавшегося окна ?

SergKis: Andrey Попробуй поставь в ... SET TOOLTIP BALLOON ON SET WINDOW MODAL PARENT HANDLE ON // окна Modal получают родителя - активное окно PS Это на последней версии Для старой версии сделай так, возьми к своему проекту файл h_windows.prg, включи его в hbp сценарий, в нем сделай [pre2] STATIC nCtEfeito := 0, cDescEfeito := "" STATIC _HMG_OwnerModalHandle := .F. FUNCTION Set_HMG_OwnerModalHandle( lSet ) IF Valtype( lSet ) == "L" _HMG_OwnerModalHandle := lSet ENDIF RETURN _HMG_OwnerModalHandle . *-----------------------------------------------------------------------------* FUNCTION _DefineWindow ( FormName, Caption, x, y, w, h, nominimize, nomaximize, ; ... FUNCTION _DefineModalWindow ( FormName, Caption, x, y, w, h, Parent, nosize, nosysmenu, nocaption, aMin, aMax, ; ... IF _HMG_OwnerModalHandle _HMG_InplaceParentHandle := iif( _HMG_BeginWindowMDIActive, GetActiveMdiHandle(), GetActiveWindow() ) ENDIF IF _HMG_InplaceParentHandle <> 0 Parent := _hmg_InplaceParentHandle ELSEIF ! _HMG_BeginWindowMDIActive Parent := _hmg_MainHandle ENDIF ... тогда поставь в программе SET TOOLTIP BALLOON ON Set_HMG_OwnerModalHandle( .T. ) [/pre2]

Andrey: SergKis пишет: Это на последней версии Что-то не собирается...[pre2] Собираю MG_BCC = "c:\borland\bcc55" ilink32.exe @D:\TEMP\en2z4e.lnk hbmk2: Linker script: -Gn -Tpe -LC:\borland\BCC55\Lib;C:\borland\BCC55\Lib\PSDK;"C:\MiniGUI-23.04.4\harbour\lib";"C:\MiniGUI-23.04.4\harbour\bin"; "C:\MiniGUI-23.04.4\lib" -aa c0w32.obj OBJ\main.obj . ..... "C:\MiniGUI-23.04.4\resources\minigui.res" "C:\MiniGUI-23.04.4\resources\hbprinter.res" "C:\MiniGUI-23.04.4\resources\miniprint.res" Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland Error: Unresolved external 'SwitchToThisWindow' referenced from C:\MINIGUI-23.04.4\LIB\MINIGUI.LIB|c_windowsAPI hbmk2[Abonent4win]: Error: Running linker. 2[/pre2]

SergKis: Andrey Что ты собираешь ? h_windows.prg надо из своей старой версии брать, у тебя была, вроде 23.01 работающая

Andrey: SergKis пишет: Что ты собираешь ? C:\MiniGUI-23.04.4\ - новую версию, старую не хочется... Если собираю с BCC58, то собирается, но иконки в проге не те (я им не собираю никогда, из-за этого на 7.30 переходить начал) Если собираю с BCC55, то не собирается.

SergKis: Andrey пишет Если собираю с BCC58, то собирается, но иконки в проге не те (я им не собираю никогда, из-за этого на 7.30 переходить начал) gfilatov2002 пишет про 7.30Для получения русских букв в имени программы надо заменить два файла в папке \BCC102\bin\ на аналогичные файлы из поставки ВСС 5.5: - brcc32.exe - rw32core.dll Попробуй проделать это для BCC58\bin

Andrey: Заменил в BCC58\bin ilink32.exe implib.exe lnkdfm250.dll из 7.30 - вроде ресурсы стали собираться правильно ! И прога собралась нормально. Выложил юзеру - жду результатов.

Andrey: SergKis пишет: SET WINDOW MODAL PARENT HANDLE ON // окна Modal получают родителя - активное окно Протестировал юзер этот режим. Теперь прога вешается в других местах программы, где до этого не вешалась - потеря фокуса окна и нет на экране что можно закрыть. Т.е. на экране 3-4 окна по которым мышкой можно скакать, а закрыть НЕЛЬЗЯ !!! не реагирует на закрытие. Может это rdp-протокол не даёт закрыть активную задачу ? А как тогда закрыть эту "висячую" программу ? Есть какие варианты ? Веду лог. Вручную смотрю где висит программа и пытаюсь висячее окно приколотить через To_Focus() Может можно как то по другому ? P.S. Ещё на таймерах вешается прога. Но это я с помощью Сергея уже исправил. P.S.2 Проблема с вызовом двух подряд модальных окон так и не решилась, всё равно окно 2 вешается, благо клавиша ESC срабатывает, хоть юзер может выйти из этого окна и без вылета из программы.

SergKis: Andrey пишет P.S.2 Проблема с вызовом двух подряд модальных окон так и не решилась, всё равно окно 2 вешается, благо клавиша ESC срабатывает Попробуй вместо 1-го modal сделать CHILD TOPMOST и не делать ON INIT {|| This.Topmost := .F., ... Изменится поведение ? Теперь прога вешается в других местах программы, где до этого не вешалась - потеря фокуса окна и нет на экране что можно закрыть. Пробуй манипулировать командами в тех местах, которые сломались SET WINDOW MODAL PARENT HANDLE OFF ... SET WINDOW MODAL PARENT HANDLE ON

SergKis: SergKis пишет Попробуй вместо 1-го modal сделать CHILD TOPMOST Ничего не даст, т.к. CHILD привязывается в _DefineWindow(...) к Main окну ParentHandle := iif( child == .T., _HMG_MainHandle, 0 ) что бы привязывать к STANDARD надо перед созданием CHILD делать hOld := _HMG_MainHandle _HMG_MainHandle := ThisWindow.Handle DEFINE WINDOW ... CHILD TOPMOST ... _HMG_MainHandle := hOld ... END WINDOW ... и смотреть поможет или нет PS Перед DEFINE WINDOW ... MODAL ... надо окну CHILD сделать Topmost := .F.

Andrey: Пипец... Теперь перестал работать код, который ранее работал [pre2] ADD COLUMN TO oBrwV HEADER CRLF + "Наименование"+ CRLF + "оборудования/работ" ; SIZE nTxtWidth ; ALIGN DT_LEFT,DT_CENTER,DT_LEFT ; // cells, header, footer DATA {|| SAY_SEL((cAlias)->KOBORUD, "OBORUD", "OBORUD", 1 ) } ; NAME KOborud EDITABLE oBrwV:aColumns[4]:bPrevEdit := {|| EditTableCol4() /*, _PushKey( VK_ESCAPE )*/, MsgDebug("ky-ky"), FALSE }[/pre2] MsgDebug("ky-ky") на экране есть, а фокуса в таблице нет, т.е. дальше редактировать не могу ! Окно Модальное на экране не активное !!! Висит и всё ! Выход только по ESC ! И что делать ?

Andrey: Модальное окно на экране (1), вызываю второе модальное окно (2) с ТСБ, нажимаю клавишу F2 - помощи (AlertInfo) и окно (2) - ВИСИТ !!! Уже во втором месте программы такое с модальными окнами... Пока сделал так: [pre2] hOld := _HMG_InplaceParentHandle _HMG_InplaceParentHandle := ThisWindow.Handle DEFINE WINDOW Form_Tvr ; MODAL NOSIZE ; ON INIT {|| OnInitFormTvr() } .... ON KEY ESCAPE ACTION ThisWindow.Release ON KEY F2 ACTION HelpThisWindow() ON KEY F3 ACTION AlertInfo(cHelp, "Помощь") если вызывать эти клавиши, то окно тоже ВЕШАЕТСЯ !!! END WINDOW .... IF ! ISNIL(hOld) ; _HMG_InplaceParentHandle := hOld ENDIF ? "=[End]= " + ProcNL(), "Forms: "+ HB_ValToExp(HMG_GetForms()) RETURN NIL STATIC FUNCTION OnInitFormTvr() oBrwV:Setfocus() IF oBrwV:nAt == 1 .AND. (oBrwV:cAlias)->KOLVO == 0 oBrwV:PostMsg( WM_KEYDOWN, VK_RETURN, 0 ) // послать ENTER для редактирования //_PushKey(VK_1) ENDIF RETURN NIL[/pre2] Григорий, почему так происходит ?

SergKis: Andrey У тебя установлено SET WINDOW MODAL PARENT HANDLE ON Убери все строки hOld := _HMG_InplaceParentHandle _HMG_InplaceParentHandle := ThisWindow.Handle ... IF ! ISNIL(hOld) ; _HMG_InplaceParentHandle := hOld ENDIF Для модального окна, которое запускается с окна STANDARD сделай запоминание типа окна, т.е. LOCAL cTypeWnd := ow:Type или This.Type убери все лишние переключения фокуса оставь, например, при выходе из modal окна[pre2] ACTIVATE WINDOW &cForm IF cTypeWnd == "S" To_Focus(cWnd, cBrw) ENDIF [/pre2] Что бы при возвратах система сама возвращала фокус на handle родителя oBrwV:aColumns[4]:bPrevEdit := {|| EditTableCol4() /*, _PushKey( VK_ESCAPE )*/, MsgDebug("ky-ky"), FALSE } MsgDebug("ky-ky") на экране есть, а фокуса в таблице нет, т.е. дальше редактировать не могу ! Окно Модальное на экране не активное !!! Висит и всё ! Выход только по ESC ! Если _HMG_InplaceParentHandle не задано или задано каким то значением _HMG_InplaceParentHandle := hOld не тек. активного окна и не стоит SET WINDOW MODAL PARENT HANDLE ON , то после MsgDebug("ky-ky") фокус может улететь куда то на др. окно или main, т.к. MsgDebug() - modal окно внутри. Лучше такие конструкции, как вызов AlertInfo, MsgDebug, ... (в основе HMG_Alert()) не использовать PS Ты часто ставишь фокус на Label "Label_Buf", если у тебя есть установки oBrw:UserKeys(...) или oBrw:bUserKeys - обработчики клавиш, то они работают, если фокус на тсб, т.е. фокус на "Label_Buf" блокирует работу уст. клавиш тсб. Это надо иметь ввиду.

Andrey: Поставил как ты написал. Всё равно без этого не работает. [pre2]STATIC FUNCTION OnInitFormTvr() oBrwV:Setfocus() IF oBrwV:nAt == 1 .AND. (oBrwV:cAlias)->KOLVO == 0 oBrwV:PostMsg( WM_KEYDOWN, VK_RETURN, 0 ) // послать ENTER для редактирования //_PushKey(VK_1) ENDIF RETURN NIL[/pre2] Если из Enter выходим и нажимает эти клавиши - то висим. [pre2] ON KEY F2 ACTION HelpThisWindow() ON KEY F3 ACTION AlertInfo(cHelp, "Помощь")[/pre2] Нажимаем ESC - выход из Modal(2) и потом всё работает - клавиши ВСЕ работают. Т.е. на ПЕРВОМ разе беда, а потом всё работает...

SergKis: Варианты попробуй 1. - Minimize, Restore потом OnInitFormTvr 2.- Minimize потом выход из modal(2) и снова вход как было 0. и как 1.

Andrey: SergKis пишет: 2.- Minimize потом выход из modal(2) и снова вход как было 0. и как 1. Не понял, это как ?



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