Hallo,
ich habe ein Formular, bei dem durch einen Doppelklick auf einen Datensatz eine Aktion durchgeführt wird.
Das kann durchaus ein paar Sekunden dauern, weil er dazu in einer anderen Tabelle nachsehen muss.
Als Anwender bekommt man davon aber nichts mit, sondern es dauert eben seine Zeit, in der nichts Sichtbares passiert.
Deswegen habe ich die Sanduhr mit Docmd.Hourglass (True) aktiviert, damit zumindest zu sehen ist, dass die Aktion noch ausgeführt wird, sonst klickt man vielleicht noch wild herum.
Zumindest war das meine Intention beim Programmieren.
Geht man den Code schrittweise durch, erscheint die Uhr auch wie bestellt. In der Praxis wird das aber gern mal vergessen, die Aktion wird ausgeführt, aber zu sehen ist nichts.
Deswegen dachte ich mir, ein DoEvents könnte den Rechner zum kurzen Innehalten bewegen, Pustekuchen!
Private Sub DxAuftrag_DblClick(Cancel As Integer)
DoCmd.Hourglass (True)
DoEvents
.... Aktion...
DoCmd.Hourglass (False)
End Sub
Ich möchte da jetzt keine Warteschleifen einbauen, er soll ja seine Daten suchen und das möglichst schnell, aber wie bekomme ich den Rechner dazu, Codezeilen nicht einfach zu ignorieren?
Gruß
Doming
Nachtrag:
wie ich jetzt festgestellt habe: Wenn der Datensatz bereits der aktive ist, springt die Sanduhr an. Aber das hieße: erst auf die Zeile klicken, dann das Textfeld doppelklicken. Das ist dem Anwender vermutlich schwer zu vermitteln.
Hallo Doming,
anstelle jetzt mit Makros (DoCmd) zu arbeiten, würde ich das Screen Object dafür verwenden (siehe Doku) und immer darauf achten, dass auch bei einem Fehler der Cursor wieder zurückgesetzt wird; eine Fehlerbehandlung ist in dem Fall unabdingbar.
Knobbi38
Hallo,
Private Sub DxAuftrag_DblClick(Cancel As Integer)
On Error GoTo Fehler
Application.Screen.MousePointer = 11
' DoCmd.Hourglass (True)
Aktion
...
Fehler:
Application.Screen.MousePointer = 0
' DoCmd.Hourglass (False)
End Sub
Ich war kurz versucht, hurra zu schreien, aber der gewünschte Effekt trat nur bei den ersten 3 Tests auf. Danach Business wie gehabt:
Eine Haltemarke im Code oder vorheriges Markieren des Feldes, Doppelklick, Sanduhr erscheint.
Direktes Doppelklicken in eine nicht markierte Zeile: Bedingte Formatierung der Zeile reagiert (farbig hinterlegt), das Feld wird aktiv (Textmarkierung) und der Code für das Ereignis wird abgearbeitet, aber der Mauszeiger bleibt wie gehabt.
Selbst die OH von MS setzt die Screen-Methode dem Hourglass gleich
ZitatDas Festlegen der MousePointer-Eigenschaft auf 11 entspricht der Übergabe des Arguments True (1) an die Hourglass-Methode des DoCmd-Objekts . Umgekehrt wird durch die Übergabe des Arguments True an die Hourglass-Methode auch die MousePointer-Eigenschaft auf "11" festgelegt.
Hallo Doming,
es geht hier nicht um das gleiche Verhalten, sondern darum, daß mit DoCmd ein Makro ausgeführt wird, wohingegen bei der Zuweisung an die Mousepointer - Eigenschaft eine Zuweisung an ein Objekt erfolgt. DoCmd sollte wann immer es geht durch entsprechende Anweisungen innerhalb von VBA ersetzt werden.
Timerevents, Focushandling und Aktionen wie Zuweisungen an Mousepointer kann man nicht debuggen, weil dabei die Steuerung von Access an die VBE übergeben wird und damit sich das Verhalten ändert.
Knobbi38
Ich gebs auf, der Code will mich nicht verstehen...
selbst ein
Do
Application.Screen.MousePointer = 11
DoEvents
Loop Until Application.Screen.MousePointer = 11
funktioniert nicht. Es verzögert nur die Aktivierung der Zeile
Hallo Doming,
hast du schon mal anstatt einem Doppelklick einen ButtonClick ausprobiert? Möglicherweise mußt du deine Aktionen asynchron aufrufen und danach den Mauszeiger wieder zurücksetzen. Kann natürlich auch sein, daß deine Aktionen den Mauszeiger wieder zurücksetzen.
Knobbi38
Moin,
setze ich einen Button in die Zeile, wird das Klick-Ereignis davon erst ausgelöst, wenn der Datensatz aktiviert ist, ein Doppelklick ist dann quasi Voraussetzung, um überhaupt etwas anzufangen.
Auch die Klick-Performance des Buttons wird erst ausgeführt, wenn der Datensatz den Fokus hat.
Gruß
Doming
Problem gelöst...
Public KlickWarten as Boolean, KlickTimer as Long
Private Sub DxAuftrag_DblClick(Cancel As Integer)
On Error GoTo Fehler
Dim TimerZeit As Long
TimerZeit = Me.TimerInterval
KlickTimer = 0
KlickWarten = True
Me.TimerInterval = 10
Do
Application.Screen.MousePointer = 11
DoEvents
Loop Until KlickTimer > 10
KlickWarten = False
Me.TimerInterval = TimerZeit
Aktion
Fehler:
Application.Screen.MousePointer = 0
End Sub
Private Sub Form_Timer()
If KlickWarten Then
KlickTimer = KlickTimer + 1
Exit Sub
End If
Sonstige TimerAktionen
End Sub
Mir gefällt die Sache nicht, aber sie funktioniert.
Das DoEvents habe ich eingebaut, weil ich vorher irgendwas falsch gemacht und offenbar eine Endlosschleife fabriziert hatte.
Gruß
Doming
Hallo Doming,
deinen Ausführungen mit dem Doppelklick kann ich so nicht ganz folgen, aber möglicherweise liegen bei dir ja andere Verhältnisse vor.
M.M.n. könnte man allerdings die Timer-Ereignisroutine sicherlich vereinfachen, komplizierter geht es kaum noch. Ich sehe auch keinen Grund darin, den Timer weiterlaufen zu lassen, zumal mit einer Intervallzeit von 10 ms., was eine unnötige Belastung darstellt.
Ich habe mal versucht, so ein Szenario nachzustellen, aber bei mit hat die einfache Zuweisung an Mousepointer ausgereicht. Ich vermute mal, dass das mit deinen "Aktionen" zusammenhängt.
Knobbi38
Hallo,
den Timer habe ich mir nur ausgeliehen, deswegen speichere ich vor meiner Aktion das Intervall (TimerZeit) und setze den alten Wert danach wieder ein.
Das Formular wird durch den Timer alle xx Minuten aktualisiert.
Dass ich durch das Neusetzen des AltIntervalls den Neubeginn desselben bewirke nehme ich mal so hin.
Wie gesagt, glücklich bin ich mit der Lösung nicht, aber sie funktioniert ohne ,,Formatierung der Festplatte zur Laufzeit" und ich kann mich erstmal um wichtigere Funktionen kümmern ;)
Deine Vermutung mit den ,,Aktionen" als Ursache teile ich, denn darin werden Datensätze gesucht, andere Unterformulare im Hauptformular bearbeitet und aktualisiert usw., Ist wohl zu viel Arbeit um sich auch noch um Mauszeiger zu kümmern.