Hej
Som svar på det mere tekninske side af Collections klasser,
har jeg nedenfor lavet et eksempel hvordan man kan
lave en Collection klasse.
"Anton Vestergaard" <anton_dkNONO@hotmail.com> wrote in message
news:9730ef$c97$1@news.inet.tele.dk...
> Hej
> Jeg er lige begyndt at lege med klasser og collections (langt om længe).
> Jeg ved bare ikke helt hvordan jeg gør det bedst muligt:
>
> Jeg har en klasse (Objekt) som indeholder et underobjekt. Dette
underobjekt
> er af variabel
> størrelse, alt afhængig af hvilken instans af objektet jeg opretter.
>
> Eksempel:
> Objektet hestevogn oprettes udfra klassen.
> Til hestevognen knytter jeg et antal heste (Underobjekter). Disse
> underobjekter har sine egne egenskaber, metoder o.s.v.
>
> Jeg kan se at den bedste måde at gøre det på er at have en klasse der
hedder
> hestevogn og en klasse der hedder hest, MEN:
> Hvordan håndterer jeg samlingen af heste i hestevogn? Skal jeg have et
> collection indeni hestevogn (det tror jeg selv)?
> I bekræftende fald, hvorledes tilgår jeg jeg så den collection udefra?
> (Count, Add, Remove, Enum)!
>
> Eller skal jeg lave en CollectionClass (Tror jeg nok det hedder!), således
> at jeg ender op med 3 klasser:
> Klassen: Hestevogn
> Klassen: Hest
> Klassen: Hestesamling
>
> Og hvorledes kan jeg så gøre det?
>
> Jeg håber der er nogen der kan hjælpe mig.
>
> På forhånd tak.
> Anton
Option Explicit
Private InternCollection As Collection
Private Sub Class_Initialize()
Set InternCollection = New Collection
End Sub
Private Sub Class_Terminate()
Set InternCollection = Nothing
End Sub
Public Function Add(ItemObjekt As ItemClass, key As String) As ItemClass
' Man kan godt lave add funktionen så den
' ikke returnere noget. Men sådan her plejer
' jeg at lave den.
' ItemClass Er den type du gerne vil ha' ind i Collection
' Hvis du flere forskellige klasser i din collection, så
' skal man overvej at bruge Implements.
' Key tilpasser efter hvordan man hurtigst vil genfinde ItemClass
InternCollection.Add ItemObjekt, key
' En variant kunne være
' InternCollection.Add ItemObjekt, ItemObjekt.Key
' Hvor Objektet selv bestemme hvad dens key er. Dette
' er mange gange en fordel.
Set Add = ItemObjekt
End Function
Public Function Count() As Long
Count = InternCollection.Count
End Function
Public Sub Clear()
InternCollection.Count
End Sub
Public Function Item(index As Variant) As ItemClass
' Husk index både kan være key og index. (her
' kan man igen indskræke til nettop sit behov)
' Jeg kan ikke lide at en collection rejser en
' fejl når den ikke kan finde Item'et
' Så derfor returnere jeg Nothing hvis jeg ikke
' finder noget.
On Error GoTo Findes_ikke
Set Item = InternCollection.Item(index)
Exit Function
Findes_ikke:
' Denne error handling kan laves pænere
Err.Clear
Set Item = Nothing
End Function
' For at få For Each til at virke, skal man
' implementere følgende funktion
Public Function NewEnum() As IUnknown
' Når man har lavet denne funktion, gør så følgende:
' 1) Vælg menupunkt Tools -> Procedure Attriutes
' 2) I vælg funktionen NewEnum
' 3) Tryk på Advanced
' 4) Vælg: Hide this member
' 5) I textbox'en Procedure ID overskrives (None) med -4
' (Det ser måske lidt mærkeligt ud, men det virker
Set NewEnum = Collection.[_NewEnum]
End Function
Mvh
Niels G