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

|
|
Ответов - 209
, стр:
1
2
3
4
5
6
7
8
9
10
11
All
[только новые]
|
|
|
|
| постоянный участник
|
Пост N: 4794
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.09.25 13:45. Заголовок: Andrey пишет Нужен г..
Andrey пишет | цитата: | | Нужен глобальный перехват ошибки |
| Чем это поможет ? Сообщение, что на окне нет контрола. Для начала проверь IF _IsControlDefined(cn, This.Name) This.&(cn).Enabled := .T. ELSE ky := hmg_GetFormControls(This.Name) ? "FormName =",This.Name, "Control =", cn, ky ; ?v ky ; ? ENDIF ow:Enabler(cn,.T.)
|
 |

|
|
|
| постоянный участник
|
Пост N: 4795
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.09.25 12:23. Заголовок: Andrey пишет Как мож..
Andrey пишет | цитата: | | Как можно в МиниГуи программе сделать вызов своих функций при аварийном завершении программы (т.е. при вылете) ? |
| Есть переменные для задания блоков кода при ошибке: - _HMG_bOnErrorInit := {|cMsg| ..., cMsg } -> возвращает cMsg, выполняется перед ф-ями AlertStop или MsgStop - _HMG_bOnErrorExit := {|| ... } -> выполняется после ф-ий AlertStop или MsgStop, перед ReleaseAllWindows()
|
 |

|
|
|
| постоянный участник
|
Пост N: 8034
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.09.25 18:54. Заголовок: SergKis пишет: Есть..
SergKis пишет: | цитата: | | Есть переменные для задания блоков кода при ошибке: |
| Да ! Это нужно ! А как их использовать ? Куда их ставить ?
|
 |

|
|
|
| постоянный участник
|
Пост N: 4796
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.09.25 20:04. Заголовок: Andrey пишет Куда их..
Andrey пишет В начало Main или, например INIT PROCEDURE Sets_ENV() ... _HMG_bOnErrorInit := {|cMsg| ..., cMsg } _HMG_bOnErrorExit := {|| ... } ... RETURN Как фантазии хватит, списки окон, списки контролов, ... пробуй
|
 |

|
|
|
| постоянный участник
|
Пост N: 8047
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.09.25 19:53. Заголовок: В небольшой тестовой..
В небольшой тестовой программе хочу окно с ошибкой с большими буквами. Делаю так: Function Main() ... _DefineFont("DlgFont" , "DejaVu Sans Mono", 15, .F., .F. ) Set ShowRedAlert On SET WINDOW MAIN OFF DEFINE WINDOW Form_Main ... ; MAIN NOSIZE TOPMOST ; ... This.Label_1.Setfocus // такого объекта нет - это проверка ошибки !!! Прога запускается и вылетает вот с такой ошибой: Error BASE/1132 Bound error: array access Args: [1] = A { ... } length: 4 [2] = N 0 --------------------------------- Stack Trace --------------------------------- Called from _SETFOCUS(1143) in module: h_controlmisc.prg Called from DOMETHOD(6161) in module: h_controlmisc.prg Called from MAIN(52) in module: demo_e.prg А почему такая ошибка ? 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4822
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.09.25 21:39. Заголовок: Andrey пишет А почем..
Andrey пишет Что с ней не так ? SETFOCUS(1143) вызвал ошибку, "Bound error: array access Args: [1] = A { ... } length: 4 [2] = N 0" говорит, что 0 в массиве, поиск - нет контрола This.Label_1.Setfocus Попробуй поставь Function Main() ... ALTD(1) ... Будет старое сообщение, т.е. в режиме отладки 1ый раз идет проверка наличия контрола, потом команда SetFocus, ALTD(0) откл. режим отладки, сразу выполняется команда SetFocus. В отлаженной проге (окнах) ALTD(1) не нужен
|
 |

|
|
|
| постоянный участник
|
Пост N: 8048
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.09.25 22:45. Заголовок: Спасибо ! :sm36:..
Спасибо ! 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8128
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.12.25 15:34. Заголовок: Перевел свою большую..
Перевел свою большую прогу на новую версию МиниГуи - 25.11 Update 1 (PRO) До этого сидел на версии 23.09 (Update 2) со старым компилятором Харбора. И столкнулся с проблемой - потеря фокуса окна, возврат на окно есть, а выбор на этом окне нет. Т.е. окно STANDART, далее окно MODAL , далее окно MODAL, далее окно MODAL, далее окно MODAL, далее окно MODAL (т.е. 4 окна MODAL) выбор из справочника город/улица - выбрали город, вернулись на 3 окно MODAL и всё !!! Прога висит, окно блокировано - выбрать ничего нельзя, доступна ТОЛЬКО клавиша ESC. Теперь пробуем заново сделать выбор и всё работает !!! До следующего входа по этой цепочки окон. Если не вызываю ЧЕТВЕРТОЕ окно MODAL выбора из справочника, а допустим там просто ввод текста, то зависания нет. Решил проблему так (СПАСИБО Сергею  ): (This.Object):Event(11,{|obtn,ky,abtn| // объект,event,параметр получаем Local ow := obtn:Window ... SET WINDOW THIS TO ow:Name aRet := ButtonSpavki(aDim,nButton,cw) SET WINDOW THIS TO // Важно !!! AEval(HMG_GetForms(,.T.), {|oo| EnableWindow(oo:Handle) }) This.Get_Buff.Setfocus ow:Enabler(cn, .T.) // разблокировка кнопки DO EVENTS Return Nil } ) Пришлось пройтись по всей программе и смотреть все места, где появились такие проблемы и делать добавку по коду ! 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4863
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.12.25 16:15. Заголовок: Andrey Ты не досмот..
Andrey Ты не досмотрел пример Tsb_2WndType для main окна и modal окон надо :Event( 3, {|ow,ky,cn| // button 3 Local lIsModal := _HMG_IsModalActive _wSend("_Enable",,{cn, .F.}) SET WINDOW THIS TO ow:Name _HMG_IsModalActive := .T. ky := Table_Four(ow, cn, .T.) _HMG_IsModalActive := lIsModal SET WINDOW THIS TO AEval(HMG_GetForms(,.T.), {|oo| EnableWindow(oo:Handle) }) _wSend("_Enable",ow,{cn, .T.}) ow:SetFocus(owc:cFocus) _wSend(21) Return Nil }) для окна standard и modal окон надо :Event( 1, {|ow,ky,cn| Local lIsModal := _HMG_IsModalActive SET WINDOW THIS TO ow:Name _HMG_IsModalActive := .T. Table_Four(ow, cn, .T.) _HMG_IsModalActive := lIsModal AEval(HMG_GetForms(,.T.), {|oo| EnableWindow(oo:Handle) }) // !!! remove LOSS OF FOCUS for windows SET WINDOW THIS TO ow:Enabler(cn, .T.) ow:SetFocus(ky := ow:Cargo:cFocus) DO EVENTS Return Nil }) тогда замена main окна на др. тип будет без проблем
|
 |

|
|
Ответов - 209
, стр:
1
2
3
4
5
6
7
8
9
10
11
All
[только новые]
|
|