stehe vor folgenden Problemund finde die Lösung nicht.
Es wird eine Grafik auf einem Canvas gezeichnet, welche am Ende auch mit dem Finger verschoben werden kann.
Damit dies nicht während des Zeichnes geschehen kann, frage ich in der "activity_touch" über eine Variabel ab, ob gerade die Grafikausgabe stattfindet.
Falls ja, wird die Subroutine direkt wieder verlassen und gut ist.
Aber, die ganzen Gesten werden sich wohl in einem Puffer gemerkt und so passiert es, das nach Fertigstellung der Grafikausgabe diese alle abgearbeitet werden.
Folge, die Grafik spring hin und her.
Ich suche nun eine Möglichkeit, diesen Puffer zu löschen, bzw. es irgendwie anders hin zu bekommen.
Gruß
Sky
Edit:
In der Loop, welche die Grafik auf dem Canvas ausgibt, befindet sich ein "Invalidate" und ein "DoEvents".
Ansonsten wird mir die Grafik erst nach Ablauf der Loop angezeigt.
Ich denke hier liegt das Problem, aber anders bekomme ich momentan kein Update des Bildschirms hin.
Last edited by Skywalker : 02-02-2012 at 10:17 PM.
Code Posten ist jetzt etwas schwierig, bin auf der Arbeit.
Grafik wird aber mit Canvas auf einem Panel ausgegeben.
Das sieht in etwa so aus.
Sub Activity_Resume()
...
Berechnung_Aktiv = True
For i = 0 to irgendwas
.. Jede Menge Berechnungen
Canvas1.DrawLine(x,y,...usw.)
Panel1.Invalidate
DoEvents
next i
Berechnungen_Aktiv = false
End Sub
Sub Activity_Touch(x,y,Action...usw)
If Berechnungen_Aktiv = True then Return True
Select Action
...
EndSelect
Return True
End Sub
Während der Berechnung und Grafikausgabe soll also kein Touch abgearbeitet werden, das funktioniert auch. Aber alle Touch-Events werden nach der Grafikausgabe abgearbeitet. Das soll aber nicht sein.
Denke es liegt an DoEvents. Lass ich das aber weg, wird die Grafik erst nach Fertigstellung angezeigt. Genauso ist es mit dem Panel1.Invalidate.
Habe es dann ohne DoEvents probiert und anstelle dessen ein Panel1.Invalidate(Rect) eingefügt, aber auch dann wird die Grafik erst nach Ablauf der For-Schleife angezeigt.
Die Incrementvariable darf nicht hinter Next stehen.
Um heauszufinden wo das Problem liegt schlage ich Dir vor eine globale Variable j zu erstellen und diese in der Schleife gleich i zu setzen.
In der Touch Routine setze zwei Log rein. Dann kannst Du sehen was in der Touch Routine passiert.
Code:
Sub Activity_Touch(Action AsInt, X AsFloat, Y AsFloat) Log("1 " & j) If Berechnungen_Aktiv = TrueThenReturn Log("2 " & j) Select Action ... EndSelect End Sub
Die Activity_Touch Routine braucht keine boolsche Variable nach Return nur Panel_Touch Routinen braucht sie.
Danke Klaus.
Das mit dem "Next" ist mir bekannt. Hatte heute das Code-Beispiel aus dem Kopf heraus geschrieben.
Dein Vorschlag mit den Variabeln hilft mir nicht weiter. Was in der Touch-Routine passiert ist mir schon klar. Daran liegt es nicht.
Wie schon geschrieben, solange die Schleife mit der Grafikausgabe beschäftigt ist, wird jede Fingergeste in der Touch-Routine ignoriert,
durch "If Berechnungen_Aktiv = True then Return". Das ist ja auch so gewollt.
Nur, sobald die Schleife durch ist und die Grafik somit fertig, werden alle Gesten ,die während der Grafikausgabe getätigt wurden, abgearbeitet.
Also sind die Gesten irgendwie gepuffert worden. Das soll aber so nicht sein.
Dein Vorschlag mit den Variabeln hilft mir nicht weiter. Was in der Touch-Routine passiert ist mir schon klar. Daran liegt es nicht.
Wie schon geschrieben, solange die Schleife mit der Grafikausgabe beschäftigt ist,
Bist Du sicher ? Hast Du es ausprobiert ob die Touch Routine aufgerufen wird wenn die Schlaufe durchlaufen wird ? Das wollte Ich mit den Log Schlüsselworten ausprobieren.
Es kommt mir komisch vor dass die Routine aufgerufen wird und nachher noch einmal. Ich vermute nàhmlich dass die Routine nicht aufgerufen wird so lange das Programm in der Schlaufe ist, und die Touch-Events in einer Warteschlange bleiben.
Ohne den Code kann Ich da leider nicht weiter suchen.
Während der Schleife wird die Touch_Routine nicht abgearbeitet. Höchstens einmal am Anfang. Habe das mit der Variabel getestet.
Erst wenn die Schleife durch ist, wird der Puffer (Warteschlange) abgearbeitet.
Das bedeutet natürlich, das ich während des Schleifendurchlaufes in der Touch_Routine den Puffer nicht löschen könnte. Weil da ja noch nichts abgefragt wird.
Wie kann ich diese Warteschlange nun umgehen?
Eigentlich müsste DoEvents die Touch Routine aufrufen lassen.
Versuche es mal mit einem Timer:
- Am Ende der Schlaufe setze einen Timer1.Enabled = True
- In der Timer1_Tick Routine
- Timer1.Enabled = False
- Berechnungen_Aktiv = False
Während der Timerzeitspanne werden die Touchevents aufgerufen,
aber da die Berechnungen_Aktiv Variable immer noch False ist wird nichts durchgeführt.
Die Länge der Zeitspanne des Timers musst Du ausprobieren.
Ist bestimmt nicht die eleganteste Lösung sollte aber funktionieren, habe es nicht ausprobiert.