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).
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:
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).
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: