Отправлено: 14.05.18 21:33. Заголовок: Вылет из программы...
Всем привет ! Как можно в МиниГуи программе сделать вызов своих функций при аварийном завершении программы (т.е. при вылете) ? Т.е. хочу сделать сразу после появления MsgBox() вызов 2-3 функций и потом сделать DbCloseAll(). Как это реализовать ?
Для чего это нужно, поясню: при входе в свою программу я пишу в базу кто и когда вошел в программу (логин пользователя). И при выходе из программы, стираю этого пользователя из базы. Если программа "вылетает", то юзер числится как работающий. Древнее наследие с клипера, хотел переделать, да так и осталось.
gfilatov2002 Андрей присылал мне кино с зависанием. Думаю виснет на прорисовке тсб, т.к. используется установка :FilterFTS() и на короткий просмотр (строк < :nRowCount()) прорисовка тсб и подсчет :nLen успевает сработать, если строк в тсб > :nRowCount(), то на тсб клинит, т.к. кнопка вызова справочника остается Disable. Набор символов поиска происходит в :HandleEvents() -> : KeyDown() -> :bUserKeys символы набираются в Static переменную и Label отображает. Еще у него исп. :bEvents с отображением на каждом нажатии
STATIC FUNCTION MyEventBrowse(oBrw, nMsg) // "RUS/LAT" LOCAL cForm := oBrw:cParentWnd, cAlias := oBrw:cAlias
Думаю здесь из за разницы скоростей набора символов и прорисовки тсб получается подвис. Ранее :FilterFTS() делался тут же в :bUserKeys, сейчас ушло на _wPost() и Андрей написал, что стало лучше
цитата:
Сейчас 6 раз выбрал мышкой, всё отлично. 5 раз выбрал через ENTER и повис. Ну хоть больше стало выбирать...
Предложение перевести ввод данных для фильтра в GETBOX\TEXTBOX он пока отвергает. PS. Это происходит у него только на PC с WinServer 2008
Предложение перевести ввод данных для фильтра в GETBOX\TEXTBOX он пока отвергает.
Я убрал совсем TEXTBOX и поставил только LABEL, чтобы проверить. Т.е. только отображение что набрали на клавиатуре, убрал одну причину СОВСЕМ для проверки. Или я что-то не понимаю с этим GETBOX\TEXTBOX, мне он не нужен пока ? После того как переделал на LABEL всё равно ВИСНЕТ прога по клавише ENTER, на 5-6-7 раз, как повезёт
Фигня получается... Вылет был из-за потери окна ! 1,5 года была плавающая ошибка, то есть, то нет. Вылетало только на одном сервере-терминалов. Сейчас с переходом на новый BCC 7.30 ошибка получилась постоянной и всегда ! Наверное более жесткий контроль установлен. В принципе это хорошо. И понятней стала причина ошибки - потеря MODAL окна, т.е. вызываем несколько MODAL окон, и при возврате окно теряется, улетает под главную форму. Вот и вся ошибка была. Причём, чем больше весит ехе-ник, тем больше вероятность возникновения такой ошибки !!! Сергей дал функцию для предотвращения таких ситуаций, выкладываю сюда, может ещё кому понадобиться.
Событие на кнопку.
(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 } )
Вот сама функция:
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
Отправлено: 21.06.23 12:25. Заголовок: Andrey пишет В принц..
Andrey пишет
цитата:
В принципе это хорошо. И понятней стала причина ошибки - потеря MODAL окна, т.е. вызываем несколько MODAL окон, и при возврате окно теряется, улетает под главную форму.
Не уверен, что это хорошо, т.к. получается не работает механизм назначения modal окну родителя, т.е.
Для др. окон (например STANDARD, ...) тоже приходится городить hOld := _hmg_MainHandle _hmg_MainHandle := ThisWindow.Handle // or ow:Handle ... DEFINE WINDOW ... _hmg_MainHandle := hOld ... END WINDOW получается и этот механизм, задания Parent тоже под вопросом ? Parent := _hmg_MainHandle
Отправлено: 28.06.23 19:14. Заголовок: Столкнулся теперь с ..
Столкнулся теперь с другой проблемой, прога виснет НАГЛУХО в некоторых режимах через несколько раз. Подозреваю потерю фокуса в MODAL окне. У юзера прога работает в режиме сервер-терминалов. Это когда ярлык на рабочем столе, а прога запускается на сервере. Так в этом режиме и прога наглухо вешается, по окнам проскочить невозможно, STANDART окна показывает, а MODAL спряталось под ним. Помогает только убивание проги на сервере, юзер вообще ничего сделать не может. Главное меню тоже висит... Можно сделать спец-менюшку в проге для показа открытых окон и активации спрятавшегося окна ?
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. )
Отправлено: 28.06.23 23:37. Заголовок: SergKis пишет: Что ..
SergKis пишет:
цитата:
Что ты собираешь ?
C:\MiniGUI-23.04.4\ - новую версию, старую не хочется... Если собираю с BCC58, то собирается, но иконки в проге не те (я им не собираю никогда, из-за этого на 7.30 переходить начал) Если собираю с BCC55, то не собирается.
Отправлено: 29.06.23 07:56. Заголовок: Andrey пишет Если со..
Andrey пишет
цитата:
Если собираю с BCC58, то собирается, но иконки в проге не те (я им не собираю никогда, из-за этого на 7.30 переходить начал)
gfilatov2002 пишет про 7.30
цитата:
Для получения русских букв в имени программы надо заменить два файла в папке \BCC102\bin\ на аналогичные файлы из поставки ВСС 5.5: - brcc32.exe - rw32core.dll
Отправлено: 29.06.23 11:41. Заголовок: Заменил в BCC58\..
Заменил в BCC58\bin ilink32.exe implib.exe lnkdfm250.dll из 7.30 - вроде ресурсы стали собираться правильно ! И прога собралась нормально. Выложил юзеру - жду результатов.
Отправлено: 02.07.23 15:17. Заголовок: SergKis пишет: SET ..
SergKis пишет:
цитата:
SET WINDOW MODAL PARENT HANDLE ON // окна Modal получают родителя - активное окно
Протестировал юзер этот режим. Теперь прога вешается в других местах программы, где до этого не вешалась - потеря фокуса окна и нет на экране что можно закрыть. Т.е. на экране 3-4 окна по которым мышкой можно скакать, а закрыть НЕЛЬЗЯ !!! не реагирует на закрытие. Может это rdp-протокол не даёт закрыть активную задачу ? А как тогда закрыть эту "висячую" программу ? Есть какие варианты ?
Веду лог. Вручную смотрю где висит программа и пытаюсь висячее окно приколотить через To_Focus() Может можно как то по другому ?
P.S. Ещё на таймерах вешается прога. Но это я с помощью Сергея уже исправил.
P.S.2 Проблема с вызовом двух подряд модальных окон так и не решилась, всё равно окно 2 вешается, благо клавиша ESC срабатывает, хоть юзер может выйти из этого окна и без вылета из программы.
Отправлено: 02.07.23 18:21. Заголовок: 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.
MsgDebug("ky-ky") на экране есть, а фокуса в таблице нет, т.е. дальше редактировать не могу ! Окно Модальное на экране не активное !!! Висит и всё ! Выход только по ESC ! И что делать ?
Отправлено: 05.07.23 17:01. Заголовок: Модальное окно на эк..
Модальное окно на экране (1), вызываю второе модальное окно (2) с ТСБ, нажимаю клавишу F2 - помощи (AlertInfo) и окно (2) - ВИСИТ !!! Уже во втором месте программы такое с модальными окнами...
Пока сделал так:
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
Отправлено: 05.07.23 17:50. Заголовок: Andrey У тебя устан..
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 окна
ACTIVATE WINDOW &cForm
IF cTypeWnd == "S" To_Focus(cWnd, cBrw) ENDIF
Что бы при возвратах система сама возвращала фокус на 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" блокирует работу уст. клавиш тсб. Это надо иметь ввиду.
Все даты в формате GMT
3 час. Хитов сегодня: 27
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет