Mit in Klassen verpackten Collections
können Sie leicht einfache Speicher- und Ablage-Konzepte
realisieren. Eines der schlichtesten Konzepte dieser Art ist eine so
genannte Queue, eine "Schlange". Das Prinzip kennen Sie
von den Warteschlangen am Bankschalter usw. her: Die neu
eintreffenden Kunden stellen sich hinten an, und die Bedienung am
Schalter "entfernt" den jeweils vordersten Kunden in der
Schlange, indem er bedient wird. Ein ähnliches Konzept finden Sie
unter "Stapeln
mit Push und Pop".
Mit einer Collection realisieren Sie eine solche Schlange, indem
Sie einfach neue Elemente ans Ende hinzufügen - und nur vom Anfang
her entnehmen:
MeineCollection.Add Item
und
Item = MeineCollection(1)
MeineCollection.Remove 1
Haben Sie Objekt-Referenzen auf dem Stapel abgelegt, müssen Sie
beim Entnehmen noch unterscheiden:
If IsObject(MeineCollection(1)) Then
Set Item = MeineCollection(1)
Else
Item = MeineCollection(1)
End If
MeineCollection.Remove 1
Verpacken Sie diese Funktionalität in eine eigene
Collection-Klasse, erhalten Sie eine Collection, die sich immer
automatisch nach diesem Prinzip verhält.
Und - wenn schon, denn schon: Auf die Information, wie
"lang" die "Schlange" ist (Eigenschaft Count),
brauchen Sie genau so wenig zu verzichten, wie auf die Möglichkeit,
den Inhalt eines beliebigen in die Schlange eingereihten Elements zu
erfragen (Eigenschaft Item) oder zu entfernen (Methode Remove mit
optional angegebenem Index oder Schlüssel). Dazu noch eine Methode,
die das Collection-Objekt sowieso vermissen lässt, nämlich mit
einem simplen Clear den Inhalt der ganzen Schlange auf einen Schlag
ins (Daten-)Nirwana zu befördern.
Die Methode Remove zum Entfernen eines Elements aus der Schlange
ist übrigens nicht als Funktion ausgeführt, wie Sie vielleicht
erwartet hätten. Wäre sie als Funktion ausgeführt, die das
entnommene Element als Rückgabewert übergibt, könnten Sie beim
Aufruf nicht feststellen, ob Ihnen gerade ein Objekt zurückgegeben
wird. Da Ihnen das Element jedoch als Rückgabe-Parameter übergeben
wird, können Sie erst mit IsObject prüfen, ob es sich um ein
Objekt handelt.
Private mQueue As Collection
Public Enum QueueErrorConstants
qErrUnknown = vbObjectError + 10000
qErrInvalidKeyIndex = vbObjectError + 10001
qErrKeyExists = vbObjectError + 10002
qErrQueueIsEmpty = vbObjectError + 10003
End Enum
Public Property Get Count() As Long
Count = mQueue.Count
End Property
Public Property Get Item(KeyIndex As Variant) As Variant
Const ProcName = "cQueue.Item"
On Error GoTo Item_Error
If IsObject(mQueue(KeyIndex)) Then
Set Item = mQueue(KeyIndex)
Else
Item = mQueue(KeyIndex)
End If
Exit Property
Item_Error:
If Err.Number = 5 Then
Err.Raise qErrInvalidKeyIndex, ProcName
Else
Err.Raise qErrUnknown, ProcName
End If
End Property
Public Sub Add(Item As Variant, Optional Key As String)
Const ProcName = "cQueue.Add"
On Error Resume Next
mQueue.Add Item, Key
Select Case Err.Number
Case 0
Case 457
On Error GoTo 0
Err.Raise qErrKeyExists, ProcName
Case Else
On Error GoTo 0
Err.Raise qErrUnknown, ProcName
End Select
End Sub
Public Sub Clear()
Set mQueue = New Collection
End Sub
Public Sub Remove(Item As Variant, Optional KeyIndex As Variant = 1)
Const ProcName = "cQueue.Item"
If mQueue.Count Then
On Error GoTo Remove_Error
If IsObject(mQueue(KeyIndex)) Then
Set Item = mQueue(KeyIndex)
Else
Item = mQueue(KeyIndex)
End If
mQueue.Remove KeyIndex
Else
Err.Raise qErrQueueIsEmpty, ProcName
End If
Exit Sub
Remove_Error:
If Err.Number = 5 Then
Err.Raise qErrInvalidKeyIndex, ProcName
Else
Err.Raise qErrUnknown, ProcName
End If
End Sub
Public Function NewEnum() As IUnknown
Set NewEnum = mQueue.[_NewEnum]
End Function
Private Sub Class_Initialize()
Set mQueue = New Collection
End Sub
Private Sub Class_Terminate()
Set mQueue = Nothing
End Sub

|