Warum noch ein Access-Buch?
Für wen ist das Buch?
Jetzt bestellen
+ direkter Download des eBooks!
Nur EUR 59,95!
Fehler gefunden?
Bitte melden!
Wünsche an das Buch?
Her damit!
Was denken die Leser über dieses Buch?
Lesen Sie aktuelle Rezensionen!
Kapitel des noch nicht veröffentlichten Buchs zum Downloaden, Probelesen und Kommentieren
Beispieldatenbanken
Zusätzliches Material

Das Buch im HTML-Format

Für unbestimmte Zeit bieten Addison-Wesley und André Minhorst den kompletten Inhalt des Buchs als Download an. Schauen Sie rein und informieren Sie sich über den Inhalt! Und wenn Ihnen das Buch nützlich erscheint und Sie glauben, dass Sie etwas gelernt haben oder durch das Gelesene sogar etwas Zeit und somit Geld bei Ihrer Arbeit einsparen konnten, können Sie sich ja beim Autor und beim Verlag revanchieren - beispielsweise durch den Kauf dieses Buchs.

Am schönsten wäre es natürlich, wenn Sie das Buch direkt hier bestellen - Sie erhalten das Buch dann direkt vom Verlag, und der Autor und Verlag haben dann noch mehr davon, als wenn Sie es anderswo kaufen.

Danke für Ihr Interesse!

16.2.6 Schließen aller Instanzen des Formulars

16.2.7 Schließen einer bestimmten Instanz

Die Möglichkeit, mehrere Instanzen eines Formulars mit verschiedenen Datensätzen zu erzeugen, ist in vielen Fällen vermutlich die ergonomischste Lösung für die gleichzeitige Ansicht mehrerer Datensätze. Das gilt vor allem, wenn die durch die Datensätze repräsentierten Objekte so viele Daten enthalten, dass diese nicht nebeneinander auf einer Bildschirmbreite angezeigt werden können. Außerdem kann der Benutzer mit dieser Methode die Formulare mit den interessanten Daten auch noch so anordnen, wie es für den jeweiligen Fall am sinnvollsten ist. Es fehlen noch einige kleine Schritte, um die ergonomischen Vorteile dieser Lösung zu vollkommnen:

  • Die Formularinstanzen sollten auch per Doppelklick in das Listenfeld geöffnet werden können.
  • Der Benutzer soll auch einzelne Formulare vom Übersichtsformular aus schließen können.
  • Die Formulare sollen auch mit der dafür vorgesehenen Schaltfläche geschlossen werden können.
  • Der erste Wunsch ist reine Code-Optimierung. Fügen Sie den gesamten Code der Ereignisprozedur cmdDetails_Click in eine neue Prozedur namens InstanzOeffnen ein. Die beiden Variablen lngKontaktID und strKontakt sollen weiterhin von der aufrufenden Routine ermittelt und an die Prozedur InstanzOeffnen übergeben werden.

    Die Ereignisprozedur cmdDetails_Click sieht nunmehr wie folgt aus:

    Private Sub cmdDetails_Click()
        InstanzOeffnen Me!lstKontakte, Me!lstKontakte.Column(1)
    End Sub

    Listing 16.28: Aufruf der Prozedur InstanzOeffnen beim Klick auf die Schaltfläche cmdDetails ...

    Die gleiche Anweisung sorgt beim Doppelklick ins Listenfeld lstKontakte für den Aufruf der Prozedur InstanzOeffnen:

    Private Sub lstKontakte_DblClick(Cancel As Integer)
        InstanzOeffnen Me!lstKontakte, Me!lstKontakte.Column(1)
    End Sub

    Listing 16.29: ... und beim Doppelklick auf den gewünschten Eintrag im Listenfeld

    Fehlt noch die in die neue Prozedur »extrahierte« Funktionalität (Erläuterungen siehe Listing 16.24):

    Private Sub InstanzOeffnen(lngKontaktID As Long, strKontakt As String)

        Dim i As Integer
        Dim intFormCount As Integer
        Dim frm As Form_frmKontaktdetails

        intFormCount = colForms.Count

        If intFormCount > 0 Then
            For i = 1 To intFormCount
                If colForms.Item(i).Form.Tag = "Kontakt" & lngKontaktID Then
                    colForms.Item(i).Form.SetFocus
                    Exit Sub
                End If
            Next i
        End If

        Set frm = New Form_frmKontaktdetails

        With frm
            .Filter = "KontaktID = " & lngKontaktID
            .FilterOn = True
            .Tag = "Kontakt" & lngKontaktID
            .Caption = "Kontakt: " & strKontakt
            .Visible = True
        End With
        colForms.Add frm, "Kontakt" & lngKontaktID
        intFormCount = colForms.Count
        DoCmd.MoveSize (intFormCount * 500) + 1000, (intFormCount * 500) + 1000

    End Sub

    Listing 16.30: Extrahierte Fassung der Funktionalität zum Anlegen einer neuen Formularinstanz

    Der Wunsch nach dem Schließen einzelner Formularinstanzen wahlweise vom Übersichtsfenster aus oder direkt per Schließen-Schaltfläche des Formulars schreit ebenso wie im obigen Fall nach Bereitstellung einer Routine, die von den entsprechenden Stellen aus aufgerufen werden kann.

    Warum aber kann man das Formular nicht einfach mit seiner Schließen-Schaltfläche verschwinden lassen? Ganz einfach: Weil es dann nicht aus der Collection entfernt wird. Zugriffe auf den zurückgelassenen Eintrag in der Collection würden in der Folge zu Fehlern führen.

    Daher wird die InstanzSchliessen-Prozedur aus folgendem Listing auch vom zu schließenden Formular aus aufgerufen und deshalb als Public deklariert. Die Prozedur überprüft genau wie die Prozedur zum Schließen aller Formulare, ob das Formular noch zu speichernde Daten enthält, und bricht den Vorgang gegebenenfalls ab.

    Wenn dem Schließen aber nichts mehr im Wege steht, entfernt die Prozedur das durch den Eingangsparameter strTag charakterisierte Formular aus der Collection und schließt es damit.

    Public Sub InstanzSchliessen(strTag As String)

        Dim frm As Form_frmKontaktdetails

        On Error GoTo InstanzSchliessen_Err

        'Per Objektvariable auf die Formularinstanz verweisen
        Set frm = colForms.Item(strTag)

        'Nur wenn der Inhalt des Formulars seit dem letzten
        'Speichern nicht geändert wurde:
        If frm.Dirty = False Then
            'Tag des Formulars leeren
             frm.Tag = ""
             'Formular aus Collection entfernen und damit schließen
             colForms.Remove strTag
        End If

    InstanzSchliessen_Exit:
        Exit Sub
    InstanzSchliessen_Err:
        'Formular nicht mehr vorhanden
        If Err.Number = 5 Or Err.Number = 9 Then
            GoTo InstanzSchliessen_Exit
        Else
            MsgBox Err.Number & " " & Err.Description
            GoTo InstanzSchliessen_Exit
        End If
    End Sub

    Listing 16.31: Funktion zum Schließen eines Formulars

    Im Vergleich zur Prozedur aus Listing 16.27 fällt die zusätzliche Anweisung frm.Tag = "" auf: Ihre Bedeutung wird nachfolgend erläutert.

    Nächster Abschnitt:

    16.2.8 Schließen-Vorgang des Formulars anpassen

    © 2006-2008 André Minhorst Alle Rechte vorbehalten.