Автор | Сообщение |
|
| |
Пост N: 7
Зарегистрирован: 14.09.11
|
|
Отправлено: 19.11.11 22:38. Заголовок: Как правильно перехватить событие выхода по кресту?
Привет всем! Что-то не могу перехватить событие 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
[только новые]
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 20.11.11 00:53. Заголовок: Выход по X
Похоже, просто пропущен Quit ? STATIC FUNCTION CloseX( nEvent ) if nEvent == HB_GTE_CLOSE.and.Alert( 'Close Application',{'OK','NO'})==1 CLOSE ALL QUIT endif RETURN NIL
|
|
|
|
| |
Пост N: 8
Зарегистрирован: 14.09.11
|
|
Отправлено: 20.11.11 11:29. Заголовок: Функция CloseX( nEve..
Функция CloseX( nEvent ) не вызывается, т.е. не срабатывает кодоблок в строке HB_GtInfo( HB_GTI_NOTIFIERBLOCK, { |nEvent| CloseX( nEvent ) } ) Может быть у кого-нибудь на другой версии Harbour этот тестик работает ?
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 20.11.11 12:01. Заголовок: крестик
У меня работает - на Harbour 2.x Тема обсуждалась на форуме, можно сделать поиск по слову "HB_GTI_NOTIFIERBLOCK" Можно убрать слово STATIC из описания функции, а также в тело MAIN добавить контроль ,что дейстительно программа использует терминал gtWVT ? hb_gtversion() // = "WVT" в gtWIN - NOTIFIER не работает
|
|
|
|
| |
Пост N: 9
Зарегистрирован: 14.09.11
|
|
Отправлено: 20.11.11 14:02. Заголовок: проверил ? hb_gtver..
проверил ? hb_gtversion() - возвращает WVT STATIC убрал, хотя не должно бы мешать. Попробую скачать новую версию Harbour, но помнится у меня и на Harbour 2 не работало. Я тогда эту затею отложил, но заказчики привыкли закрывать крестом вместо меню "выход "
|
|
|
|
| |
Пост N: 2203
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.11.11 14:45. Заголовок: как вариант hb_GtInf..
как вариант hb_GtInfo( HB_GTI_CLOSABLE, .f. )
|
|
|
|
| |
Пост N: 10
Зарегистрирован: 14.09.11
|
|
Отправлено: 20.11.11 15:07. Заголовок: У меня этот параметр..
У меня этот параметр так и установлен в 'False' Hb_GtInfo( HB_GTI_CLOSABLE, .F. ) но тянутся то пользователи к крестику!
|
|
|
|
| |
Пост N: 11
Зарегистрирован: 14.09.11
|
|
Отправлено: 20.11.11 15:52. Заголовок: Скачал ночную сборку..
Скачал ночную сборку Harbour 3.1 компилирую: строка в bat-файле c:\hb31\bin\hbmk2 %1 -Lc:\hb30\lib\win\mingw -iC:\hb30\Include не помогло. ???
|
|
|
|
| |
Пост N: 2204
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.11.11 16:15. Заголовок: Vladimir_K пишет: ..
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
|
|
|
|
| |
Пост N: 2205
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.11.11 16:42. Заголовок: Попробуй так (у меня..
Попробуй так (у меня заработало) 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
|
|
|
|
| |
Пост N: 12
Зарегистрирован: 14.09.11
|
|
Отправлено: 20.11.11 16:50. Заголовок: А у меня в любом слу..
А у меня в любом случае если нажатие на крест - моментально закрывается как при Alt-C CloseX ниразу не сработала
|
|
|
|
| |
Пост N: 2206
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.11.11 16:52. Заголовок: Vladimir_K я собра..
Vladimir_K я собрал прогу так а Вы ? hbmk2 test -gtwvt PS BCC55
|
|
|
|
|
| |
Пост N: 13
Зарегистрирован: 14.09.11
|
|
Отправлено: 20.11.11 16:59. Заголовок: FUNCTION Main() #inc..
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 ) } )
|
|
|
|
| |
Пост N: 2207
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.11.11 17:02. Заголовок: Vladimir_K пишет: ..
Vladimir_K пишет: А если пробнуть BCC а не MINGW
|
|
|
|
| |
Пост N: 14
Зарегистрирован: 14.09.11
|
|
Отправлено: 20.11.11 17:09. Заголовок: также c:\hb31 ..
также c:\hb31\bin\hbmk2 clos.prg -gtwvt Я подозреваю что не работает из-за того, что транслятор не Борландовский Попробуйте minGW (я ВСС никогда не пользовался)
|
|
|
|
| |
Пост N: 2208
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.11.11 17:42. Заголовок: Vladimir_K пишет: ..
Vladimir_K пишет: Прибил я его и давно.
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 20.11.11 17:54. Заголовок: крестик
Цитата из 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) ...
|
|
|
|
| |
Пост N: 15
Зарегистрирован: 14.09.11
|
|
Отправлено: 20.11.11 17:56. Заголовок: Скачаю ВСС и попробу..
Скачаю ВСС и попробую А почему minGW не подходит?
|
|
|
|
| |
Пост N: 16
Зарегистрирован: 14.09.11
|
|
Отправлено: 20.11.11 18:06. Заголовок: Петр 707 1)Цитата и..
Петр 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
|
|
|
|
| |
Пост N: 2209
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.11.11 18:27. Заголовок: Проверил в Mingw , д..
Проверил в Mingw , да не работает.
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 20.11.11 18:28. Заголовок: Ответ на ответ
Э-э... Цитата: это же тэстовая програмка То есть - должна работать иначе, чем нетестовая?!.. Сильно Нагруженный процесс просто не даст системе отработать нажатие на крестик. Все ресурсы уйдут на цикл while .t. ; end 2) Что-то с логикой не так. Цитата:"..я бы увидел сообщение Alert( 'Close Application',{'OK','NO'}) " Фишка в том, что может и увидел бы, но не всегда, а только в случае "if nEvent == HB_GTE_CLOSE"
|
|
|
|
| |
Пост N: 17
Зарегистрирован: 14.09.11
|
|
Отправлено: 20.11.11 19:00. Заголовок: я предполагал, что э..
я предполагал, что этой строкой HB_GtInfo( HB_GTI_NOTIFIERBLOCK, { |nEvent| CloseX( nEvent ) } ) запускаю слушатель события Harbour GT callback events терминала - 'нажатиe на крест' при нажатии выполняется eval({ |nEvent| CloseX( nEvent ) }) Выполняется CloseX( nEvent ) - и выходим по своему сценарию А этот тест - минимум для проверки. Поправте, если чего не так.
|
|
|
|
|
| |
Пост N: 2210
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.11.11 19:05. Заголовок: Vladimir_K я ведь ..
Vladimir_K я ведь писал выше что не работает в Mingw (проверил).
|
|
|
|
| |
Пост N: 18
Зарегистрирован: 14.09.11
|
|
Отправлено: 20.11.11 19:23. Заголовок: Спасибо, Дима, я кон..
Спасибо, Дима, я конечно же прочитал, что не работает в MinGW. Это я уже по инерции делюсь мыслями. Ну чтоже, подождем когда будет работать в MinGW. Спасибо всем за помощь.
|
|
|
|
| постоянный участник
|
Пост N: 612
Зарегистрирован: 27.01.07
|
|
Отправлено: 21.11.11 13:23. Заголовок: Что-то про это: 2010..
Что-то про это: цитата: | 2010-05-15 15:17 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * src/rtl/gtwvt/gtwvt.c - Deleted notifierblock/fireevent support. Light is green to add threaded screen refresh and event handling. This could enhance performance and fix the frozen screen refresh in Harbour app loops. ; INCOMPATIBLE: Switch to HB_INKEY_GTEVENT + HB_K_* solution. |
| В папке с примерами есть wvtext.prg
|
|
|
|
| |
Пост N: 19
Зарегистрирован: 14.09.11
|
|
Отправлено: 21.11.11 20:10. Заголовок: Да, сначала было так..
Да, сначала было так 2008-06-25 11:49 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) Please use HB_GTI_CLOSABLE and HB_GTI_NOTIFIERBLOCK to control GUI window close behavior. теперь 2010-05-15 15:17 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * src/rtl/gtwvt/gtwvt.c - Deleted notifierblock/fireevent support. Light is green to add threaded screen refresh and event handling. This could enhance performance and fix the frozen screen refresh in Harbour app loops. ; INCOMPATIBLE: Switch to HB_INKEY_GTEVENT + HB_K_* solution. это фрагмент из src/rtl/gtwvt/gtwvt.c ----------------------------------- case WM_CLOSE: /* Clicked 'X' on system menu */ if( pWVT->bClosable ) { PHB_ITEM pItem = hb_itemPutL( NULL, HB_TRUE ); hb_setSetItem( HB_SET_CANCEL, pItem ); hb_itemRelease( pItem ); hb_vmRequestCancel(); } else hb_gt_wvt_AddCharToInputQueue( pWVT, HB_K_CLOSE ); ------------------------------------- т.е. если ! ( pWVT->bClosable ) то идентификатор события = HB_K_CLOSE ------------------------------------------------------ Вобщем, чтобы закрыть по нажатию креста надо в цикле главного меню использовать условие из этого переделанного (рабочего) теста FUNCTION Main() #include "hbgtinfo.ch" #include "inkey.ch" REQUEST HB_GT_WVT_DEFAULT REQUEST HB_GT_WVT Hb_GtInfo( HB_GTI_CLOSABLE, .F. ) Set( _SET_EVENTMASK, INKEY_ALL ) MSETCURSOR( .T. ) CLS Alert( 'Start Application' ) ? 'To close by a cross' while .t. if Inkey( 0.1, 254 + HB_INKEY_GTEVENT ) == HB_K_CLOSE.and.; Alert( "Close Application", { "YES", "NO" } ) == 1 QUIT endif end RETURN NIL ---------------------- Может можно сделать лучше(перехватить нажатие в любом месте), но нужны более глубокие знания Всем спасибо за участие
|
|
|
|
| постоянный участник
|
Пост N: 613
Зарегистрирован: 27.01.07
|
|
Отправлено: 24.11.11 10:36. Заголовок: Могу предложить тако..
Могу предложить такой вариант: используем SetKey(). Так как функция Inkey() не обрабатывает горячие клавиши, установленные SetKey(), то нужно вместо нее использовать заменитель - InkeyEval(). Для GET-ов ReadModal сам проверяет горячие клавиши. Еще очень интересная вещь - HB_GTI_INKEYFILTER (в коде - закомментировано). Можно подменять код любой клавиши (или GT-события) на другой на уровне терминала. #include "hbgtinfo.ch" #include "inkey.ch" #include "common.ch" FUNCTION Main() REQUEST HB_GT_WVT_DEFAULT REQUEST HB_GT_WVT Hb_GtInfo( HB_GTI_CLOSABLE, .F. ) Set( _SET_EVENTMASK, INKEY_KEYBOARD + HB_INKEY_GTEVENT ) SetKey( HB_K_CLOSE, { | cProc, nLine, cVar | CloseX( cProc, nLine, cVar ) } ) //hb_gtInfo( HB_GTI_INKEYFILTER, { | nKey | // SWITCH nKey // CASE HB_K_CLOSE // RETURN K_ALT_X // ENDSWITCH // RETURN nKey // } ) CLS ? HB_GTVersion() ? "Press Esc or Cross to exit" WHILE .T. n := InkeyEval( 0 ) IF n == K_ESC HB_SetKeyCheck( HB_K_CLOSE ) // or CloseX() ELSE ? n END // IF END RETURN NIL FUNCTION CloseX( cProc, nLine, cVar ) CLEAR TYPEAHEAD IF Alert( "Close application?", { "Yes", "No" } ) == 2 RETURN NIL ELSE CLOSE ALL QUIT ENDIF RETURN NIL FUNCTION InkeyEval( nSecs ) LOCAL nKey LOCAL nStart := Seconds() LOCAL bKeyBlock WHILE .T. nKey := Inkey() HB_ReleaseCPU() IF ISNIL( nSecs ) EXIT END // IF IF ( bKeyBlock := SetKey( nKey ) ) <> NIL EVal( bKeyBlock, PROCNAME( 2 ), PROCLINE( 2 ) ) nStart := Seconds() LOOP END // IF IF ( nSecs <> 0 .and. ( Seconds() - nStart > nSecs ) ) .or. ; ( nSecs == 0 .and. nKey <> 0 ) EXIT END // IF END // WHILE RETURN nKey
|
|
|
|
| |
Пост N: 20
Зарегистрирован: 14.09.11
|
|
Отправлено: 24.11.11 17:56. Заголовок: PSP, СПАСИБО за пом..
PSP, СПАСИБО за помощь, то что надо. Уменя главное меню на PROMPT MENU TO использовал это: Set( _SET_EVENTMASK, HB_INKEY_GTEVENT + INKEY_ALL ) SetKey( HB_K_CLOSE, { || CloseX() } ) *----------------------------------------- FUNCTION CloseX() CLEAR TYPEAHEAD IF Alert( "Close application?", { "Yes", "No" } ) == 2 RETURN 1 ELSE CLOSE ALL QUIT ENDIF RETURN NIL *----------------------- Вставил в рабочую программу - срабатывает нормально.
|
|
|
|
| постоянный участник
|
Пост N: 614
Зарегистрирован: 27.01.07
|
|
Отправлено: 24.11.11 18:13. Заголовок: Vladimir_K , рад, чт..
Vladimir_K , рад, что пригодилось PS. Этот код будет работать при нажатии на крест не только в MENU TO, но и в момент ввода данных в поле GET. Это нужно учитывать.
|
|
|
|
| |
Пост N: 21
Зарегистрирован: 14.09.11
|
|
Отправлено: 25.11.11 14:27. Заголовок: я включаю Set( _SET_..
я включаю Set( _SET_EVENTMASK, HB_INKEY_GTEVENT + INKEY_ALL ) только перед главным bar меню, а после выбора пункта в pop_up меню - Set( _SET_EVENTMASK, INKEY_ALL ) Т.е. чтобы выйти по кресту - надо закрыть окна и вернуться в bar или pop_up главного меню. Мне так и надо было. PSP, спасибо за реальную помощь.
|
|
|
Ответов - 29
, стр:
1
2
All
[только новые]
|
|