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





Пост N: 528
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 05.05.17 22:25. Заголовок: Как закрыть (дополнительное) окно крестиком.


Добрый день.

Для удобства юзеров добавил (отключаемое) окно, в котором параллельно выводится статистика продаж по товару, который просматривается в текущем DBEDIT().

Код такой:Скрытый текст

Все-бы хорошо, но, блин, "не-идеально":

  • Если НЕ ЗАДАТЬ в свойствах вновь создаваемого окна hb_gtInfo(HB_GTI_CLOSABLE ,FALSE), то нажатие на крестик "дополнительного" (detached) окна приводит к вырубанию всей программы, несмотря на то, что ее "основное" окно, разумеется, нельзя закрыть "крестиком".
  • Если задать (как в примере) - то закрыть окно или "срубить" программу нельзя. Поэтому отдельное окно включается/выключается комбинацией, допустим, Ctrl+F7.

    Коряга вышла какая-то, если честно... Конечно, можно повесить на виртуальную кнопку HB_K_CLOSE переназначение на K_CTRL_F7 и точно так-же ловить ее в программе - но как тогда отличить - какой именно "крестик" был нажат - на основном окне или на дополнительном? А если дополнительных окон будет несколько? ...

    Идея с доп. окнами подошла и мне (несложно), и юзерам (удобно и информативно) - но вот "костыль" с Ctrl+F7 мне не нравится...

    Буду признателен за идеи.
    Спасибо.

  • Спасибо: 0 
    ПрофильЦитата Ответить
    Ответов - 14 [только новые]


    администратор




    Пост N: 6408
    Зарегистрирован: 17.05.05
    ссылка на сообщение  Отправлено: 05.05.17 22:48. Заголовок: Sergy пишет: Отправ..


    Sergy пишет:

     цитата:
    Отправлено: Сегодня 22:25. Заголовок: Как закрыть (дополнительное) окно крестиком. - новое!

    Добрый день.


    Доброй ночи скорее всего
    Подумаем.

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




    Пост N: 6409
    Зарегистрирован: 17.05.05
    ссылка на сообщение  Отправлено: 06.05.17 07:39. Заголовок: А зачем доп инфу выв..


    А зачем доп инфу выводить в окне ? Рисуй ее где то рядом , в том же окне.
    Как варик можно пробнуть окна из CT , но это снова окно.

    PS
    Покажи скрин.

    Я имею в виду типа так

    При движении по бровсу инфа вверху меняется

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




    Пост N: 6410
    Зарегистрирован: 17.05.05
    ссылка на сообщение  Отправлено: 06.05.17 08:44. Заголовок: Dima пишет: Как вар..


    Dima пишет:

     цитата:
    Как варик можно пробнуть окна из CT , но это снова окно.


    Окно но не WIN , так что вариант
    Пример: core-master\contrib\hbct\tests\ctwtest.prg

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





    Пост N: 529
    Зарегистрирован: 08.07.06
    ссылка на сообщение  Отправлено: 06.05.17 11:24. Заголовок: Вот такая петрушка: ..


    Вот такая петрушка - быстро и наглядно выводится сезонность товара. Окно со статистикой можно двигать по экрану куда угодно, менять размер и тп. Положение/размер для каждого юзера сохраняется отдельно в его личных настройках - кому как больше нравится.



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


    Пост N: 1453
    Зарегистрирован: 09.10.06
    ссылка на сообщение  Отправлено: 06.05.17 13:06. Заголовок: Sergy пишет: Если Н..


    Sergy пишет:

     цитата:
    Если НЕ ЗАДАТЬ в свойствах вновь создаваемого окна hb_gtInfo(HB_GTI_CLOSABLE ,FALSE), то нажатие на крестик "дополнительного" (detached) окна приводит к вырубанию всей программы, несмотря на то, что ее "основное" окно, разумеется, нельзя закрыть "крестиком".



    А вы не пробовали использовать связку HB_GTI_CLOSEMODE и HB_GTI_WINHANDLE?

    #define HB_GTI_CLOSEMODE 74 /* Close event: 0 terminate application, >=1 generate HB_K_CLOSE, 2 disable close button */

    pGT := hb_gtCreate("WVT")
    hwndA := hb_gtInfo( HB_GTI_WINHANDLE )

    hb_gtInfo(HB_GTI_CLOSABLE , TRUE)
    hb_gtInfo(HB_GTI_CLOSEMODE, 1 )

    и там уже в обработчике HB_K_CLOSE

    hwndB := hb_gtInfo( HB_GTI_WINHANDLE )

    if( hwndB == hwndA ); pGT := NIL
    endif


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





    Пост N: 530
    Зарегистрирован: 08.07.06
    ссылка на сообщение  Отправлено: 06.05.17 13:14. Заголовок: Петр пишет: А вы не..


    Петр пишет:

     цитата:
    А вы не пробовали использовать связку HB_GTI_CLOSEMODE и HB_GTI_WINHANDLE?


    Не пробовал. Поковыряюсь в данном направлении. Спасибо.



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




    Пост N: 6411
    Зарегистрирован: 17.05.05
    ссылка на сообщение  Отправлено: 06.05.17 16:26. Заголовок: Sergy пишет: Поковы..


    Sergy пишет:

     цитата:
    Поковыряюсь в данном направлении


    Отпиши если получилось.

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





    Пост N: 531
    Зарегистрирован: 08.07.06
    ссылка на сообщение  Отправлено: 06.05.17 21:29. Заголовок: Не работает. Когд..


    Не работает.

    Когда фокус переключается на "дополнительное" окно, любые нажатия на любые кнопки не "доходят" до главного окна, в том числе HB_K_CLOSE.

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




    Пост N: 6412
    Зарегистрирован: 17.05.05
    ссылка на сообщение  Отправлено: 06.05.17 21:34. Заголовок: Sergy Если есть жел..


    Sergy
    Если есть желание , накидай простой пример , затестим и подумаем.

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


    Пост N: 1454
    Зарегистрирован: 09.10.06
    ссылка на сообщение  Отправлено: 06.05.17 23:27. Заголовок: Sergy пишет: Не раб..


    Sergy пишет:

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



    В harbour/tests есть хороший пример wvtext.prg, можете посмотреть.
    Вот его урезанная версия

     
    #include "hbgtinfo.ch"
    #include "inkey.ch"

    REQUEST HB_GT_WVT_DEFAULT

    procedure main()

    local pGT
    local kX, k

    Set( _SET_EVENTMASK, HB_INKEY_ALL + HB_INKEY_EXT )

    pGT := hb_gtCreate( 'GTWVT' )
    hb_gtSelect( pGT )

    hb_gtInfo( HB_GTI_CLOSEMODE, 1 )

    ? "Main window, press F10"

    do while .T.
    kX := Inkey( 0 ) ; k := hb_keyStd( kX )

    if k == HB_K_CLOSE
    if Alert( "Close Application", { "Yes", "No" } ) == 1
    quit
    endif
    elseif k == K_F10
    if hb_mtvm()
    hb_threadStart( @thFunc() )
    else
    Alert( "MT mode not available. Rebuild this program with -mt switch and try again." )
    endif
    endif
    enddo

    return

    static procedure thFunc()

    hb_gtReload( hb_gtVersion() )

    hb_gtInfo( HB_GTI_CLOSEMODE, 1 )

    ? "Second window"

    do while .T.
    kX := Inkey( 0 ) ; k := hb_keyStd( kX )

    if k == HB_K_CLOSE
    if Alert( "Close Window", { "Yes", "No" } ) == 1
    exit
    endif
    endif
    enddo

    return


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





    Пост N: 532
    Зарегистрирован: 08.07.06
    ссылка на сообщение  Отправлено: 07.05.17 11:07. Заголовок: Да. Хороший пример. ..


    Да. Хороший пример. Вот на его основе - примерно то, что происходит в моей программе:

    #include "hbgtinfo.ch"  
    #include "inkey.ch"

    REQUEST HB_GT_WVT_DEFAULT

    PROCEDURE main()

    LOCAL pGT,pMain,k

    SET( _SET_EVENTMASK, HB_INKEY_ALL + HB_INKEY_EXT )
    //
    pGT := hb_gtCreate( 'GTWVT' )
    pMain := hb_gtSelect( pGT )
    hb_gtInfo( HB_GTI_CLOSEMODE, 1 )
    hb_gtInfo(HB_GTI_WINTITLE ,"Second window")
    hb_gtInfo(HB_GTI_SETPOS_XY,{600,300})
    SETMODE(15,50)
    //
    hb_gtSelect( pMain )
    hb_gtInfo( HB_GTI_CLOSEMODE, 1 )
    hb_gtInfo(HB_GTI_WINTITLE ,"Main window")
    hb_gtInfo(HB_GTI_SETPOS_XY,{1,1})
    //
    ? "Main window, press any key to show it in second window"
    //
    DO WHILE .T.
    k := hb_keyStd( Inkey( 0 ) )
    //
    IF k == HB_K_CLOSE
    IF Alert( "Close Application", { "Yes", "No" } ) == 1
    QUIT
    ENDIF
    ELSE
    IF k > 256
    // ignore mouse moving
    ELSE
    ? "Key pressed: ("+CHR(k)+")"
    ShowInfo(pGT,k)
    ENDIF
    ENDIF
    ENDDO
    //
    RETURN

    * --------------------------- *
    STATIC FUNC ShowInfo(pGt,nKey)

    STATIC nCnt := 0
    LOCAL pPrev := hb_gtSelect( pGT )
    //
    ? hb_NTOS(++nCnt)+". Key pressed: "+ALLTRIM(STR(nKey))
    hb_gtSelect( pPrev )
    //
    RETURN NIL

    Есть непонятка с местонахождением курсора (почему-то виден в дополнительном окне, а не главном) и потерей фокуса при старте - но это не принципиально в данном случае.
    Можно сделать hb_gtInfo(HB_GTI_SETFOCUS,pGT), где это необходимо (для WVG).

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


    Пост N: 1455
    Зарегистрирован: 09.10.06
    ссылка на сообщение  Отправлено: 07.05.17 22:57. Заголовок: Sergy пишет: пример..


    Sergy пишет:

     цитата:
    примерно то, что происходит в моей программе


    Это больше на клавиатурного шпиона похоже, чем окно статистики

    попытка №2 поток + мьютекс
     
    #include "hbgtinfo.ch"
    #include "inkey.ch"

    REQUEST HB_GT_WVT_DEFAULT

    static s_mtxBuffer

    procedure main()

    local pMain
    local key

    Set( _SET_EVENTMASK, HB_INKEY_ALL + HB_INKEY_EXT )

    s_mtxBuffer := hb_mutexCreate()

    pMain := hb_gtCreate( 'GTWVT' )
    hb_gtSelect( pMain )

    hb_gtInfo( HB_GTI_CLOSEMODE, 1 )
    hb_gtInfo( HB_GTI_WINTITLE, "Main window" )
    ? ">"

    do while .T.
    key := hb_keyStd( Inkey( 0 ) )

    if key == HB_K_CLOSE
    if Alert( "Close Application", { "Yes", "No" } ) == 1
    quit
    endif
    elseif key == K_F10
    if hb_mtvm()
    hb_threadStart( @thFunc() )
    else
    hb_gtAlert( "MT mode not available. Rebuild this program with -mt switch and try again." )
    endif
    else
    if key <= 256
    ? "Key pressed: (" + Chr( key ) + ")"
    hb_mutexNotify( s_mtxBuffer, key )
    endif
    endif
    enddo

    return

    static procedure thFunc()

    thread static nCount := 0
    local nKey, key

    hb_gtReload( hb_gtVersion() )

    hb_gtInfo( HB_GTI_WINTITLE, "Second window" )
    hb_gtInfo( HB_GTI_SETPOS_XY, {600, 300} )
    hb_gtInfo( HB_GTI_CLOSEMODE, 1 )

    ? ">"

    do while .T.
    hb_mutexSubscribe( s_mtxBuffer, 0.1, @nKey )

    if nKey != Nil
    hb_keyPut( nKey )
    endif

    key := hb_keyStd( Inkey( 0.1 ) )

    if key == HB_K_CLOSE
    if hb_gtAlert( "Close Window", { "Yes", "No" } ) == 1
    exit
    endif
    else
    if key == nKey
    ? hb_NtoS( ++nCount ) + ". Key pressed: " + AllTrim( Str( key ) )
    nKey := Nil
    endif
    endif
    enddo

    return


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





    Пост N: 534
    Зарегистрирован: 08.07.06
    ссылка на сообщение  Отправлено: 10.05.17 00:33. Заголовок: Спасибо за новодку, ..


    Спасибо за наводку, но чет как-то получается "из пушки по воробьям". Программа у меня не МТ-шная, поскольку пока не понимаю, где с умом применить многопоточность для складской программы... Но уж точно не для того, чтобы вместо Ctrl+Fx юзер мог нажать крестик...

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





    Пост N: 551
    Зарегистрирован: 08.07.06
    ссылка на сообщение  Отправлено: 07.08.17 17:05. Заголовок: Петр пишет: попытка..


    Петр пишет:

     цитата:
    попытка №2 поток + мьютекс


    В связи с началом использования LetoDBf, программа "как то сама" вдруг "неожиданно" стала многопоточной.
    Попытаюсь осознать и применить "попытку N2".


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

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