Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Endlosformular: Ansicht merken?

Begonnen von Doming, Juli 29, 2025, 13:51:33

⏪ vorheriges - nächstes ⏩

Doming

Hallo,

ich habe ein Endlosformular, welches zyklisch aktualisiert wird.
Nun wird ja nach jedem Requery zum letzten Datensatz gesprungen. Man kann sich natürlich auch vor dem Requery den aktuellen Datensatz merken und nach der Aktualisierung wieder dort hinspringen.

Aber geht es entgegen meiner Befürchtung auch, dass man sich den Datensatz merkt, der vor dem Requery ganz oben angezeigt wird (nicht aktiv, weil mit Mausrad weggescrollt), um nach der Aktualisierung wieder den gleichen Bildschirm vorzufinden wie davor?

Gruß
 Doming

PhilS

Zitat von: Doming am Juli 29, 2025, 13:51:33Aber geht es entgegen meiner Befürchtung auch, dass man sich den Datensatz merkt, der vor dem Requery ganz oben angezeigt wird (nicht aktiv, weil mit Mausrad weggescrollt), um nach der Aktualisierung wieder den gleichen Bildschirm vorzufinden wie davor?
Mir ist nicht ganz klar, was du damit meinst.

Exakt gleich wird der Bildschirm ja nicht (immer) sein, sonst könntest du dir das Requery ja sparen.

Welcher Datensatz oben steht, hängt ja von der Sortierung ab. Wenn die Sortierung in der Abfrage (Recordsource) des Formulars vorgegeben ist, dann solltest du doch automatisch die selbe Reihenfolge nach einem Requery haben. - Es sei denn natürlich, es sind neue Datensätze hinzugekommen, die zwischen den bestehenden (ein)sortiert sind.

Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Knobbi38

Hallo Doming,

wie Phil schon angedeutet hat, müssen die Anzahl DS nach einem Requery nicht mehr stimmen, insofern wird dein Ansinnen, nach einem bestimmten DS zu springen, nicht umsetzbar sein.

Ich denke mir aber, daß du eventuell etwas anderes meinst. Kann es sein, daß du nach dem Scrollen mir der Maus wieder zurückspringen möchtest auf den angezeigten DS vor dem Scrollen?

So etwas könnte man z.B. per API umsetzen, wobei die aktuelle Position der vert. Scrollbar abgefragt und mit dieser Information dann die angezeigte DS Nummer über Umwege berechnet wird. Ist aber rel. kompliziert und ein passenden Beispiel habe ich auch nicht zur Hand. Auf der alten Webseite von Stephen Lebans gab es mal dazu ein Beispiel: https://www.lebans.com/setgetsb.htm, welches aber für Access nach 2007 ohne Änderungen wohl nicht mehr läuft.

Ich sage mal: "nice to have", aber der Aufwand lohnt sich nicht.

Gruß Knobbi38


PhilS

Zitat von: Doming am Juli 29, 2025, 13:51:33der vor dem Requery ganz oben angezeigt wird (nicht aktiv, weil mit Mausrad weggescrollt), um nach der Aktualisierung wieder den gleichen Bildschirm vorzufinden wie davor?
Ah, das habe ich jetzt erst, dank @Knobbi38's Hinweis auf die Scrollbars, verstanden. 

Zitat von: Knobbi38 am Juli 29, 2025, 15:49:38So etwas könnte man z.B. per API umsetzen, wobei die aktuelle Position der vert. Scrollbar abgefragt und mit dieser Information dann die angezeigte DS Nummer über Umwege berechnet wird. Ist aber rel. kompliziert und ein passenden Beispiel habe ich auch nicht zur Hand.
Ich habe ein (fast) passendes Beispiel zur Hand...
Schau mal mal mein Sync Scrollbars Demo an. Das sollte eigentlich alles enthalten, was man dafür braucht, nur dass du halt nicht zwei verschiedene Formulare sychronisieren willst, sondern bei ein und demselben Formular die Scrollbar-Position vor dem Requery ausliest und nachher wieder genauso setzt. 
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Bitsqueezer

Hallo,

schau mal auf meiner Downloadseite nach "CCReposition".
Das löst ein Requery aus und positioniert danach wieder auf den gleichen Datensatz zurück (sofern vorhanden).
Außerdem wird auch die Position auf dem Bildschirm wiederhergestellt, also z.B. in einem Endlosformular, wenn der Cursor in der Mitte des Bildschirms stand.

Gruß

Christian

Doming

#5
Hallo und danke für die Links,

Phil, Deine DB habe ich noch nicht zum Laufen bekommen, hakt sich mit meinem 64bit-System. Der Debugger stoppt bei lngRetVal = EnumChildWindows(lngFrmHwnd, AddressOf cwCBProc, 0) (Typen unverträglich)

Christian, Deine DB läuft zwar, allerdings springt das Formular zum markierten Datensatz zurück, zumindest so, dass er wieder angezeigt wird.

Ich möchte, dass der Bildschirm nach dem Timer-Requery wieder genauso dargestellt wird, wie davor. Der Anwender soll  (außer vielleicht ein kleines Rescroll des Formulars) nicht merken, dass gerade etwas automatisch durchgeführt wurde.

Wenn z.B. DS 15 aktiv ist und der Nutzer scrollt per Mausrad auf DS 420, dann soll nach dem Requery wieder der DS 420 angezeigt werden und der DS 15 weiterhin aktiv sein.

Zitat von: PhilS am Juli 29, 2025, 14:52:00Exakt gleich wird der Bildschirm ja nicht (immer) sein, sonst könntest du dir das Requery ja sparen.

Es ist nicht immer so, dass Änderungen an den DS durchgeführt wurden, es wird auch keine Uhrzeit angezeigt.

Gruß
 Doming

Bitsqueezer

Hallo,

ja, das funktioniert aber nur, wenn der Datensatz 420 angeklickt wurde, also der aktive Datensatz ist.

In einem Endlosformular "existiert" nur genau ein Datensatz als Formular, quasi wie ein Einzelformular. Alles andere ist nur Anzeige, Du kannst nicht darauf zugreifen. (Der Grund, warum bei ungebundenen Controls eine Inhaltsänderung in allen Zeilen dargestellt wird.).

Das heißt, wenn Du wissen willst, welcher Datensatz aktiv ist (oder sonstige Informationen aus dem Formular), kannst Du das aus DS 15 auslesen, aber nicht von 420.


Gruß

Christian

Doming

Hallo,

es ist mir klar, dass ich immer nur den aktiven Datensatz (also 15) bearbeite. Es ging mir ja immer nur um die Optik, also dass der Anwender nicht bei einem Requery zu DS15 zurückgebracht wird, sondern weiterhin die Zeile betrachten kann, die er gerade zu lesen angefangen hat (DS420).

Gruß
 Doming

Knobbi38

@christian:

So wie Doming es beschrieben hat, gibt es keinen aktiven DS, weshalb man nicht mit ,,normalen" Mitteln wie z. B. Lesezeichen wieder auf den alten DS positionieren kann. Hier muss man wirklich mit den grafischen Werten arbeiten und beispielsweise die Position der Scrollleiste auswerten. Das macht Access übrigens auch, denn für die Scrollbar wird ein Hook eingerichtet, mit dem dann ein ,,Tooltip" mit dem sichtbaren DS angezeigt wird. Leider kann auf diesen Tooltip nicht zugegriffen werden, da er nur kurz dynamisch erzeugt wird. Man müsste also die Position der Scrollbar auswerten und den Wert in Relation zur Fensterhöhe und zur Höhe eines Datensatzes in der Detailansicht setzen. Ähnlich wird das gemacht, wenn man mit der Maus auf einen anderen Datensatz klickt und dieser dann zum aktiven Datensatz wird. Auch dort werden solche Berechnungen angestellt.

Stephen Lebans hatt so etwas auch mal für eine Listbox gelöst, aber das war für ACC2K und natürlich nicht für 64Bit.

Der Aufwand wäre für mich jetzt zu hoch und wenn überhaupt, lohnt sich so etwas m.E. nur für eine kommerzielle Lösung.

@Doming:

Wenn man es etwas genauer betrachtet, sollte eine Anzeige eigentlich nicht irgendwo in der Anwendung stehen bleiben, sondern nach getaner Arbeit sollte die Anwendung wieder automatisch in die Grundmaske und ggf. auf den 1. oder aktuellsten DS springen, das wäre m.M.n. der etwas bessere Workflow, als im Hintergrund per Timer die DB mit Requeries zu belasten.

Gruß Knobbi38

PhilS

Zitat von: Doming am Juli 30, 2025, 09:33:40Phil, Deine DB habe ich noch nicht zum Laufen bekommen, hakt sich mit meinem 64bit-System. Der Debugger stoppt bei
Code [Auswählen] Erweitern
lngRetVal = EnumChildWindows(lngFrmHwnd, AddressOf cwCBProc, 0) (Typen unverträglich)
Ah, ja, da war was.
Ich hatte mal ein Video aufgezeichnet, in dem ich die Demo-Anwendung u.A. 64bit kompatibel gemacht hatte. - Das Video habe ich wegen technischer Probleme mit der Videoaufzeichnung nie veröffentlicht, aber die dabei entstandene DB sollte eigentlich OK sein.

Ich habe die neue Version mit 64bit Unterstützung mal hochgeladen. - Ohne Gewähr; ich habe im Moment leider keine Zeit das zu prüfen.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor