On-line: PSP, гостей 1. Всего: 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 [только новые]





Не зарегистрирован
Зарегистрирован: 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


Спасибо: 0 
Цитата Ответить





Пост N: 8
Зарегистрирован: 14.09.11
ссылка на сообщение  Отправлено: 20.11.11 11:29. Заголовок: Функция CloseX( nEve..


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

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



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 20.11.11 12:01. Заголовок: крестик


У меня работает - на Harbour 2.x

Тема обсуждалась на форуме, можно сделать поиск по слову "HB_GTI_NOTIFIERBLOCK"

Можно убрать слово STATIC из описания функции,
а также в тело MAIN добавить контроль ,что дейстительно программа использует терминал gtWVT
? hb_gtversion() // = "WVT"

в gtWIN - NOTIFIER не работает


Спасибо: 0 
Цитата Ответить





Пост N: 9
Зарегистрирован: 14.09.11
ссылка на сообщение  Отправлено: 20.11.11 14:02. Заголовок: проверил ? hb_gtver..


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

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




Пост N: 2203
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.11.11 14:45. Заголовок: как вариант hb_GtInf..


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

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





Пост N: 10
Зарегистрирован: 14.09.11
ссылка на сообщение  Отправлено: 20.11.11 15:07. Заголовок: У меня этот параметр..


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

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





Пост 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
не помогло.
???

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




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


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




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


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





Пост N: 12
Зарегистрирован: 14.09.11
ссылка на сообщение  Отправлено: 20.11.11 16:50. Заголовок: А у меня в любом слу..


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

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




Пост N: 2206
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.11.11 16:52. Заголовок: Vladimir_K я собра..


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

PS
BCC55

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





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


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




Пост N: 2207
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.11.11 17:02. Заголовок: Vladimir_K пишет: ..


Vladimir_K пишет:

 цитата:
Не работает


А если пробнуть BCC а не MINGW

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





Пост N: 14
Зарегистрирован: 14.09.11
ссылка на сообщение  Отправлено: 20.11.11 17:09. Заголовок: также c:\hb31 ..


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

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




Пост N: 2208
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.11.11 17:42. Заголовок: Vladimir_K пишет: ..


Vladimir_K пишет:

 цитата:
Попробуйте minGW


Прибил я его и давно.

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



Не зарегистрирован
Зарегистрирован: 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)
...





Спасибо: 0 
Цитата Ответить





Пост N: 15
Зарегистрирован: 14.09.11
ссылка на сообщение  Отправлено: 20.11.11 17:56. Заголовок: Скачаю ВСС и попробу..


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

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





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






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




Пост N: 2209
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.11.11 18:27. Заголовок: Проверил в Mingw , д..


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

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



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 20.11.11 18:28. Заголовок: Ответ на ответ


Э-э... Цитата: это же тэстовая програмка
То есть - должна работать иначе, чем нетестовая?!..

Сильно Нагруженный процесс просто не даст системе отработать нажатие на крестик.
Все ресурсы уйдут на цикл while .t. ; end

2) Что-то с логикой не так.
Цитата:"..я бы увидел сообщение Alert( 'Close Application',{'OK','NO'}) "
Фишка в том, что может и увидел бы, но не всегда, а только в случае "if nEvent == HB_GTE_CLOSE"


Спасибо: 0 
Цитата Ответить





Пост 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 час. Хитов сегодня: 51
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет