Перейти к содержанию
Fire Monkey от А до Я
  • 0

Обработка клавиатуры


Александр Урванцев

Вопрос

Здравствуйте, извините если не туда пишу, первый раз здесь
Проблема такая, пишется прога в Multi-Device Application
сделал обработчик нажатия на пробел, запускаю на винде, просто на нажатие на пробел не реагирует, если нажать ctrl + пробел, то приложение реагирует на пробел
также при проверке вообще на нажатия на клавиатуру и вывод Key, выводит Key только у alt, shift, F1 и тд, ctrl и некоторых других системных клавишь, в остальных случаях выводит 0
как это исправить?
извините если криво написал

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
13 минут назад, krapotkin сказал:

информация для размышления

asdf<пробел>fgt<F1><F2><F3>

QIP Shot - Screen 091.png

ну так я про это и говорю
почему 0 у пробела, когда должно быть 32?
а если нажать сначала ctrl и удерживая его нажать пробел, то у меня key будет равняться сначала 17 потому что нажат ctrl, а потом 32

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

Изменено пользователем Александр Урванцев
Ссылка на комментарий
  • 0

блин, для цифробуквенных символов, тех, что отображаются в Edit, ответ в ord(keychar) = 32

для всех остальных - в Key

а чтобы узнать нажат ли ctrl, есть shift

таким образом

if (keychar = ' ') and (ssCtrl in shift) then

спасет ОРД.

Изменено пользователем krapotkin
Ссылка на комментарий
  • 0
27 минут назад, krapotkin сказал:

блин, для цифробуквенных символов, тех, что отображаются в Edit, ответ в ord(keychar) = 32

для всех остальных - в Key

а чтобы узнать нажат ли ctrl, есть shift

таким образом

if (keychar = ' ') and (ssCtrl in shift) then

спасет ОРД.

У меня onkeydown относится к самой форме, я пишу if Key = 32 then, это правильно?

Ссылка на комментарий
  • 0

нет в данном случае ОРД это отец русской демократии )))
я же написал код, что еще?

if (keychar = ' ')  then

Изменено пользователем krapotkin
Ссылка на комментарий
  • 0

См. документацию источник знаний: KeyDown или TKeyEvent

Key это скан код клавиши приведенный к виртуальным кодам клавиш windows. Это значение получается когда нажато некоторое сочетание клавиш к примеру Ctrl+<пробел>, такие нажатия последовательно передаются всем контролам, пока один из них не обработает его и не сбросит в 0. За некоторыми исключениями эти значения определяются физическим расположением клавиш, т. е. английская клавиша <A> будет всегда располагаться приблизительно в одном и том же месте и на Mac и на Win и в России и в Гондурасе.

Keychar это введенная буква. Т.е. обычная буква которая вводится при наборе текста зависит от платформы, языка, выбранной раскладки способа ввода и прочих параметров. Такие нажатия передаются только фокусному контролу.

Так что для Ctrl+<пробел> надо использовать проверку if (Key =  vkSpace) and (ssCtrl in shift).
Для проверки нажатия Ctrl+Ф надо использовать проверку if (Key =  vkA) and (ssCtrl in shift) и ни каких Key = Ord('Ф') потому, что неизвестно какая на этом месте будет буква на каком-нибудь Mac из Японии. И более того 

Key = Ord('Ф') = $D4 - это зарезервированный код клавиши
Key = Ord('ф') = $F4 - это VK_OEM_ENLW (Only used by Nokia)
Key = Ord('a') = $61 - это vkNumpad1 (1 key numeric keypad)

Но проще было бы создать действие (см. TActionList и TAction), назначить на него ShortCut выбрав одно из рекомендованных значений.

Ссылка на комментарий
  • 0
6 часов назад, krapotkin сказал:

нет в данном случае ОРД это отец русской демократии )))
я же написал код, что еще?

if (keychar = ' ')  then

не работает

Ссылка на комментарий
  • 0
5 часов назад, RoschinSpb сказал:

См. документацию источник знаний: KeyDown или TKeyEvent

Key это скан код клавиши приведенный к виртуальным кодам клавиш windows. Это значение получается когда нажато некоторое сочетание клавиш к примеру Ctrl+<пробел>, такие нажатия последовательно передаются всем контролам, пока один из них не обработает его и не сбросит в 0. За некоторыми исключениями эти значения определяются физическим расположением клавиш, т. е. английская клавиша <A> будет всегда располагаться приблизительно в одном и том же месте и на Mac и на Win и в России и в Гондурасе.

Keychar это введенная буква. Т.е. обычная буква которая вводится при наборе текста зависит от платформы, языка, выбранной раскладки способа ввода и прочих параметров. Такие нажатия передаются только фокусному контролу.

Так что для Ctrl+<пробел> надо использовать проверку if (Key =  vkSpace) and (ssCtrl in shift).
Для проверки нажатия Ctrl+Ф надо использовать проверку if (Key =  vkA) and (ssCtrl in shift) и ни каких Key = Ord('Ф') потому, что неизвестно какая на этом месте будет буква на каком-нибудь Mac из Японии. И более того 

Key = Ord('Ф') = $D4 - это зарезервированный код клавиши
Key = Ord('ф') = $F4 - это VK_OEM_ENLW (Only used by Nokia)
Key = Ord('a') = $61 - это vkNumpad1 (1 key numeric keypad)

Но проще было бы создать действие (см. TActionList и TAction), назначить на него ShortCut выбрав одно из рекомендованных значений.

мне не нужно ctrl + пробел
мне нужно, чтобы реагировало именно на пробел

Ссылка на комментарий
  • 0

P.S. Отец Русской Демократии оно же функция Ord в коде обработки клавиш не нужны. Key сравниваете с константой vkXXX, KeyChar c буквой в апострофах, или #32 (решетка + код символа).

Да и кстати, для мобильных экранных клавиатур такая обработка клавиш работать не будет.

Ссылка на комментарий
  • 0
12 часов назад, RoschinSpb сказал:

P.S. Отец Русской Демократии оно же функция Ord в коде обработки клавиш не нужны. Key сравниваете с константой vkXXX, KeyChar c буквой в апострофах, или #32 (решетка + код символа).

Да и кстати, для мобильных экранных клавиатур такая обработка клавиш работать не будет.

а на будущее как для мобильных экранных клавиатур поступать?

Ссылка на комментарий
  • 0
16 часов назад, Александр Урванцев сказал:

а на будущее как для мобильных экранных клавиатур поступать?

Моя рекомендация такая: стройте своё приложение таким образом, чтобы избежать обработки нажатий на клавиши. Если Вы не собираетесь создавать свой собственный текстовый редактор, то для подавляющего числа случаев вполне годится обработка горячих клавиш с использованием TActionList, в противном случае изучайте исходники, смотрите какие нужно реализовывать интерфейсы и ... "Безумству храбрых поём мы песню!"

Ссылка на комментарий
  • 0
В 16.02.2017 в 15:19, RoschinSpb сказал:

Моя рекомендация такая: стройте своё приложение таким образом, чтобы избежать обработки нажатий на клавиши. Если Вы не собираетесь создавать свой собственный текстовый редактор, то для подавляющего числа случаев вполне годится обработка горячих клавиш с использованием TActionList, в противном случае изучайте исходники, смотрите какие нужно реализовывать интерфейсы и ... "Безумству храбрых поём мы песню!"

А как решить проблему на андроид ТВ-приставках (тема уже дважды поднималась на форуме, но решения нет) - приложения Дельфи не реагируют на нажатие кнопки Ок с пульта управления (Инфракрасный пульт), на цифро-буквенные, меню, назад реагируют нормально. Товарищ по моей просьбе написал приложение на андроид студии, форма с кнопкой (фокус на кнопке), при нажатии выводится сообщение "Кнопка нажата" - на тв-приставки с пульта кнопка прекрасно нажимается. Аналогичное приложение на Дельфи (Berlin Update 2) никак не реагирует. 

Из за этой проблемы путь на тв-приставки приложениям на Дельфи закрыт :-(

Изменено пользователем Евгений Корепов
Ссылка на комментарий
  • 0
В 18.02.2017 в 15:41, Евгений Корепов сказал:

А как решить проблему на андроид ТВ-приставках (тема уже дважды поднималась на форуме, но решения нет) - приложения Дельфи не реагируют на нажатие кнопки Ок с пульта управления (Инфракрасный пульт), на цифро-буквенные, меню, назад реагируют нормально. Товарищ по моей просьбе написал приложение на андроид студии, форма с кнопкой (фокус на кнопке), при нажатии выводится сообщение "Кнопка нажата" - на тв-приставки с пульта кнопка прекрасно нажимается. Аналогичное приложение на Дельфи (Berlin Update 2) никак не реагирует. 

Из за этой проблемы путь на тв-приставки приложениям на Дельфи закрыт :-(

Ну, тогда только: https://quality.embarcadero.com/secure/Dashboard.jspa

Ссылка на комментарий
  • 0
15 часов назад, RoschinSpb сказал:

Создал https://quality.embarcadero.com/browse/RSP-16910 . Правда мой английский не позволяет свободно описать проблему, надеюсь переводчик гугл справился с задачей более-менее сносно :-)

Ссылка на комментарий
  • 0
2 часа назад, Евгений Корепов сказал:

надеюсь переводчик гугл справился с задачей более-менее сносно :-)

Яндекс переводчик вроде как по-лучше с этим справляется :o)

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...