Форум » [x]Harbour » Как запретить закрытие терминального окна "крестом"? » Ответить

Как запретить закрытие терминального окна "крестом"?

PSP: Речь идет об терминальном окне с прогой на xHarbour. Извините за ламерский вопрос. Возможно ли это? Если да, то как? Спасибо.

Ответов - 28, стр: 1 2 All

Sergy: Pasha, PSP - спасибо, понял. Запущу проект, потом обязательно займусь "красивостями" второго терминала.

Sergy: PSP пишет: Посмотри пример для терминала gtwvt: harbour\tests\wvtext.prg Посмотрел. Офигенно. НО: диспетчер задач срубает программу без единого звука.

Sergy: Вопрос. Вроде все отладил, но кое-где шаловливые руки юзеров "срубают" задачу несмотря на выключенный крестик. Я вижу это по увеличивающемуся значению переменной err_count. Прихожу, спрашиваю - что да как: в ответ невнятное блеяние что "все зависло, ничего не работало, я вызвал диспетчер задач, снял ее, запустил и снова все заработало". Как-бы грамотно запротоколировать процесс ? Что они там делают - то-ли винду вырубают не выйдя из программы, то-ли диспетчером срубают, то-ли терминальный сеанс завершают, то-ли вообще обходят какие-то программыне ограничения, введенные для младших сотрудников - х.е.з., но хотелось-бы разобраться... EXIT PROCEDURE в таком случае точно не срабатывает. Очень помог-бы снимок экрана или хотя-бы стек вызовов процедур на крайний случай... С какой стороны лучше подступиться и возможно ли это на Harbour ? Как первый вариант: маленькая программа-обертка(запускатель) для главной программы. Если выход из главной программы произошел без установки кода завершения, допустим, 55 - значит программа завершилась неудачно и нужно сохранить снимок экрана для разбора полетов. Может есть способ элегантнее? И я сомневаюсь, что он отработает в случае завершения работы винды или сеанса.


Dima: Снимок экрана наверное не поможет а вот стек процедур да.

petr707: Можно крестик не запрещать, использовать под своим контролем что-то типа(см.ниже) WN_Notifier - можно вызывать и не при нажатии крестика, только задать nEvent(эмуляция) Коды возврата (0 или 1) нужно проверять, они разные для hb20 и hb30, h32 также разные коды для nEvent .. HB_GTINFO( HB_GTI_CLOSABLE , .t. ) HB_GtInfo( HB_GTI_NOTIFIERBLOCK, {|nEvent, ...| WN_Notifier( nEvent, ... ) } ) .... FUNCTION WN_Notifier( nEvent, ... ) Static n_GTE_CLOSE:=0// Номер вхождения .. DO CASE CASE nEvent == HB_GTE_SETFOCUS CASE nEvent == HB_GTE_CLOSE //HB_K_CLOSE n_GTE_CLOSE++ if n_GTE_CLOSE<=1// условие завершения - необязательное - можно требовать два нажатия на крестик и т.д. // завершение работы - здесь записать в лог, закрыть таблицы и прочее return 0 else n_GTE_CLOSE :=0 return 1 endif CASE nEvent == HB_GTE_RESIZED // обработка изменения размера окна OTHERWISE ENDCASE RETURN 0

Sergy: petr707 пишет: HB_GTINFO( HB_GTI_CLOSABLE , .t. ) Это ведь с GTWIN не будет работать ? Нужно под GTWIN. Пока проблем от GTWVT для меня больше, чем преимуществ от его красивостей.

petr707: Можно сделать как в самом Windows При запуске следующего сеанса проверяется неудаленный семафор предыдущего сеанса, определяется что завершение было нерегламентным, поднимаются логи и прочее. Если сеанс свалился по ошибке из ERRORSYS - должен быть файл этого лога. Если по внутренней ошибке - есть hb_out.log Можно завести служебную таблицу статистики сеансов регистировать в нее все сеансы - дата, время -входа, user, комп и дата+время завершения и тд. и смтреть сколько свалов в каком месте. Можно - по настройке - включить лог выполнения функций программы. Можете даже писать это не свои логи, а в журнал приложений Windows(на любителя)

Dima: petr707 пишет: HB_GtInfo( HB_GTI_NOTIFIERBLOCK, {|nEvent, ...| WN_Notifier( nEvent, ... ) } ) Как поймать событие в функции WN_Notifier что окно свернули ? PS Терминал Gtwvt/GtWvg Проехали , придумал как.



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