|
Benutzerdefinierte Variabeln ("UDT"s -
UserDefined Types) können nur dann in Collections oder als Elemente
eines generischen Arrays (Array-Funktion) aufgenommen werden, wenn
sie in einem öffentlichen Klassen-Modul (öffentliche Klasse,
UserControl usw.) deklariert worden sind. Öffentliche
Klassen-Module wiederum können nur in ActiveX-Projekten enthalten
sein.
Über einen kleinen Umweg können Sie diese Beschränkung
allerdings umgehen. Dieser Umweg führt über generische Arrays und
zwei Hilfsfunktionen, die jeweils für den betreffenden
benutzerdefinierten Variablentyp spezifisch angelegt werden werden
müssen.
In der einen Hilfsfunktion werden die Elemente des UDTs mit der
Array-Funktion als Array-Elemente eingelesen. In der anderen
Hilfsfunktion werden die Array-Elemente dem den Elementen des
Rückgabe-UDTs zugewiesen.
Dieses generische Array ist nun voll Variant-kompatibel und kann
problemlos in andere Arrays oder in Collections aufgenommen werden.
Sehen Sie sich dazu das folgende kleine Beispiel an - zunächst
die Deklaration des UDTs und die beiden Hilfsfunktionen, die Sie
etwa in einem Standard-Modul deklarieren können:
Public Type ABC
Counter As Long
DateTime As Date
End Type
Public Function RABC(Arr As Variant) As ABC
With RABC
.Counter = Arr(0)
.DateTime = Arr(1)
End With
End Function
Public Function CABC(abcType As ABC) As Variant
With abcType
CABC = Array(.Counter, .DateTime)
End With
End Function
Der Umweg über die beiden Hilfsfunktionen bringt nur minimalen
Aufwand und so gut wie keine "syntaktischen Verrenkungen"
mit sich, wie die folgende kleine Beispielanwendung zeigt. Hier
werden im Click-Ereignis einer Schaltfläche neue UDT-Instanzen
erzeugt und in eine Collection eingefügt. In einem weiteren
Click-Ereignis einer Schaltfläche wird eine ListBox mit den Daten
der in die Collection aufgenommenen UDTs gefüllt. Und im
Click-Ereignis der ListBox schießlich wird ein spezifischer UDT aus
der Collection ausgelesen, dessen Daten dann in einer MessageBox
angezeigt werden.
Private mItems As Collection
Private mCounter As Long
Private Sub Form_Load()
Set mItems = New Collection
End Sub
Private Sub cmdAdd_Click()
Dim abcType As ABC
Dim Key As String
mCounter = mCounter + 1
With abcType
.Counter = mCounter
.DateTime = Now
End With
Key = "Key" & mCounter
mItems.Add CABC(abcType), Key
End Sub
Private Sub cmdShow_Click()
Dim Item As Variant
lst.Clear
For Each Item In mItems
With RABC(Item)
lst.AddItem Format$(.Counter, "000") & " " & .DateTime
lst.ItemData(lst.NewIndex) = .Counter
End With
Next
End Sub
Private Sub lst_Click()
Dim abcType As ABC
With lst
If .ListIndex >= 0 Then
abcType = RABC(mItems("Key" & .ItemData(.ListIndex)))
With abcType
MsgBox .Counter & vbCrLf & .DateTime
End With
End If
End With
End Sub
Und wenn Sie wollen, können Sie die UDT-Arrays auch direkt (etwa
aus der Collection heraus) verwenden. Praktischerweise sollten Sie
dazu für die Indices der UDTL-Elemente in dem Array eine
Enumeration deklarieren (neben der Deklaration des UDTs):
Public Enum ABCConstants
abcCounter
abcDateTime
End Enum
Der Code im Click-Ereignis der ListBox könnte dann statt dessen
folgendermaßen aussehen:
Private Sub lst_Click()
Dim Item As Variant
With lst
If .ListIndex >= 0 Then
Item = mItems("Key" & .ItemData(.ListIndex))
MsgBox Item(abcCounter) & vbCrLf & Item(abcDateTime)
End If
End With
End Sub
|