:: Visual Foxpro, Foxpro for DOS
Как использовать горячие клавиши на форме
shumik73
Автор

Сообщений: 565
Откуда: Алматы
Дата регистрации: 10.05.2006
Добрый день всем!

Всем знакомо системное меню Foxpro
Его можно отключить "SET SYSMENU ON" или включить "SET SYSMENU OFF" в момент исполнения
Можно ограниченно выбрать несколько PUPUP: "SET SYSMENU TO _MFILE, _MWINDOW"
Можно вернуть на исходную "SET SYSMENU TO DEFAULT"
Системное меню отображает функционал самого foxpro
Полный набор из чего состоит можно найти тут help.foxclub.ru

Просканировать запущенное меню можно по PAD и BAR следующим способом:

FOR gnCount = 1 TO CNTPAD('_msysmenu')
IF PRMPAD('_msysmenu', GETPAD('_msysmenu', gnCount)) # 'Edit'
? GETPAD('_msysmenu', gnCount)
ENDIF
ENDFOR
? CNTBAR("_MFILE")
? PRMBAR('popDemo', GETBAR('popDemo',1))



Для работы своей прикладной программы системное меню отключается "SET SYSMENU TO"
А вместо него формируется свое меню:
  • В котором для системнного меню "_MSYSMENU"
  • Создаются список PAD-ов "_77c0p5q2l",...... (горизонтальное меню)
  • А каждый из PAD-ов сформирует свой выпадающий POPUP
  • А каждый из POPUP-ов сформирует свой набор BAR

    Сформировать меню можно как свой PRG или сгенерить MPR.
    В меню закладываются

    1) Элементы работы с текстом
    8DEFINE POPUP _medit MARGIN RELATIVE SHADOW COLOR SCHEME 4
    DEFINE BAR _med_copy OF _medit PROMPT "Копировать" KEY CTRL+C, "Ctrl+C" PICTURE "ico-191-2.bmp" MESSAGE "Скопировать в буфер"
    DEFINE BAR _med_paste OF _medit PROMPT "Вставить" KEY CTRL+V, "Ctrl+V" PICTURE "ico-192-2.bmp" MESSAGE "Вставить из буфера"
    DEFINE BAR _med_cut OF _medit PROMPT "Вырезать" KEY CTRL+X, "Ctrl+X" PICTURE "ico-190-2.bmp" MESSAGE "Переместить в буфер"
    DEFINE BAR _med_slcta OF _medit PROMPT "Выделить всё" KEY CTRL+A, "Ctrl+A" PICTURE "ico-166-2.bmp" MESSAGE "Выделить всё"
    2) Элементы работы с функция на форме
    DEFINE BAR 5 OF _medit PROMPT "\-"
    DEFINE BAR 9 OF _medit PROMPT "Фильтр" KEY CTRL+R, "CTRL+R" SKIP FOR ..... PICTURE .....
    DEFINE BAR 10 OF _medit PROMPT "Поиск" KEY CTRL+F, "CTRL+F" SKIP FOR ..... PICTURE .....
    DEFINE BAR 12 OF _medit PROMPT "Создать" KEY CTRL+N, "CTRL+N" SKIP FOR ..... PICTURE .....
    DEFINE BAR 13 OF _medit PROMPT "Открыть" KEY CTRL+O, "CTRL+O" SKIP FOR ..... PICTURE .....
    DEFINE BAR 14 OF _medit PROMPT "Удалить" KEY CTRL+DEL,"CTRL+DEL" SKIP FOR ..... PICTURE .....
    DEFINE BAR 15 OF _medit PROMPT "\-"
    DEFINE BAR 16 OF _medit PROMPT "Печать" KEY CTRL+P, "CTRL+P" SKIP FOR ..... PICTURE .....
    DEFINE BAR 17 OF _medit PROMPT "Экспорт" KEY CTRL+E, "CTRL+E" SKIP FOR ..... PICTURE .....
    3) Меню - функционал программы

    Запущенное меню выполняет ряд задач:
  • Вызов формы из элемента меню
  • Проверку доступности\активности перед тем как запустить форму - SKIP FOR
  • Назначение горячей клавиши KEY CTRL+?

    Когда при запуске такого универсального меню - я получал и функционал, и проверку доступа и горячие клавиши


    Сложность в том что меню в foxpro можно запустить только в формах верхнего уровня (Top-Level-Form)
    То есть меню предназначено для "материнских" окон - точнее _screen или для формы с oForm.ShowWindow="Top-Level-Form"
    А вот создать меню в "дочерней" форме внутри твоей программы - нельзя, или приходится создовать самописное меню из кнопок


    Если создал пользовательское меню - как быть с вызовом горячих клавиш?
    В системном меню это решало само меню "KEY CTRL+?", при этом нажатие клавиш исполнялось с условием SKIP FOR ?
    Это было равносильно "ON KEY LABEL KeyLabel ACTIVATE POPUP MenuName" - то есть горячие клавиши пытались нажать на пункт в меню если есть возможность
    Условие вызова пункта меню можно исправить "SET SKIP OF MENU MenuBarName1 lExpression1" или даже отключить
    Но как вызывать горячую клавишу без системного меню?

    Если системное меню отключено - то уже горячие клавиши не работают
    Как отказаться от системного меню, но при этом реализовать ON KEY LABEL Ctrl+P но с проверкой SKIP FOR на конкретно выбранной форме ?




    Исправлено 2 раз(а). Последнее : shumik73, 10.06.25 12:04
    Ratings: 0 negative/0 positive
  • Re: Как использовать горячие клавиши на форме
    alex;

    Сообщений: 3641
    Откуда: Москва
    Дата регистрации: 23.11.2004
    shumik73
    Но как вызывать горячую клавишу без системного меню?

    Так то событие KeyPress?
    Ratings: 0 negative/0 positive
    Re: Как использовать горячие клавиши на форме
    sphinx

    Сообщений: 32141
    Откуда: Екатеринбург
    Дата регистрации: 22.11.2006
    KeyPress завязана на объектах, сдается, что для задачи Евгения не прикрутить.

    Сам такой проблемой не озадачивался, но может посмотреть в сторону
    WM_KEYDOWN и WM_KEYUP, их прикрутить к BindEvent.

    Идею подсмотрел здесь: www.tek-tips.com


    ------------------
    "Veni, vidi, vici!"(с)
    Ratings: 0 negative/0 positive
    Re: Как использовать горячие клавиши на форме
    alex;

    Сообщений: 3641
    Откуда: Москва
    Дата регистрации: 23.11.2004
    sphinx
    KeyPress завязана на объектах

    Вроде, свойство KeyPreview решает привязку события KeyPress к объектам.
    Ratings: 0 negative/0 positive
    Re: Как использовать горячие клавиши на форме
    Владимир Максимов

    Сообщений: 14165
    Откуда: Москва
    Дата регистрации: 02.09.2000
    Вот так попробуй

    DEFINE ... ;
    ... SKIP FOR TYPE("_SCREEN.ActiveForm") <> "O" ; && нет активной формы
    OR PEMStatus(_SCREEN.ActiveForm,'MyMethod',5) = .F. ; && у активной формы нет свойство/метод/событие с именем MyMethod
    OR _SCREEN.ActiveForm.MyMethod() && результат выполнение метода активной формы

    Условия через ИЛИ, чтобы, например, если активной формы нет или нет метода на форме, то пункт меню был недоступен
    Ratings: 0 negative/0 positive
    Re: Как использовать горячие клавиши на форме
    Владимир Максимов

    Сообщений: 14165
    Откуда: Москва
    Дата регистрации: 02.09.2000
    shumik73
    Если создал пользовательское меню - как быть с вызовом горячих клавиш?

    Точно также. А в чем проблема?

    Хм... А как вообще приложение-то организовано? Обычно все-таки есть "основное окно". Это либо _SCREEN или Top-Level Form и все пользовательские формы "живут" внутри него. И для них меню просто не нужно. Меню "общее" для всех форм

    PS: А, понятно. Нужно нажатие горячих клавиш по условию.

    Но можно по другому сформулировать задачу: Выполнить действие по условию.

    Т.е. сам вызов действия всегда, но внутри этого действия, проверка условий. Если условия не выполняются - ничего не делать



    Исправлено 1 раз(а). Последнее : Владимир Максимов, 10.06.25 17:52
    Ratings: 0 negative/0 positive
    Re: Как использовать горячие клавиши на форме
    Владимир Максимов

    Сообщений: 14165
    Откуда: Москва
    Дата регистрации: 02.09.2000
    Сама постановка вопроса вводит в заблуждение

    Вопрос формулируется так

    Необходимо по нажатию горячих клавиш на форме выполнить некое действие. Но! Это выполнение должно быть выполнено только при соблюдении определенных условий (по данным на форме)

    При этом использование пунктов меню с KEY и SKIP FOR - невозможно

    1. "Условия на форме" - в общем случае, это вызов метода формы. Поскольку форма, очевидно, является активной в момент нажатия горячих клавиш, то это вызов _SCREEN.ActiveForm.MyMethod(). Этот метод определяет можно или нельзя выполнять действия по горячим клавишам

    2. "Выполнить действия" - в общем случае, это тоже вызов некоего метода. Вот в этом методе и можно перед его выполнением, проверить, что вернет метод активной формы. Можно имя метода передать как параметр

    В результате, это все тот же ON KEY LABEL. Просто первой командой в вызванном методе будет проверка допустимости выполнения
    Ratings: 0 negative/1 positive
    Re: Как использовать горячие клавиши на форме
    shumik73
    Автор

    Сообщений: 565
    Откуда: Алматы
    Дата регистрации: 10.05.2006
    Владимир Максимов
    Обычно все-таки есть "основное окно". Это либо _SCREEN или Top-Level Form и все пользовательские формы "живут" внутри него. И для них меню просто не нужно. Меню "общее" для всех форм

    Обычно есть материнское окно, в нем одно меню. Все по классике
    А если материнское окно - это рабочий стол, а формам нужно свое меню - то получится необычно

    [attachment 37193 333.png]

    Решил в KeyPress()

    LPARAMETERS oThisform,nKeyCode,nShiftAltCtrl
    *+-------------------------------------------+
    *| Поиск подменю "_medit" |
    *+------------------------------------------+
    LOCAL Tmp_Flag_Menu,nCount
    IF EMPTY(CNTPAD('_msysmenu')) &&Если нет системеного меню - то списка сервичный функций нет
    Tmp_Flag_Menu=.F.
    ELSE
    Tmp_Flag_Menu=.F.
    FOR nCount = 1 TO CNTPAD('_msysmenu')
    *?PRMPAD('_msysmenu',GETPAD('_msysmenu', nCount)) - имя заголовка меню
    IF GETPAD('_msysmenu', nCount)="_MSM_EDIT"
    Tmp_Flag_Menu=.T.
    ENDIF
    ENDFOR
    ENDIF
    *+--------------------------------------------------+
    *| Если подменю нет - отработаем горячие клавиши |
    *+--------------------------------------------------+
    DO CASE
    CASE Tmp_Flag_Menu=.T.
    ***пропускаем - перехватит в системном меню***
    CASE nKeyCode=18 AND nShiftAltCtrl=2 AND oApp.Get_Menu(oThisform,"Filter")
    oThisform._Btn_Filter1.Click()
    CASE nKeyCode=6 AND nShiftAltCtrl=2 AND oApp.Get_Menu(oThisform,"Find")
    oThisform._Btn_Find1.Click()
    CASE nKeyCode=14 AND nShiftAltCtrl=2 AND oApp.Get_Menu(oThisform,"New")
    oThisform._Btn_New1.Click()
    CASE nKeyCode=15 AND nShiftAltCtrl=2 AND oApp.Get_Menu(oThisform,"Open")
    oThisform._Btn_Open1.Click()
    CASE nKeyCode=147 AND nShiftAltCtrl=2 AND oApp.Get_Menu(oThisform,"Delete")
    oThisform._Btn_delete1.Click()
    CASE nKeyCode=16 AND nShiftAltCtrl=2 AND oApp.Get_Menu(oThisform,"Print")
    oThisform._Btn_print1.Click()
    CASE nKeyCode=5 AND nShiftAltCtrl=2 AND oApp.Get_Menu(oThisform,"ExpImp")
    oThisform._Btn_expimp1.Click()
    CASE nKeyCode=12 AND nShiftAltCtrl=2 AND oApp.Get_Menu(oThisform,"Link")
    oThisform._btn_link1.Click()
    CASE nKeyCode=98 AND nShiftAltCtrl=2 AND oApp.Get_Menu(oThisform,"Refresh")
    oThisform._Btn_refresh1.Click()
    ENDCASE

    Я вообще системное меню отключил БЫ - чтобы не видеть эту белую полоску.
    Но вот проблема - формы перестают встраиваться.
    После развертки формы на весь экран - кнопки формы "улетают" в строку меню. А тут "улетать" некуда

    [attachment 37194 444.png]



    Исправлено 2 раз(а). Последнее : shumik73, 11.06.25 13:54
    Ratings: 0 negative/0 positive
    Re: Как использовать горячие клавиши на форме
    PaulWist

    Сообщений: 14779
    Дата регистрации: 01.04.2004
    Почему в готовом EXE не работает копирование по Ctrl+C, Ctrl+V


    ------------------
    Есть многое на свете, друг Горацио...
    Что и не снилось нашим мудрецам.
    (В.Шекспир Гамлет)
    Ratings: 0 negative/0 positive


    Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

    On-line: 33 alex;  (Гостей: 32)

    © 2000-2025 Fox Club 
    Яндекс.Метрика