Formular mehrfach anzeigen

André Minhorst, Duisburg

In den meisten Fällen reicht eine Instanz eines Formulars zum Darstellen der gewünschten Daten aus. Selbst wenn man einmal zwei oder mehr Datensätze vergleichen möchte, kann man diese in Listenform untereinander anzeigen. Wenn die betreffenden Datensätze allerdings einmal mehr Felder enthalten, als nebeneinander angezeigt werden können, kommt schnell der Wunsch nach der Verwendung mehrerer Instanzen eines Formulars mit unterschiedlichen Datensätzen auf. Wie Sie das realisieren, erfahren Sie im vorliegenden Beitrag.

Die Anzeige mehrerer gleicher Formulare mit verschiedenen Datensätzen ist vor allem sinnvoll, wenn Sie beispielsweise Daten von Artikeln, Kunden, Lieferanten oder Mitarbeitern ansehen und vergleichen möchten.

Wenn Sie die Formulare aus Bild 1 beispielsweise noch nebeneinander positionieren, können Sie die Eigenschaften der Artikel gut miteinander vergleichen.

Bild 1: Mehrere Formularinstanzen mit verschiedenen Artikeln

Mehrere physikalisch vorhandeneFormulare

Wer nicht zu VBA greifen möchte, um mehrere Datensätze gleichzeitig in je einem einzigen Formular anzuzeigen, kann theoretisch das gewünschte Formular mehrmals kopieren und mit unterschiedlichen Namen versehen. Ganz davon abgesehen, dass auch hier ein wenig VBA-Code nötig ist, um beispielsweise zu prüfen, welche Kopie des Formulars schon geöffnet ist und welche man als Nächstes verwendet, hat diese Variante zwei große Nachteile: Erstens müssen Sie änderungen entweder direkt an allen Exemplaren durchführen oder bei jeder änderung alle Kopien löschen und durch neue Kopien des geänderten Originalformulars ersetzen. Zweitens ist diese Variante nicht besonders flexibel: Die Anzahl der verfügbaren Formulare ist in jedem Fall begrenzt.

Mehrere Instanzen eines Formulars

Die alternative Variante besteht in der Verwendung eines einzigen Formulars, das Sie mehrfach öffnen können – und zwar mit verschiedenen Inhalten. Dazu ist zwar ein wenig VBA-Code erforderlich, aber es handelt sich nur um wenige Zeilen, wie Sie nachfolgend sehen werden.

Das nachfolgend beschriebene Beispiel bezieht sich auf die Anzeige von Daten verschiedener Artikel aus der Nordwind-Datenbank. Um den Aufwand beim Nachvollziehen des Beispiels gering zu halten, können Sie einige bereits bestehende Objekte aus der Nordwind-Datenbank verwenden.

Wenn Sie das Beispiel nachvollziehen möchten, legen Sie eine neue, leere Datenbank an und importieren zunächst einige Objekte aus der Nordwind-Datenbank:

  • Führen Sie den Menübefehl Datei/Externe Daten/Importieren… aus.
  • Wählen Sie die Datei Nordwind.mdb aus. Sie befindet sich üblicherweise im Office-Verzeichnis.
  • Importieren Sie die Tabellen Artikel, Kategorien und Lieferanten und das Formular Artikel. (
  • Die Anweisung DoCmd.OpenForm öffnet jeweils die Standardinstanz eines Formulars. Auch das wiederholte Aufrufen bringt keine weiteren Instanzen hervor.

    Ein Formular ist aber ein Objekt und diese lassen sich in der Regel auch mehrfach erzeugen. Dazu deklarieren Sie einfach eine Variable mit einem der gewünschten Formularklasse entsprechenden Datentyp. Diesen Datentyp können Sie ganz leicht ermitteln: Es handelt sich dabei um den Formularnamen mit vorangestelltem „Form_“. Um eine Objektvariable zu deklarieren, deren Datentyp der Klasse des zu erzeugenden Formulars entspricht, verwenden Sie im Fall des Formulars Artikel also folgende Zeile:

    Dim frm As Form_Artikel

    Hinweis

    Wenn Sie eine entsprechende Objektvariable für einen Bericht erzeugen möchten, gehen Sie genauso vor – lediglich das Suffix des Ausdrucks für den Datentyp lautet dann „Report_“.

    Nun füllen Sie die Objektvariable mit dem Objekt:

    Set frm = New Form_Artikel

    Damit haben Sie eine neue Instanz des Formulars erzeugt, die aber noch nicht sichtbar ist. Die nächste Anweisung lautet folglich:

    frm.Visible = True

    Wenn Sie diese drei Anweisungen in eine Prozedur in einem Standardmodul packen und über das Testfenster aufrufen, sollten Sie doch eigentlich die gewünschten Formulare erstellen können.

    Public Sub FormularinstanzErstellen()
        Dim frm As Form_Artikel
        Set frm = New Form_Artikel
        frm.Visible = True
    End Sub

    Oder doch nicht Wenn Sie es ausprobieren, sehen Sie zwar ein kurzes Aufflackern, aber das Formular verschwindet sofort wieder. Kein Wunder: Die innerhalb einer Prozedur deklarierten und erzeugten Objekte leben nicht länger als die Prozedur selbst. Klammern Sie also die Deklaration aus der Prozedur aus und ändern Sie ihren Gültigkeitsbereich auf Public:

    Public frm As Form_Artikel

    Ein erneuter Aufruf der Prozedur FormularinstanzErstellen führt zum Erfolg: Das Artikel-Formular erscheint. Aktivieren Sie einen anderen als den zuerst angezeigten Artikel-Datensatz. Führen Sie die Prozedur zum Erzeugen einer Formularinstanz erneut aus und schauen Sie, was passiert: Das erste Formular verschwindet und ein neues erscheint – das erkennen Sie daran, dass wieder der erste Datensatz der Datenherkunft angezeigt wird. Das war eigentlich zu erwarten, denn der Inhalt der Objektvariablen wird mit dem neuen Objekt überschrieben.

    Wie es aussieht, benötigen Sie also mehrere Objektvariablen, um mehr als eine Instanz des Formulars anzuzeigen. Damit wären Sie wieder an einer ähnlichen Stelle wie am Anfang. Dort gab es ja alternativ zu diesem Weg die Möglichkeit, einfach mehrere gleiche Formulare zu erstellen – und nun soll das statische Deklarieren mehrerer Objektvariablen das Ende vom Lied sein Nein, das ist es natürlich nicht. Objektvariablen können Sie zur Laufzeit deklarieren und erzeugen, so viele Sie möchten – und Sie können auch unterschiedliche Instanzen des gewünschten Objekts damit kontrollieren.

    Formulare im Collection-Objekt

    Das Zauberwort heißt Collection-Objekt. Das ist das Pendant zu Arrays, nur dass Sie darin Objekte aufbewahren und wieder entfernen und natürlich auch auf die enthaltenen Objekte zugreifen können.

    Für ein solches Objekt gelten genau die gleichen Regeln wie für die übrigen Variablen: Sie haben den gleichen Gültigkeitsbereich – also global, objektweit oder prozedurweit – und werden gleichzeitig mit dem Objekt, in dem sie enthalten sind, zerstört.

    Ein Collection-Objekt hat zwei Methoden und zwei Eigenschaften:

  • Add: Fügt ein Objekt hinzu.
  • Remove: Entfernt ein Objekt.
  • Count: Gibt die Anzahl der enthaltenen Objekte wieder.
  • Item: Dient zum Bezugnehmen auf ein bestimmtes Objekt innerhalb der Collection.
  • Im folgenden Beispiel fügen Sie die Kenntnis um die Tatsache, dass man Formular-Objekte beliebig oft erzeugen und diese Objekte in Collections sammeln kann, zu einer kleinen Beispielanwendung zusammen.

    Sie haben bereits erfahren, dass Objekte wie auch Collections wieder zerstört werden, wenn auch das Objekt, in dessen Gültigkeitsbereich Sie diese deklariert haben, zerstört wird.

    Im Beispiel soll dieses Objekt ein Formular sein, das die Artikelbezeichnungen aus der Artikeltabelle in einem Listenfeld anzeigt und einige Schaltflächen zum Anzeigen und Entfernen eines Detailformulars zu dem jeweiligen Artikel enthält. Die damit erzeugten Formularobjekte können manuell wieder geschlossen werden, aber spätestens mit dem Schließen des aufrufenden Formulars ist ihre Zeit vorbei.

    Das Formular ist recht einfach aufgebaut, wie Bild 2 zeigt. Das Listenfeld hat den Namen lstArtikel und als Datensatzherkunft die Tabelle Artikel.

    Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

    den kompletten Artikel im PDF-Format mit Beispieldatenbank

    diesen und alle anderen Artikel mit dem Jahresabo

    2 Kommentare

    1. Hallo André,
      habe noch ein kleines Problem: Wie übergebe ich bei einer neuen Formularinstan „openArgs“?
      Mit Set frm = New Form_Artikel geht die Prozedur sofort in „open“.
      frm.openArgs gibt es zwar, aber zu spät in der Routine.
      Hättest Du einen Tipp?

      Beste Grüße
      Michael Böhme
      Biebergemünd

      1. In diesem Fall würde ich eventuell zu übergebende Werte einfach zuweisen – die Referenz ist dann ja in Form von frm vorhanden. Du kannst dann entweder direkt Werte an Steuerelemente zuweisen oder auch an eine öffentlich deklarierte Variable im Formularklassenmodul.

    Schreibe einen Kommentar