2016-08-11 1 views
3

J'ai créé une classe dérivée TCustomControl pour une application VCL s'exécutant sur une tablette Windows 8.1. J'utilise les événements OnMouseDown/OnMouseUp même si c'est évidemment basé sur le toucher. Ce que je voudrais faire, c'est détecter une pression longue, c'est-à-dire toucher et maintenir pendant 1 seconde. Ainsi, dans l'événement OnMouseDown, j'enregistre l'horodatage, définissez un indicateur pour indiquer que la souris est hors service et créez un thread anonyme qui dort pendant 1 seconde, puis vérifie le drapeau.Longue touche avec Delphi VCL sur la tablette Windows

Dans OnMouseUp Je définis l'indicateur sur false.

Cela fonctionne aussi longtemps que vous remuez votre doigt sur le contrôle. Sinon, si vous appuyez et maintenez enfoncé l'événement de souris vers le bas n'est pas appelé jusqu'à ce que vous relâchiez votre doigt. J'ai regardé des gestes, mais cela semble complètement exagéré et de ce que je comprends ne supporte pas une pression prolongée de toute façon.

Merci pour vos suggestions.

Richard

+0

Que diriez-vous juste d'activer une minuterie avec un intervalle de 1000ms quand MouseDown se produit, et l'annuler sur MouseUp. Mettez votre code dans l'événement OnTimer. Il devrait seulement tirer après avoir maintenu la souris pendant plus d'une seconde. Vous pourriez probablement vous en sortir avec une minuterie pour l'ensemble du formulaire tant que vous enregistrez le contrôle qui l'a lancé. N'oubliez pas de désactiver la minuterie immédiatement dans l'événement OnTimer. – penarthur66

+0

Merci, mais cela ne fonctionnera pas pour la même raison que le fil anonyme, le MouseDown ne se déclenche pas à moins que vous ne bougiez votre doigt ou ne leviez votre doigt. –

+0

Je n'ai pas de tablette Windows, mais j'ai ajouté un TButton et un TMemo à un nouveau formulaire VCL (Berlin) et ajouté du code pour ajouter une ligne au mémo dans les gestionnaires d'événements MouseDown et MouseUp, les deux événements se déclenchent clairement et en synchronisation avec les clics de souris. Il doit y avoir une différence entre la façon dont la tablette déclenche les événements à partir de la souris PC standard. – penarthur66

Répondre

0

Si l'événement MouseDown ne se déclenche pas et que vous voulez faire de votre compteur de retard dépendant alors vous êtes essentiellement foutus. Cela dit, je suppose que vous êtes ouvert à de légers changements de concept. :)

Je pense que cela peut encore être fait si vous changez votre bouton en quelque chose comme un interrupteur à bascule. L'utilisateur doit "saisir" (toucher), "tirer vers le haut" (glisser, devrait déclencher l'événement StartDrag) et le maintenir là pour la durée désirée. Lors de la libération du commutateur (événement MouseDown), il redescend.

Pour concevoir un tel bouton, vous pouvez utiliser un petit TPanel pour le bouton et légèrement plus grand pour permettre un mouvement vertical limité. Définissez la propriété BevelInner à bvLowered et BevelOuter à bvRaised pour qu'il ressemble à un cadre et le panneau de boutons à son enfant. Ou utilisez un TImage pour afficher le bouton dans ses positions haut/bas. Dans tous les cas, définissez la propriété DragKind de l'élément de bouton sur dkDrag ou l'événement StartDrag ne se produira pas. Si toujours aucun événement n'est déclenché, veuillez essayer à detect touch input capabilities et rapportez vos résultats.

Pas sûr que cela soit qualifié pour une réponse, mais peut-être que ça vaut le coup.

1

Ce à quoi vous faites face est un comportement "normal" mais ridiculement stupide de Windows avec des périphériques d'entrée tactile. Nous sommes confrontés au même problème depuis un certain temps et nous essayons de le résoudre activement depuis quelques semaines. L'astuce est, que Windows gère le périphérique d'entrée tactile comme "souris, qui peut être entièrement contrôlée avec un seul doigt". Par conséquent, il a plusieurs états, plus que des événements:

Les événements sont: Appuyez sur commencer (bas), déplacer, haut, clic droit, et si vous voulez vraiment vous inscrire à un rappel, vous deviendrez stationnaire (pas déplacé depuis dernier rapport mais toujours en panne).

En attendant, il y a plus d'états. Tout d'abord, lorsque vous appuyez sur votre doigt, il détecte en interne "Touch down!" un événement. Il attend un certain laps de temps (qui peut ou non être disponible pour changer de bidule, dépend des pilotes etc ...), pour déterminer si ce que vous vouliez était un clic droit (après x temps, après la sortie ! avant l'heure Y!il se déclenchera clic droit événement) ou s'il s'agissait d'un clic gauche vers le bas (événement déclencheur TouchBegin - après et le temps, qui est plus long que x-temps, et après l'expire, il tirera événement vers le bas gauche (cliquez pas!)).
En attendant, si le premier contact est interrompu par un mouvement ou - !! en attendant x temps pour expirer !! la libération du doigt avant que le temps x est manqué, il déclenchera automatiquement gauche vers le bas(sur le mouvement) ou clic gauche(sur la libération). La même chose s'applique à tout moment après l'expiration du temps Y, ou MOVE est déclenché.

Pour plus simplement et compréhensible, je vais essayer de donner un exemple:

Disons que vous avez appareil tactile, et les horaires sont les suivants: Le point B commence, positionné à 0 secondes de notre calendrier. Le point X est le premier point d'arrêt de déclenchement, positionné à 5 secondes de notre timeline. Le point Y est le deuxième point d'arrêt de déclenchement, positionné à 10 secondes de notre chronologie.

Vous mettez votre doigt sur le contact, et cela commence la chronologie. Scénarios possibles: - Vous le relâchez à tout moment avant le point X -> Clic gauche est déclenché (événements Touch down et up, dans l'ordre l'un après l'autre) - Vous le relâchez après le point X mais avant le point Y -> clic droit est déclenché (Appuyez sur les événements vers le bas et vers le haut, avec un clic droit) - Vous atteignez le point Y - Gauche est déclenché! - Vous le relâchez après le point Y à tout moment, peu importe si le mouvement se déclenche entre la libération ou non (mais le mouvement n'est PAS déclenché avant d'atteindre ce point dans le scénario) -> Left up est déclenché.

  • événement move Vous déclencheur (faire) avant d'atteindre le point X -> gauche vers le bas est déclenchée, suivie par autant d'événements de mouvement comme il le détecte, jusqu'à ce que vous relâchez -> puis à gauche est déclenchée
  • Vous déclencher (faire) déplacer l'événement après X mais avant Y -> même que ci-dessus!
  • Vous atteignez le point Y et le déplacez ensuite -> vérifiez le point n ° 4 ci-dessus.

Espérons que cela a du sens pour vous.

Maintenant, pour aller aux solutions possibles: le pilote personnalisé serait une option, mais nous ne sommes pas encore là, donc nous essayons toujours d'autres options. Le plus prometteur pour l'instant semble être l'utilisation de RAW_INPUT et Touch hooks, on dirait que nous devrons les combiner pour obtenir ce que nous voulons. Le bon côté est que les fenêtres elles-mêmes détectent lorsque le doigt touche l'appareil, indépendamment des timings et des événements qu'il veut détecter, déterminer et transmettre aux applications, mais pour une raison quelconque, il est difficile à utiliser dans une telle nature. Comme preuve, vous pouvez simplement vérifier le point transparent qui apparaît sous votre doigt le premier moment où vous touchez l'écran.

Pendant ce temps, Android gère ces choses beaucoup mieux ...

espère que cela aide, et je suis heureux de venir autour de la solution complète une fois que nous venons à travers et obtenir quelque chose assez bon pour l'utilisation.

M.*