Unterformulare im Gleichschritt

Access ist bekannt dafür, dass man Daten schnell in gewünschter Weise zur Bearbeitung in Formularen anzeigen kann – zumindest für übliche Szenarien. Entwickler schätzen Access aber auch deshalb, weil sich auch außergewöhnliche Anforderungen damit realisieren lassen. In diesem Beitrag geht es um die Synchronisierung zweier Unterformulare.

Die Anforderung für diesen Beitrag stammt aus einem anderen Beitrag, nämlich Mehrsprachige Anwendungen (Shortlink 611). Dort sollen Benutzer in einem Formular verschiedene Übersetzungen der Beschriftungen von Steuerelementen eintragen, um die Anwendung mehrsprachig zu machen.

Die Daten stammen aus einer einzigen Tabelle, die unter anderem die ID der Sprache und des Textes sowie die verschiedenen Übersetzungen beinhaltet. Wie immer unter Access gibt es verschiedene Ansätze, um den Originaltext und dessen Übersetzung so anzuzeigen, dass der Benutzer diese möglichst komfortabel editieren kann. So könnte man etwa die Originaltexte in einem Listenfeld anzeigen, aus dem der Benutzer den Text auswählt, den er übersetzen möchte, und diesen Text in einem Textfeld zur Bearbeitung bereitstellen. Diese Lösung programmiert ein durchschnittlich begabter Access-Programmierer wohl in maximal einer halben Stunde.

Manchmal juckt dem Entwickler aber das Fell und er wählt einen Weg, der auf den ersten Blick nicht viel aufwendiger erscheint, aber erheblich ergonomischer wirkt. Dabei soll auf der linken Seite des Formulars ein Unterformular in der Datenblattansicht die Originaltexte und ein weiteres auf der rechten Seite die Übersetzungen in der jeweils ausgewählten Sprache anzeigen.

Das ist gegenüber dem ersten Ansatz sicher ergonomischer, weil der Benutzer nicht für jede neue Übersetzung erst den Originaltext markieren muss, um den zu übersetzenden Text angezeigt zu bekommen. Stattdessen sieht er links eine Reihe Originaltexte und rechts die Übersetzungen, wobei er die Übersetzungen einfach von oben nach unten oder auch willkürlich abarbeiten kann. So weit, so gut: Zwei Unterformulare in einem Formular anzulegen, die jeweils andere Daten der gleichen Tabelle anzeigen (je einmal für jede Sprache), stellt keine echte Herausforderung dar. Dafür brauchen Sie sogar nur ein einziges Formular, das Sie zweimal als Unterformular in ein Hauptformular integrieren.

Unpraktisch ist nur, dass man irgendwann alle aktuell angezeigten Texte übersetzt hat und die bis dahin nicht sichtbaren Texte nach oben scrollen muss – und das immer gleichzeitig für zwei Unterformulare, damit die entsprechenden Texte auch nebeneinanderliegen. Hier setzt die Lösung dieses Beitrags an: Sie zeigt, wie Sie die beiden Unterformulare synchron scrollen, egal, ob dies mit der Tastatur, dem Mausrad oder mit den Bildlaufleisten geschieht.

Versuchsaufbau

Als Grundlage dient eine Beispieltabelle namens tblBeispiele mit den zwei Feldern BeispielID und Beispiel. Ein Hauptformular namens frmHauptformular besitzt nur zwei Unterformularsteuerelemente sfm1 und sfm2, die jeweils das Unterformular sfmUnterformular enthalten (s. Abb. 1).

pic001.tif

Abb. 1: Hauptformular mit zwei synchronisierten Unterformularen

Dieses Unterformular statten Sie mit der Tabelle tblBeispiele als Datenherkunft aus, wobei es beide Felder dieser Tabelle in der Datenblattansicht anzeigen soll (zur Vereinfachung sollen links und rechts jeweils die gleichen Datensätze ein und derselben Tabelle angezeigt werden).

Das Unterformular ziehen Sie einfach zweimal vom Datenbankfenster in das im Entwurf geöffnete Hauptformular und nennen dann das erste Unterformularsteuerelement sfm1 und das zweite sfm2. Achtung, es gibt einen Unterschied zwischen Unterformularsteuerelement und dem darin enthaltenen Formular! Selbstverständlich müssen die Unterformularsteuerelemente verschiedene Namen haben, können aber das gleiche Unterformular enthalten (nachzuprüfen in der Eigenschaft Herkunftsobjekt auf der Registerseite Daten der Steuerelementeigenschaften).

Gegenseitige Abhängigkeit

Die besondere Würze dieses Beispiels ist die Verwendung des gleichen Formulars in beiden Unterformularsteuerelementen. Mal ganz ohne den zugehörigen Code zu beschreiben soll ja bereits beim Wechseln des Datensatzes Folgendes passieren: Unterformular 1 wechselt vom untersten Datensatz zum nächsten Datensatz, der ja gleichzeitig der erste nicht mehr sichtbare Datensatz ist. In diesem Fall soll das Gleiche in Unterformular 2 geschehen – die Datensätze sollen um eine Position nach oben verschoben werden. Dazu sind verschiedene Aktionen notwendig, die unter anderem das Beim Anzeigen-Ereignis von Formular 2 auslösen. Auch das Scrollen von Formular 1 kann prinzipiell (außer per Timer) nur durch das Beim Anzeigen-Ereignis abgefangen werden. Wenn man nun nicht prüft, ob das Beim Anzeigen-Ereignis nicht gerade durch das Scrollen des anderen Formulars ausgelöst wurde, und ein endloses, wechselseitiges Aufrufen vermeiden möchte, muss man dies abfangen.

Wenn nun das erste Unterformular dem zweiten auf irgendeine Weise mitteilen möchte, dass es gerade durch einen Scrollvorgang einen Datensatzwechsel ausgelöst hat, muss das erste Unterformular ja erstmal wissen, dass es überhaupt das erste Unterformular ist – immerhin unterscheiden sich die beiden Unterformulare ja nur dadurch, dass das erste in einem Unterformularsteuerelement etwa namens sfm1 und das zweite in einem anderen namens sfm2 untergebracht ist. Dummerweise kann man aber nicht durch einen Verweis wie Me.Parent auf das Unterformularsteuerelement zugreifen, in dem ein Unterformular steckt, sondern erhält mit Me.Parent direkt einen Verweis auf das Formular, in dem sich das Unterformular befindet.

Selbstidentifikation

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

Workplace

Jahresabonnement TestzugangOder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar