Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Windows 10 touch screen tablet scrolling und VCL (https://www.delphipraxis.net/198065-windows-10-touch-screen-tablet-scrolling-und-vcl.html)

mael 1. Okt 2018 16:55


Windows 10 touch screen tablet scrolling und VCL
 
Hallo,

Ein Benutzer meiner Software meinte es gibt ein Problem mit dem Scrollen das seit dem Upgrade auf DXE3 (von Delphi 7) besteht.

Hoch und runterstreifen/swipen auf meinem Custom-Control (TXmHexEdit) hat früher gescrollt, jetzt wird ausgewählt. Also werden wohl irgendwie die MouseDown/MouseMove und Touch-Ereignisse anders behandelt seit DXE3.
Wahrscheinlich liegt es am "neuen" Touchsupport.

Nun habe ich kein Win 10 touch screen tablet um das zu testen und zu debuggen. Mit normaler Maus oder touch pad kann ich das Problem nicht reproduzieren.

Hat jemand ähnliche Probleme gehabt oder Tipps?

Bernhard Geyer 1. Okt 2018 17:33

AW: Windows 10 touch screen tablet scrolling und VCL
 
XE3 ist aber auch schon "sehr alt".
Und ist dein "TXmHexEdit" auch auf neueren Delphi-Versionen angepasst worden?
Kannst du nicht mal testhalber mit D10.2 Community-Edition eine Compilierung durchführen um zu sehen ob es evtl. an dieser alten Version liegt?

mael 1. Okt 2018 19:13

AW: Windows 10 touch screen tablet scrolling und VCL
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1414610)
XE3 ist aber auch schon "sehr alt".

Nicht wirklich. Ende 2013 gekauft finde ich ziemlich neu, besonders wenn man die Changelogs betrachtet hat sich in der VCL wenig verändert (FMX/Mobile eher, aber das war/ist extra).
Der Aufwand alles zu installieren und dann zu kompilieren usw. wäre allerdings trotzdem recht hoch.

Daher wollte ich eher mal in die Runde fragen ob diesbezüglich was bekannt ist, bzw. überhaupt jemand so ein Gerät hat, zum testen...

Der schöne Günther 2. Okt 2018 16:37

AW: Windows 10 touch screen tablet scrolling und VCL
 
Ich kann gerne etwas testen (normales Surface).

mael 3. Okt 2018 16:02

AW: Windows 10 touch screen tablet scrolling und VCL
 
Danke, PN geschickt.

mael 8. Okt 2018 07:35

AW: Windows 10 touch screen tablet scrolling und VCL
 
So, ich habe nach ausgiebigem Testen und Lesen der VCL und WinAPI den Fehler gefunden. Es ist tatsächlich ein Problem in der VCL der auftritt weil sich eine Win-API (SetGestureConfig()) unerwartet verhält.

Das Problem wird bei allen TCustomControls auftreten die nicht speziell eine Touchbehandlung eingebaut haben (dürfte die große Mehrheit sein). Die VCL deaktiviert unglücklicherweise den eingebauten Fallback von Windows, der normalerweise aktiv ist, wenn ein Steuerelement keine besondere Touch-Behandlung umsetzt.

Die neuste Delphi Version (Community Edition) hat den gleichen Fehler noch immer, der VCL-Quelltext ist auch unverändert (was die Touch-Logik angeht).

Ich habe auch einen weiteren Fehler entdeckt, wenn man die TapAndHold-Gesture ausführt wird richtig ein Rechtsklick ausgeführt, aber das markierende Rechteck verschwindet nicht automatisch wie bei anderen Programmen, wie z.B. Notepad. Manchmal bleibt auch eine Reihe von Rechtecken auf dem Schirm, bis es sehr störend wird.

jaenicke 8. Okt 2018 07:42

AW: Windows 10 touch screen tablet scrolling und VCL
 
Zitat:

Zitat von mael (Beitrag 1415173)
So ich habe nach ausgiebigen Testen und Lesen der VCL und WinAPI den Fehler gefunden. Es ist tatäschlich ein Problem in der VCL das auftritt weil sich eine Win-API unerwartet verhält.

Touch-Befehle und Mausbefehle mischen sich leider nach nicht unbedingt vorhersehbaren Regeln, insbesondere z.B. bei Labels auf anderen Controls usw., ja, das mussten wir auch schon feststellen.

Zitat:

Zitat von mael (Beitrag 1415173)
Ich habe auch einen weiteren Fehler entdeckt, wenn man die TapAndHold Gesture ausführt wird richtig ein Rechtsklick ausgeführt, aber das markierende Rechteck verschwindet nicht automatisch wie bei anderen Programmen, wie z.B. Notepad. Manchmal bleibt auch eine Reihe von Rechtecken auf dem Schirm, bis es sehr störend wird.

Das konnten wir auch noch nicht lösen. Das passiert aber auch nicht nur bei VCL-Programmen, sondern bisweilen auch schlicht auf einem frisch gestarteten Windows 10 direkt auf dem Desktop... mit den Standard-Grafiktreibern passiert das hier nicht, aber dafür funktionieren nicht alle Auflösungen usw.

arnof 8. Okt 2018 08:45

AW: Windows 10 touch screen tablet scrolling und VCL
 
Mit Touch könnte Dir vielleicht folgendes Helfen:

Delphi-Quellcode:
xxx.MouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
 if (ssTouch in Shift) then begin
   // hier wischt jemand mit dem Finger ...
 end
Oder beim Surface mit Stift:

Delphi-Quellcode:
  (ssPen in Shift)

mael 8. Okt 2018 19:49

AW: Windows 10 touch screen tablet scrolling und VCL
 
Da ich kein Touchdisplay-Gerät habe, habe ich mit einem Simulator getestet. Wer Visual Studio installiert hat (Community Edition reicht), findet ihn unter C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Simulator\15.0\Microsoft.Windows.Simulator.exe
Die Versionsnummer im Pfad muss man natürlich entsprechend der installierten VS Version anpassen.

Er öffnet eine RDP-Session und am rechten Rand des "Simulator"-Fensters kann man auswählen ob die Maus als normaler Zeiger oder als Touch-Gerät funktioniert (gibt verschiedene Optionen für Ein-Finger-Touch, Pinch-And-Zoom, Rotate usw.).

Mit dem konnte ich den Fehler reproduzieren und ihn zumindest im Simulator beheben.

Hat man ein normales TCustomControl das schon Scrolling unterstützt, reicht es im Konstruktor folgenden Code einzufügen:

Delphi-Quellcode:
  Touch.InteractiveGestures := [igPan, igPressAndTap];
  Touch.InteractiveGestureOptions := [igoPanInertia, igoPanSingleFingerHorizontal, igoPanSingleFingerVertical, igoPanGutter, igoParentPassthrough];
Danach verhält sich das Steuerelement (zumindest im Simulator) wieder so wie ein Steuerelement das richtig auf Pan-Gesten reagiert, wie wenn Windows die Unterstützung hinzufügt für Programme die eigentlich kein Touch, dafür aber Scrolling, unterstützen. Bevor Delphi Touch-Unterstützung bekommen hat, waren diese Zeilen nicht notwendig, und es hat automatisch funktioniert, wie in den Posts weiter oben erwähnt.

Es schadet auch nicht IsTouchPropertyStored() zu überschreiben, damit man die Optionen InteractiveGestures und InteractiveGestureOptions nur in die DFM schreibt, wenn sie andere Werte haben als die die im Konstruktor gesetzt wurden.


MS empfhielt noch Pen-Flicks zu deaktivieren (ohne Erklärung, aber ich denke damit es nicht mit dem Scrolling interferiert): https://docs.microsoft.com/en-us/win...disable-flicks

Das erreicht man durch eine weitere Option:
Delphi-Quellcode:
Touch.TabletOptions := Touch.TabletOptions - [toFlicks];

In der VCL kann man diese Features aktivieren, in der WINAPI deaktiviert man sie.
Delphi-Quellcode:
toFlicks
entspricht also
Delphi-Quellcode:
not TABLET_DISABLE_FLICKS
: Die VCL setzt alle TABLET_DISABLE_* Konstanten standardmäßig, und entfernt eine TABLET_DISABLE_ Konstante nur wenn die entsprechende Option (wie toFlicks) nicht in TabletOptions ist.

Will man also Pen-Flicks deaktivieren, muss man gar nichts machen. Die VCL macht das standardmäßig und deaktiviert alle TabletOptionen, bis auf toPressAndHold.
Es schadet aber nicht das explizit zu machen und wie oben toFlicks von den aktivierten Tablet-Features zu entfernen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz