On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 5855
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.05.18 21:33. Заголовок: Вылет из программы...


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

Для чего это нужно, поясню: при входе в свою программу я пишу в базу кто и когда вошел в программу (логин пользователя).
И при выходе из программы, стираю этого пользователя из базы.
Если программа "вылетает", то юзер числится как работающий.
Древнее наследие с клипера, хотел переделать, да так и осталось.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 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.)


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4795
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.09.25 12:23. Заголовок: Andrey пишет Как мож..


Andrey пишет
 цитата:
Как можно в МиниГуи программе сделать вызов своих функций при аварийном завершении программы (т.е. при вылете) ?


Есть переменные для задания блоков кода при ошибке:
 
- _HMG_bOnErrorInit := {|cMsg| ..., cMsg } -> возвращает cMsg, выполняется перед ф-ями AlertStop или MsgStop
- _HMG_bOnErrorExit := {|| ... } -> выполняется после ф-ий AlertStop или MsgStop, перед ReleaseAllWindows()


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8034
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.09.25 18:54. Заголовок: SergKis пишет: Есть..


SergKis пишет:

 цитата:
Есть переменные для задания блоков кода при ошибке:


Да ! Это нужно ! А как их использовать ?
Куда их ставить ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4796
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.09.25 20:04. Заголовок: Andrey пишет Куда их..


Andrey пишет
 цитата:
Куда их ставить ?


В начало Main или, например
INIT PROCEDURE Sets_ENV()
...
_HMG_bOnErrorInit := {|cMsg| ..., cMsg }
_HMG_bOnErrorExit := {|| ... }
...
RETURN

 цитата:
А как их использовать ?


Как фантазии хватит, списки окон, списки контролов, ... пробуй

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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

А почему такая ошибка ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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) не нужен

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




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


Спасибо !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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
} )

Пришлось пройтись по всей программе и смотреть все места, где появились такие проблемы и делать добавку по коду !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 окна на др. тип будет без проблем

Спасибо: 1 
ПрофильЦитата Ответить
Ответов - 209 , стр: 1 2 3 4 5 6 7 8 9 10 11 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 2292
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет