Formulare mehrfach öffnen mit Dictionary

In einem früheren Artikel namens Mehrere Instanzen eines Formulars haben wir gezeigt, wie Sie ein Formular einer Datenbank mehr als einmal öffnen können. Dabei haben wir ein Collection-Objekt verwendet, um die Objektvariablen mit den verschiedenen Instanzen des Formulars zu speichern. Im vorliegenden Artikel schauen wir uns an, wie wir diese Objektvariablen in einem Dictionary-Objekt statt in einem Collection-Objekt verwalten können und welche Vorteile dies bringt.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1902_DictionaryFormularMehrfach.accdb.

Das Dictionary-Objekt

Das Dictionary-Objekt erläutern wir im Detail im Artikel Auflistungen mit dem Dictionary-Objekt – daher hier nur die notwendigsten Informationen für seine Nutzung. Um das Dictionary-Objekt zu verwenden, fügen Sie dem VBA-Projekt einen Verweis auf die Bibliothek Microsoft Scripting Runtime hinzu (siehe Bild 1).

Verweis auf die Bibliothek Microsoft Scripting Runtime

Bild 1: Verweis auf die Bibliothek Microsoft Scripting Runtime

Die Verweise auf die vom Hauptformular frmKunden-uebersicht aus geöffneten Instanzen des Formulars frmKunde (siehe Bild 2) speichern wir in einem Dictionary-Objekt, dessen Deklaration wir im Klassenmodul des Formulars frmKundenuebersicht unterbringen. Dazu legen wir dort im Kopf des Moduls die folgende Anweisung an:

Mehrfaches öffnen des gleichen Formulars mit verschiedenen Datensätzen

Bild 2: Mehrfaches öffnen des gleichen Formulars mit verschiedenen Datensätzen

Dim dicForms As Dictionary

Die Position der neu zu erstellenden Formulare speichern wir in zwei Variablen namens intPosX und intPosY, die wir ebenfalls dort deklarieren:

Dim intPosX As Integer
Dim intPosY As Integer

Das Hauptformular frmKundenuebersicht zeigt die Einträge für die Kunden in einem Listenfeld an (siehe Bild 3).

Formular zum öffnen der Detailformulare

Bild 3: Formular zum öffnen der Detailformulare

Per Doppelklick auf einen der Listeneinträge kann der Benutzer das Formular zum jeweiligen Kunden öffnen. Dies löst die Prozedur aus Listing 1 aus. Damit diese korrekt funktioniert, muss allerdings beim Laden des Formulars die Variable für das Dictionary-Objekt initialisiert worden sein:

Private Sub lstKunden_DblClick(Cancel As Integer)
     Dim frm As Form_frmKunde
     Dim bolVorhanden As Boolean
     Dim i As Integer
     Static lngOffsetY As Long
     Dim lngXFaktor As Long
     Dim lngYFaktor As Long
     If Not dicForms.Exists(Me!lstKunden) Then
         Set frm = New Form_frmKunde
         With frm
             .Visible = True
             .Caption = Me!lstKunden & " - " & Me!lstKunden.Column(1)
             .Filter = "KundeID = " & Me!lstKunden
             .FilterOn = True
         End With
         dicForms.Add Me!lstKunden, frm
         GetScreenInfo lngXFaktor, lngYFaktor
         intPosX = intPosX + 1
         intPosY = intPosY + 1
         On Error Resume Next
         DoCmd.MoveSize intX * (intPosX - 1) * lngXFaktor, intY * (intPosY - 1) * lngYFaktor + lngOffsetY * lngYFaktor
         If Err.Number = 2498 Then
             intPosX = 1
             intPosY = 1
             lngOffsetY = intY + 30
             DoCmd.MoveSize intX * (intPosX - 1) * lngXFaktor, intY * (intPosY - 1) * lngYFaktor + lngOffsetY * lngYFaktor
         End If
     Else
         dicForms.Item(Me!lstKunden).SetFocus
     End If
End Sub

Listing 1: öffnen eines neuen Formulars

Private Sub Form_Load()
    Set dicForms = New Dictionary
End Sub

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar