Eigentlich wollte ich für einen Freund nur "mal schnell" ein kleines Programm schreiben, mit dem er beim Sport den Spielstand anzeigen lassen kann. Wunsch dabei war, dass man mit Touch-Gesten dem Heim- oder Gast-Team einen Punkt geben (oder abziehen) kann. "Sache von 'ner Stunde", habe ich mir gedacht. Aber denkste - entweder bin ich zu blöd, die Touch-Funktionen von Delphi richtig zu nutzen oder da steckt ein fieser Bug drin.
Idee war: wischt man in der linken Bildschirmhälfte mit einem Finger nach oben, bekommt die Heimmannschaft einen Punkt, in der rechten Hälfte nach oben wischen führt zu einem Punkt für die Gäste. Analog wird bei einem Wisch nach unten ein Punkt abgezogen. Problem: im fertigen Programm wische ich links, dennoch bekommt der Gast einen Punkt. Wische ich dann noch mal links, bekommt (wie erwartet) die Heimmannschaft einen Punkt, noch mal links, wieder Heim. Wische ich dann rechts, bekommt wieder die Heimmannschaft den Punkt, soll sie aber natürlich nicht. Nochmal rechts, dann erst geht der Punkt an den Gast.
Der Fehler tritt sowohl auf, wenn man die Geste für das Form als Ganzes auswertet (und dann an der x-Position entscheidet, ob links oder rechts), als auch, wenn man mit zwei Labels arbeitet und diesen getrennt ein OnGesture zuweist - es wird dann das Event für das jeweilige Label immer um eins versetzt ausgeführt.
Im Anhang findet ihr ein einfaches Demoprogramm, das einfach nur die x-Position ausgibt, wenn man auf dem Formular mit dem Finger nach oben oder unten wischt. Man sieht, dass die Position immer eins hinterher ist.
Getestet sowohl mit Delphi 10.2.3 als auch 10.3.2 auf einem Surface mit Windows 10 (ohne VM). Könnt ihr das bei euch nachvollziehen? Mache ich etwas falsch oder ist es ein Bug in der
VCL?
Ach, wichtig noch: der Fehler tritt
nicht auf, wenn man die Geste mit der Maus emuliert, dann ist alles korrekt. Nur, wenn man wirklich mit dem Finger die Geste ausführt, zeigt sich der Effekt.