Под длительным нажатием я имею в виду нажатие кнопки / панели и удерживание в течение некоторого времени (скажем, 2 секунды) без отпускания или перемещения по экрану.Это часто встречается в мобильных телефонах и сенсорных устройствах.
Я пытался использовать Gesture, проверил toPressAndHold в TabletOptions и проверил все в InteractiveGestureOptions, но длительное нажатие не вызывает вызова OnGesture.
Другая реализация, которую я могу себе представитьдобавление таймера, запуск его в MouseDown и завершение в Timer Fired, StartDrag, MouseUp или MouseLeave.Однако, поскольку я хочу добавить это поведение к нескольким различным кнопкам и компоненту панели, мне придется переопределить набор процедур в каждом классе и скопировать код для каждого компонента.
Есть ли лучший способдостижения?
Редактировать:
В NGLN
Ву, отличная работа!Вместе с вашим ответом на эти эффекты прокрутки, VCL может почти достичь внешнего вида и ощущения мобильной ОС!
Ваш код отлично работает с общими элементами управления, но у меня есть 2 проблемы в моем случае
- Длительное нажатие на форму не может быть обнаружено (причина, поскольку форма не является родительской для себя)Я сдвигаю Find FChild Code в отдельную процедуру и вызываю как WMParentNotify, так и FormMouseDown для ее решения.
У меня есть несколько пользовательских кнопок, на которых есть некоторые отключенные метки HTML (Header, Caption, Footer), закрывающие исходную поверхность метки. Используя ваш код, FChild будет одной из тех меток, но не получитMouseCapture.Я добавляю следующую строку, чтобы преодолеть это:
, но не TControlAccess (FChild) .Enabled do FChild: = FChild.Parent;
Наконец, для некоторых более сложных элементов управленияподобно TCategoryButtons или TListBox, пользователю события может потребоваться проверка не всего элемента управления, а определенного элемента в элементе управления.Поэтому я думаю, что нам нужно сохранить исходные CursorPos и запустить другое событие, когда таймер сработал, чтобы дать возможность вручную определить, соответствует ли он условиям длительного нажатия или нет.Если да или событие не назначено, используйте для определения ваш код по умолчанию.
В общем, мы можем просто создать форму / панель, поддерживаемую LongPress, для размещения всех других элементов управления.Это гораздо проще, чем реализовать функцию LongPress Component by Component!Большое спасибо!
Edit2:
NGLN
Еще раз спасибо за вашу версию компонента, которая является отличным подходом, не требуя каких-либо изменений существующих компонентов иможет обнаружить долгое нажатие повсюду!
Для вашей информации, я должен был сделать несколько модификаций в соответствии со своими потребностями.
- TCustomForm vs TWinControl: Поскольку в большинстве моих приложений есть только 1 основная формаа все остальные визуальные блоки - это мои собственные созданные кадры (не из TFrame, а из TScrollingWinControl с поддержкой ccpack), предполагая, что TCustomForm у меня не работает.Поэтому я удалил форму свойства (но сохранил FForm для ActiveControl) и создал опубликованное свойство Host: TWinControl, чтобы действовать в качестве родительского хоста.Таким образом, я также могу ограничить обнаружение до некоторой ограниченной панели.При назначении хоста я проверяю и нахожу FForm, используя GetParentForm (FHost).
- Отключенные элементы управления: как я уже говорил ранее, у меня есть несколько отключенных TJvHTLabel, покрывающих мои кнопки, и ваш компонент работает с метками.Я могу найти кнопку назад по метке, но я думаю, что было бы удобнее, если бы она была обработана новым компонентом.Поэтому я добавляю свойство SkipDisabled и, если установлено значение turn, зацикливаюсь в его родительской строке, чтобы найти первый включенный элемент управления.
- Я добавляю свойство PreserveFocus, чтобы разрешить пользователю компонента сохранять последнее activecontrol или нет.
- Управление с предметами.Я изменил ваш TLongPressEvent, добавив ClickPos в качестве второго параметра.Итак, теперь я могу использовать ClickPos, чтобы найти, какой элемент в списке и т.п. долго удерживался.
- Мне кажется, что FindVCLWindow имеет такой же эффект с вашим FindControlAtPos?
Еще раз спасибо за вашу прекрасную работу.