On-line: alkresin, PSP, гостей 0. Всего: 2 [подробнее..]
АвторСообщение





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


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 29 , стр: 1 2 All [только новые]







Пост 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 ) - и выходим по своему сценарию
А этот тест - минимум для проверки.
Поправте, если чего не так.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2210
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.11.11 19:05. Заголовок: Vladimir_K я ведь ..


Vladimir_K
я ведь писал выше что не работает в Mingw (проверил).

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 18
Зарегистрирован: 14.09.11
ссылка на сообщение  Отправлено: 20.11.11 19:23. Заголовок: Спасибо, Дима, я кон..


Спасибо, Дима, я конечно же прочитал, что не работает в MinGW.
Это я уже по инерции делюсь мыслями.
Ну чтоже, подождем когда будет работать в MinGW.
Спасибо всем за помощь.

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


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


Спасибо: 0 
ПрофильЦитата Ответить





Пост 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
----------------------
Может можно сделать лучше(перехватить нажатие в любом месте), но нужны более глубокие знания
Всем спасибо за участие

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


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


Спасибо: 0 
ПрофильЦитата Ответить





Пост 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
*-----------------------
Вставил в рабочую программу - срабатывает нормально.


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


Пост N: 614
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 24.11.11 18:13. Заголовок: Vladimir_K , рад, чт..


Vladimir_K , рад, что пригодилось
PS. Этот код будет работать при нажатии на крест не только в MENU TO, но и в момент ввода данных в поле GET. Это нужно учитывать.

Спасибо: 0 
ПрофильЦитата Ответить





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

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

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