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

Windows на сенсорном экране и события мыши


Вадим Смоленский

Вопрос

Разрабатывая свою софтину, о сенсорных экранах я совсем не думал (отстал от прогресса). Но один тестер сейчас погонял текущую сборку на планшете. Оказалось, что почти всё работает хорошо, но в некоторых местах по нажатию пальцем отрабатывается не OnClick и не OnMouseUp, а почему-то OnMouseMove. Прежде чем изобретать велосипед, хочу спросить у знающих людей: а как вообще лучше организовывать работу с мышью/пальцем, чтобы она одинаково хорошо шла в обоих вариантах? Есть ли здесь четкие рекомендации? Вот, например, я вижу событие OnTap: стоит ли задействовать его? Или это только для мобильных платформ?

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

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

  • 0

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

function IsTabletPC: Boolean;
begin
 result:=(GetSystemMetrics(SM_TABLETPC)<>0);
end;

Когда это определено, нужно присвоить всем OnMouseMove:=nil (кроме тех, где это все-таки нужно - например, связанных с перетаскиванием или рисованием). В моем случае это подавило непрошенные всплывающие подсказки при нажатии пальцем.

События OnMouseDown и OnMouseUp все-таки отрабатываются, но есть нюанс с параметром Shift. У меня в коде кое-где проверялось условие Shift=[]. На планшете это отчего-то не срабатывает, что-то там иное передается (что именно, не знаю, планшет был не у меня, а у тестера). Я переписал код, избегая этих проверок, и теперь всё прекрасно работает.

Еще один момент был связан с проверкой Button=TMouseButton.mbLeft: на всякий случай я везде добавил  or (IsTabletPC). Просто не был уверен, что палец целиком эквивалентен левой кнопке. Не знаю, как там на самом деле обстоит дело.

В общем, обошелся без события OnTap. Плохо понимаю, для чего оно вообще нужно.

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

Подозреваю Shift содержал значение ssTouch

GetSystemMetrics(SM_TABLETPC)<>0 На андроиде работает? B) Это я к тому, что если Вы привязываете работу только к Windows, то лучше пользоваться VCL это и проще и стабильнее и сторонних библиотек немеряно написано. А при использовании FMX не стоит использовать системные функции т.к. это уничтожит одно единственное достоинство Fire Monkey - кроссплатформенность.

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

Я наоборот перевел весь свой огромный многолетний проект с VCL на FMX, потому что хочу в перспективе портировать его на Мак и, может быть, на Линукс. Мобильных платформ не трогаю, для них уже есть версии. Что до системных функций, то предусмотрены ведь всякие {$IFDEF MSWINDOWS}, с ними, по идее, можно исхитряться. Хотя я, конечно, понимаю, что при реальном портировании всё будет гораздо сложнее, чем сейчас видится.

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

предусмотрены ведь всякие {$IFDEF MSWINDOWS}, с ними, по идее, можно исхитряться

Если всё прикладное приложение обвешивать директивами условной компиляции, то реально работать будет невозможно, не говоря уже о том, что в этом случае надо будет изучить апи каждой платформы. Поэтому лучше исхитряться в сторону использования стандартных высокоуровневых возможностей.

Директивы условной компиляции обычно используются только для тех случаев, где действительно логика работы зависит от платформы:
{$IFDEF MSWINDOWS} Caption := Caption + ' for Windows'; {$ENDIF}

В данном случае проверять наличие значения Touch в Shift.

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

В данном случае проверять наличие значения Touch в Shift.

Ну, допустим, в обработчике OnMouseMove это можно сделать. Но что мне делать, например, с обработчиком события OnMouseEnter, по которому для некоторых контролов тоже выводится кастомизированная всплывающая подсказка? На планшете эту подсказку мне нужно подавить, но параметр Shift здесь не передается - следовательно, ваш совет уже не применим.

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

Ну, допустим, в обработчике OnMouseMove это можно сделать. Но что мне делать, например, с обработчиком события OnMouseEnter, по которому для некоторых контролов тоже выводится кастомизированная всплывающая подсказка? На планшете эту подсказку мне нужно подавить, но параметр Shift здесь не передается - следовательно, ваш совет уже не применим.

Как я понимаю здесь не применим и GetSystemMetrics(SM_TABLETPC)<>0, т.к. в общем случае можно курсор двигать и с помощью мыши и с помощью пальца. Существуют обычные настольные мониторы с сенсорной поверхностью. Тут наверно нужно учесть, что пользователь обычно не водит пальцем по сенсорному экрану, а просто тыкает пальцем на контролы, исходя их этого допущения можно что-то придумать с подсказками.

Мой совет: лучше исхитряться в сторону использования стандартных высокоуровневых возможностей остаётся в силе B)

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

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

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

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

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

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

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

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

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

×
×
  • Создать...