PDA

Vollständige Version anzeigen : Benutzerdefinierten Typ zur Collection hinzu fügen


grzi
20.10.2011, 15:02
Haloo!

Ist es möglich einen benutzerdefinierten Typ einer Collection hinzu zu fügen?
Wollte in einer Klasse eine Collection mit differenten "Typen" füllen, um diese dann später abfragen zu können!

So sieht momentan die Klasse aus:

Option Compare Database
Option Explicit

Private Type Parts
PartID As Long
PartName As String
Part As String
End Type

Private colParts As Collection

' Initialisieren der Collection
Private Sub Class_Initialize()
Dim rsPart As DAO.Recordset
Dim colID As String
Dim tPart As Parts
Set rsPart = CurrentDb.OpenRecordset("Part_tbl")

Set colParts = New Collection

With rsPart
.MoveFirst
Do While Not .EOF
' Gültigen Namen erzeugen:
' Ersetzt Leerzeichen durch Unterstrich
colID = CStr(.Fields("ID").Value)
If Not (Len(colID) > 0) Then Exit Sub
tPart.PartID = .Fields("ID").Value
tPart.PartName = .Fields("PartName").Value
tPart.Part = .Fields("Part").Value

' Benanntes Objekt zur Auflistung hinzufügen.
colParts.Add Item:=tPart, Key:=colID
.MoveNext
Loop
.Close
End With

Set rsPart = Nothing

End Sub


' Terminieren der Collection
Private Sub Class_Terminate()
Dim oPart As Parts
If Not colParts Is Nothing Then
'Icon einzeln vernichten
For Each oPart In colTeile
colParts.Remove oPart.Name
Next oPart
Set colParts = Nothing 'Vernichten der Collection beim Vernichten einer Instanz von cls_IconLeistes
End If
End Sub


Public Function GetPartsName() As String
Dim itm As Parts
For Each itm In colParts
GetParts = GetParts & itm.PartName
Next
End Function


Als Fehler Meldung kommt (Rote Zeile bei Übergabe des Type):

Nur öffentliche, benutzerdefinierte Typen, die in öffentlichen Objektmodulen definiert sind, können als Parameter oder Rückgabetypen für öffentliche Prozeduren von Klassenmodulen oder als Felder öffentlicher, benutzerdefinierter Typen verwendet werden

Daraus werde ich nicht so ganz schlau - öffentlich sollte eine Klasse sein...?:eek:
Könnte mir höchstens vorstellen, dass die Collection mit einem Type nichts anfangen kann und nur Variant / Objects verarbeiten kann - habe aber keine Infos dazu gefunden!

Falls gewollt, kann ich eine DB mit dem Beispiel hochladen - geht mir erst mal darum ob das überhaupt geht - oder ob ich die Idee verwerfen sollte und auf ein Array oder eine SubCls ausweichen sollte...!

Atrus2711
20.10.2011, 15:05
Pack die Type-Deklaration in ein Modul, dann sollte es gehen.

grzi
20.10.2011, 16:34
Pack die Type-Deklaration in ein Modul, dann sollte es gehen.

Habe ich auch schon versucht - kommt aber der selbe Fehler - natürlich habe ich auch die Deklaration von Private nach Public geändert - ändert aber nichts am Fehler!

EDIT: Korrektur der Fehler hat sich etwas geändert:
58329

Scheint mir auf die Vermutung hinaus zu laufen, das die Collection keine Types aufnehmen kann...

ebs17
20.10.2011, 17:49
Sieh mal da rein: Datensammlung - Arrays und Collections (http://*******/mQTt9q)

avogt_at_home
20.10.2011, 17:52
Hallo,
vergiss den benutzerdefinierten Typ und erstell an dessen stelle einfach eine zusätliche Klasse und in dessen Deklarationsteil schreibst du deine gewünschten Eigenschaften einfach als public Variablen.
Ein Beispiel wie das funktioniert zeigt dieser Thread für Excel, geht aber genauso in Access:
http://www.herber.de/forum/archiv/292to296/t293337.htm

Gruß Andreas

grzi
21.10.2011, 10:32
Danke für euren input!

Mich hat aus dem Link von Eberhard die Möglichkeit der Collection in der Collection am meisten fasziniert, so dass ich mich für diese Möglichkeit entschlossen habe!

Mir scheint diese Möglichkeit mehr Vorteile zu bringen als eine SubCls zu erstellen, welche im Prinzip nur ein paar Werte enthält!
Auch läßt sich so der von mir gewünschte Typ recht einfach handhaben...

Anbei das Ergebnis der "Spielerei" im 2000-2003er Format:
58339

Für weitere Anregungen bin ich immer zu haben :)