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

Как правильно перехватить событие выхода по кресту?

Vladimir_K : Привет всем! Что-то не могу перехватить событие nEvent == HB_GTE_CLOSE Или эта возможность не реализована ? Harbour 3.0.0 (r16951) FUNCTION Main() #include "hbgtinfo.ch" #include "inkey.ch" REQUEST HB_GT_WVT_DEFAULT REQUEST HB_GT_WVT Hb_GtInfo( HB_GTI_CLOSABLE, .T. ) HB_GtInfo( HB_GTI_NOTIFIERBLOCK, { |nEvent| CloseX( nEvent ) } ) Set( _SET_EVENTMASK, INKEY_ALL ) MSETCURSOR( .T. ) CLS Alert( 'Start Application' ) ? 'To close by a cross' while .t. ; end RETURN NIL *---------------- STATIC FUNCTION CloseX( nEvent ) if nEvent == HB_GTE_CLOSE.and.Alert( 'Close Application',{'OK','NO'})==1 CLOSE ALL endif RETURN NIL

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

petr707: Похоже, просто пропущен Quit ? STATIC FUNCTION CloseX( nEvent ) if nEvent == HB_GTE_CLOSE.and.Alert( 'Close Application',{'OK','NO'})==1 CLOSE ALL QUIT endif RETURN NIL

Vladimir_K : Функция CloseX( nEvent ) не вызывается, т.е. не срабатывает кодоблок в строке HB_GtInfo( HB_GTI_NOTIFIERBLOCK, { |nEvent| CloseX( nEvent ) } ) Может быть у кого-нибудь на другой версии Harbour этот тестик работает ?

petr707: У меня работает - на Harbour 2.x Тема обсуждалась на форуме, можно сделать поиск по слову "HB_GTI_NOTIFIERBLOCK" Можно убрать слово STATIC из описания функции, а также в тело MAIN добавить контроль ,что дейстительно программа использует терминал gtWVT ? hb_gtversion() // = "WVT" в gtWIN - NOTIFIER не работает


Vladimir_K : проверил ? hb_gtversion() - возвращает WVT STATIC убрал, хотя не должно бы мешать. Попробую скачать новую версию Harbour, но помнится у меня и на Harbour 2 не работало. Я тогда эту затею отложил, но заказчики привыкли закрывать крестом вместо меню "выход "

Dima: как вариант hb_GtInfo( HB_GTI_CLOSABLE, .f. )

Vladimir_K : У меня этот параметр так и установлен в 'False' Hb_GtInfo( HB_GTI_CLOSABLE, .F. ) но тянутся то пользователи к крестику!

Vladimir_K : Скачал ночную сборку Harbour 3.1 компилирую: строка в bat-файле c:\hb31\bin\hbmk2 %1 -Lc:\hb30\lib\win\mingw -iC:\hb30\Include не помогло. ???

Dima: Vladimir_K пишет: Функция CloseX( nEvent ) не вызывается У меня вызывается но как то странно. Когда вылезает месага Alert( 'Start Application' ) , CloseX cрабатывает. Закрываем Alert( 'Start Application' ) , видим ? 'To close by a cross' , жмем крест , срабатывает CloseX. А вот если понажимать любые клавиши после ? 'To close by a cross' , то не работает. Странно однако, ведь в 2-х последних случаях мы сидим в Do while

Dima: Попробуй так (у меня заработало) [pre2] FUNCTION CloseX( nEvent ) if nEvent == HB_GTE_CLOSE clear typeahead if Alert( 'Close Application',{'OK','NO'})==2 Return 1 else close all quit endif endif RETURN 0 [/pre2]

Vladimir_K : А у меня в любом случае если нажатие на крест - моментально закрывается как при Alt-C CloseX ниразу не сработала

Dima: Vladimir_K я собрал прогу так а Вы ? hbmk2 test -gtwvt PS BCC55

Vladimir_K : FUNCTION Main() #include "hbgtinfo.ch" #include "inkey.ch" REQUEST HB_GT_WVT_DEFAULT REQUEST HB_GT_WVT Hb_GtInfo( HB_GTI_CLOSABLE, .T. ) HB_GtInfo( HB_GTI_NOTIFIERBLOCK, { |nEvent| CloseX( nEvent ) } ) Set( _SET_EVENTMASK, INKEY_ALL ) MSETCURSOR( .T. ) CLS Alert( 'Start Application' ) ? hb_gtversion() // WVT ? 'To close by a cross' while .t. ; end RETURN NIL *---------------- /* FUNCTION CloseX( nEvent ) if nEvent == HB_GTE_CLOSE.and.Alert( 'Close Application',{'OK','NO'})==1 CLOSE ALL endif RETURN NIL */ FUNCTION CloseX( nEvent ) if nEvent == HB_GTE_CLOSE clear typeahead if Alert( 'Close Application',{'OK','NO'})==2 Return 1 else close all quit endif endif RETURN 0 Не работает - потому что у меня, почему-то, не выполняестся кодоблок в этой строчке HB_GtInfo( HB_GTI_NOTIFIERBLOCK, { |nEvent| CloseX( nEvent ) } )

Dima: Vladimir_K пишет: Не работает А если пробнуть BCC а не MINGW

Vladimir_K : также c:\hb31\bin\hbmk2 clos.prg -gtwvt Я подозреваю что не работает из-за того, что транслятор не Борландовский Попробуйте minGW (я ВСС никогда не пользовался)

Dima: Vladimir_K пишет: Попробуйте minGW Прибил я его и давно.

petr707: Цитата из MAIN : while .t. ; end Зачем же так нагружать систему ? Ну хотя бы так: n:=0;do while n<10000 ; n++; ?"n="+str(n); inkey(100);end Цитата: "..почему-то, не выполняестся кодоблок..." Нет доказательств этого утверждения. Хотя бы сделайте вставку FUNCTION CloseX( nEvent ) Static n_call:=0 n_call++ ? "Call Closex="+str(n_call) ...

Vladimir_K : Скачаю ВСС и попробую А почему minGW не подходит?

Vladimir_K : Петр 707 1)Цитата из MAIN : while .t. ; end Зачем же так нагружать систему ? ------------------------------------------ это же тэстовая програмка ===================== 2) Цитата: "..почему-то, не выполняестся кодоблок..." Нет доказательств этого утверждения. ------------------------------------ если бы выполнялся, то я бы увидел сообщение Alert( 'Close Application',{'OK','NO'}) из функции FUNCTION CloseX( nEvent ) if nEvent == HB_GTE_CLOSE.and.Alert( 'Close Application',{'OK','NO'})==1 CLOSE ALL endif RETURN NIL

Dima: Проверил в Mingw , да не работает.

petr707: Э-э... Цитата: это же тэстовая програмка То есть - должна работать иначе, чем нетестовая?!.. Сильно Нагруженный процесс просто не даст системе отработать нажатие на крестик. Все ресурсы уйдут на цикл while .t. ; end 2) Что-то с логикой не так. Цитата:"..я бы увидел сообщение Alert( 'Close Application',{'OK','NO'}) " Фишка в том, что может и увидел бы, но не всегда, а только в случае "if nEvent == HB_GTE_CLOSE"



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