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.4 Formularinstanz-Sammlung

16.2.5 Neue Formularinstanz erzeugen und zur Collection hinzufügen

Nach der Auswahl eines Kontaktes aus dem Listenfeld soll ein Knopfdruck eine Instanz des Formulars frmKontaktdetails öffnen, ohne die bereits vorhandenen Instanzen wieder zu löschen (siehe Abbildung 16.5).

Abbildung 16.5: Öffnen mehrerer Formularinstanzen per Mausklick

Dies soll natürlich nur eine neue Formularinstanz erzeugen, wenn noch kein Formular für diesen Kontakt vorhanden ist. Wird der Kontakt bereits angezeigt, soll das jeweilige Formular einfach aktiviert werden. Außerdem sollen natürlich nicht alle Instanzen des Formulars direkt übereinander erscheinen.

Die folgende Prozedur wird diesen Anforderungen gerecht: Sie ermittelt zunächst die KontaktID und den im Listenfeld angezeigten Namen des aktuellen Kontaktes und speichert diese in entsprechenden Variablen. Dann prüft die Prozedur, ob bereits eine Formularinstanz existiert, die genau diesen Kontakt enthält. Die Anzahl der in der Collection bereits enthaltenen Elemente wird dabei aus zwei Gründen in einer Variablen gespeichert: Erstens lässt sich an diesem Wert überprüfen, ob überhaupt schon Instanzen des Formulars existieren, und falls ja, dient dieser Wert als Endpunkt der For...Next-Schleife, die alle enthaltenen Instanzen auf den angezeigten Inhalt hin überprüft.

Innerhalb dieser Schleife kommt die Tag-Eigenschaft der Formularinstanz zum Tragen: Beim Anlegen einer neuen Instanz weist die Prozedur dieser Eigenschaft einen Wert zu, der aus der Zeichenkette »Kontakt« und dem Wert des Feldes KontaktID des Kontaktes besteht, also beispielsweise »Kontakt12« - dazu später mehr. Während die Prozedur alle Elemente der Collection durchläuft, vergleicht sie jeweils den Wert der Tag-Eigenschaft des enthaltenen Formulars mit dem Wert, den die neue Instanz erhalten würde. Trifft die Prozedur beim Durchlaufen der Schleife auf ein Formular, das genau diesen Tag-Wert hat, bedeutet dies, dass bereits ein Formular für den entsprechenden Kontakt erzeugt wurde. Dieses wird dann mit der SetFocus-Methode aktiviert und die Prozedur wird beendet.

Wenn die Prozedur in diesem Bereich feststellt, dass die Collection entweder noch gar kein Element enthält oder das betroffene Element sich nicht unter den vorhandenen Elementen befindet, erstellt es eine neue Instanz des Formulars für den ausgewählten Kontakt.

Nach der Deklaration und Instanzierung eines neuen Objekts des Typs Form_ frmKontaktdetails erhält dieses die notwendigen Eigenschaftswerte - der Filter wird auf den gewünschten Kontakt-Datensatz eingestellt, die Tag-Eigenschaft enthält einen Wert, der aus der Zeichenkette »Kontakt« und dem Wert des Feldes KontaktID des betroffenen Kontaktes besteht (den Zweck haben Sie bereits weiter oben erfahren), die Überschrift des Formulars wird auf den Namen des Kontaktes eingestellt und schließlich das Formular sichtbar gemacht.

Und dann folgt der wichtigste Schritt: Die Objektvariable, die auf die Formularinstanz verweist, wird der Collection colForms hinzugefügt. Da diese modulweit gültig ist, bleiben die enthaltenen Verweise bis zum Schließen des Formulars bestehen.

Damit nicht alle Instanzen übereinander angezeigt werden, ermittelt die Prozedur noch die Anzahl der vorhandenen Formulare und versetzt das aktuelle Formular um einige Pixel nach rechts unten.

Private Sub cmdDetails_Click()

    Dim i As Integer
    Dim intFormCount As Integer
    Dim lngKontaktID As Long
    Dim strKontakt As String

    If IsNull(Me!lstKontakte) Then
        Exit Sub
    End If

    lngKontaktID = Me!lstKontakte
    strKontakt = Me!lstKontakte.Column(1)

    'Kontrollieren, ob Kontakt schon angezeigt wird...:
    'Anzahl ermitteln
    intFormCount = colForms.Count

    'Prüfen, ob überhaupt schon ein Element vorhanden ist
    If intFormCount > 0 Then
        '... und falls ja, prüfen, ob bereits
        'eines den gewünschten Kontakt enthält
        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

    '... und falls nicht, eine neue Formularinstanz mit dem Artikel
    'erzeugen
    Dim frm As Form_frmKontaktdetails
    Set frm = New Form_frmKontaktdetails

    'Eigenschaften wie anzuzeigender Kontakt, Überschrift und Tag festlegen
    With frm
        .Filter = "KontaktID = " & lngKontaktID
        .FilterOn = True
        .Tag = "Kontakt" & lngKontaktID
        .Caption = "Kontakt: " & strKontakt
        'Formularinstanz sichtbar machen
        .Visible = True
    End With

    'Formularobjekt zur Collection hinzufügen
    colForms.Add frm

    'Aktuelle Anzahl ermitteln
    intFormCount = colForms.Count

    'Formulare entsprechend der Anzahl nach unten rechts verschieben
    DoCmd.MoveSize (intFormCount * 500) + 1000, (intFormCount * 500) + 1000

End Sub

Listing 16.24: Per Mausklick eine weitere Formularinstanz öffnen

Gelöst ist das Problem noch lange nicht: Sie müssen noch zwei Schaltflächen zum Schließen eines bestimmten Formulars beziehungsweise zum Schließen aller geöffneten Formulare mit Leben füllen.

Nächster Abschnitt:

16.2.6 Schließen aller Instanzen des Formulars

© 2006-2008 André Minhorst Alle Rechte vorbehalten.