Avatar billede invisibleman Nybegynder
09. marts 2002 - 13:41 Der er 18 kommentarer og
1 løsning

Problem med en .. As New Collection

Jeg har, i et modul, noget kode til at læse en INI fil (indstillinger for mit program). INI filen læses ind i en Collection defineret med:

Public Setting As New Collection

Når INI filen læses første gang initializeres collectionen med keys/værdier. (.Add ..) Keys er tekst og ser f.eks. således ud "Color.Status".

Hvis jeg udskriver en key fra collectionen, f.eks.:

Debug.Print Setting("Color.Status") så får jeg fint værdien, ingen problemer der.

Men prøver jeg istedet at tildele den en værdi går den totalt bananas :(

Setting("Identd.Enable") = chkIdentd_Enable.Value

Giver mig en:

"Run-time error '424':
Object required"

fejl.

Fjerner jeg chkIdentd_Enable.Value og skriver f.eks. 1 er det det samme, det er altså ikke min checkbox der mangler.

Hvad pokker kan problemet være ?
Avatar billede jennemaan Nybegynder
09. marts 2002 - 13:57 #1
Du skal lave din collection i et klassemodul, med tilhørende klasse...
Hermed et eksempel lavet vha. vb classbuilderen (med et par få ændringer:

'Class Setting
Option Explicit

Public Key As String
Public Value As String


'Class Settings (din collection)

Option Explicit

'local variable to hold collection
Private mCol As Collection

Public Function Add(Key As String, Value As Variant) As Setting
    'create a new object
    Dim objNewMember As Setting
    Set objNewMember = New Setting


    'set the properties passed into the method
    objNewMember.Key = Key
    If IsObject(Value) Then
        Set objNewMember.Value = Value
    Else
        objNewMember.Value = Value
    End If
    mCol.Add objNewMember, Key

    'return the object created
    Set Add = objNewMember
    Set objNewMember = Nothing


End Function

Public Property Get Item(vntIndexKey As Variant) As Setting
    'used when referencing an element in the collection
    'vntIndexKey contains either the Index or Key to the collection,
    'this is why it is declared as a Variant
    'Syntax: Set foo = x.Item(xyz) or Set foo = x.Item(5)
  Set Item = mCol(vntIndexKey)
End Property



Public Property Get Count() As Long
    'used when retrieving the number of elements in the
    'collection. Syntax: Debug.Print x.Count
    Count = mCol.Count
End Property


Public Sub Remove(vntIndexKey As Variant)
    'used when removing an element from the collection
    'vntIndexKey contains either the Index or Key, which is why
    'it is declared as a Variant
    'Syntax: x.Remove(xyz)


    mCol.Remove vntIndexKey
End Sub


Public Property Get NewEnum() As IUnknown
    'this property allows you to enumerate
    'this collection with the For...Each syntax
    Set NewEnum = mCol.[_NewEnum]
End Property


Private Sub Class_Initialize()
    'creates the collection when this class is created
    Set mCol = New Collection
End Sub


Private Sub Class_Terminate()
    'destroys collection when this class is terminated
    Set mCol = Nothing
End Sub

'Nu kan du skrive

Dim mSettings As New Settings

mSettings.Add "Whatever.DingDong","Test"

mSettings("Whatever.DingDong").Value="blah blah"

Osv..

/Jennemaan
Avatar billede invisibleman Nybegynder
09. marts 2002 - 13:58 #2
Det burde ikke være nødvendigt med så meget kode for "ingenting" ... og det ved jeg det ikke er ... en Collection er vel ikke readonly ?
Avatar billede terry Ekspert
09. marts 2002 - 13:59 #3
Well I would NOT have thought that Setting("Color.Status") would have worked but then I dont know what setting does! when you place Color.status in "" then it is regarded as string. But if Setting() can handle it then thats fine. So if it can handle ("Color.Status") then it should also be able to handle ("Identd.Enable") UNLESS Identd.Enabled is UNKNOWN!
Avatar billede invisibleman Nybegynder
11. marts 2002 - 00:17 #4
terry:

Setting() is simply a Collection, and "Color.Status" etc. is keys in the collection:

Setting.Add "", "Color.Status"

(.Add value, key ..)

Setting(1) = ".." doesn't work either (using numeric indexes instead of keys to identify an item in the collection)

I'll try jennemaan's code to see if it works ..
Avatar billede invisibleman Nybegynder
11. marts 2002 - 00:24 #5
jennemaan: Hmm .. jeg kan ikke rigtigt se hvor du tildeler en værdi til et item i collectionen ? Der er ingen Public Property Set eller noget ?
Avatar billede nolle_k Nybegynder
11. marts 2002 - 09:04 #6
Det skulle vel ikke være fordi at du rent faktisk skriver

Set Setting("Identd.Enable") = chkIdentd_Enable.Value og ikke

Setting("Identd.Enable") = chkIdentd_Enable.Value
som du skriver i dit spørgsmål???

Det lyder meget som om det er det, der er galt!
Avatar billede jennemaan Nybegynder
11. marts 2002 - 12:53 #7
invisibleman > det er fordi at jeg ikke har definieret dem som properties, men bare som public variable på klassen "Setting"

/Jennemaan
Avatar billede nolle_k Nybegynder
11. marts 2002 - 12:58 #8
Må jeg lige afbryde!!

DET BURDE IKKE være nødvendigt at lave så meget kode for så lidt! Jeg er enig med jennemaan i at det kan være smart at lave en sådan klasse men kun hvis det er større data mængder, der skal gemmes!

På at paste den eksakte kode, der benyttes så vil jeg kigge på den!
Avatar billede invisibleman Nybegynder
14. marts 2002 - 21:11 #9
nolle_k:

Nix ... jeg ved hvad jeg laver ;) Så der er *ikke* Set foran.

Nej, vel ? Jeg synes det er enormt med så meget for så lidt ..
Avatar billede jennemaan Nybegynder
14. marts 2002 - 21:19 #10
En collection skal indeholde objekter...

Derfor kan du ikke bare behandle et item i en collection som en string.

/Jennemaan
Avatar billede nolle_k Nybegynder
15. marts 2002 - 08:51 #11
jennemaan: Det er ikke rigtig!! Du kan smide hvad det skulle være ind i en collection! Det behøver ikke nødvendigvis være objekter!

Jeg prøver igen!!

Prøv at paste koden, der benyttes så skal jeg kigge på det!!!
Avatar billede invisibleman Nybegynder
23. marts 2002 - 23:42 #12
Lukker .. har fundet en anden løsning.
Bruger et array med user defined type istedet.
Avatar billede nolle_k Nybegynder
25. marts 2002 - 08:08 #13
Hold da kæft!!!

Med så meget viden på denne side kan det simpelthen ikke lade sig gøre at finde en løsning på noget jeg bruger HELE tiden og som overhovedet ikke burde være noget problem!!

Det fatter jeg ikke en skid af! Hvis du nu tog og pastede den kode så skulle det ikke tage mig lang tid at finde bommerten!!
For sådan en er der! Man stirrer sig sgu blind på sådan noget lort ind imellem!


//Nolle_K
Avatar billede nolle_k Nybegynder
25. marts 2002 - 08:14 #14
Ha! Nu ved jeg hvad problemet er!!

Du kan smide ALT ind i en Collection men når du skal hente skidtet ud igen skal det være i et objekt!!

Det vil sige at du ikke kan sige

dim s as string

s = Col(Index)

men du derimod skal erklære s som en variant

dim s as variant

s = Col(Index)

Ha!!

Prøv det! Det virker med sikkerhed!!

Nolle_K

Det gik op for mig efter en tur på Daz!
Avatar billede jennemaan Nybegynder
25. marts 2002 - 10:34 #15
nolle_k > var det ikke hvad jeg sagde? ;o)

invisbleman... Nu gik spm jo om hvordan du kunne bruge en collection... At bruge et array af userdefined types er da en simpel løsning - men spørgsmåket gik på hvordan man brugte en collection...

Jeg er ligeglad med point, men lad være med at spilde folks tid (kunne være at de ikke gad svare så)...

Lige et mandagmorgenoghvorerjegtræt-øf.

/Jennemaan
Avatar billede invisibleman Nybegynder
25. marts 2002 - 10:36 #16
jennemaan: Spørgsmålet gik på hvordan jeg brugte en Collection til mit formål, ikke hvordan generelt.
Avatar billede nolle_k Nybegynder
25. marts 2002 - 10:45 #17
Jeg tror vi er lige gode om det!

jennemaan > Som jeg forstod dit svar så gik det på at man ikke kunne smide strenge ind i en collection men at det skulle være objekter hvilket ikke er rigtigt! Det har nok noget at gøre med at VB bag om ryggen på en laver disse strenge om til objecter og derfor forventer en type, der kan indeholde et objekt, når der hentes ting fra en collection!

Det er en af de RIGTIG store ulemper ved VB!! Du har ikke en jordisk chance for at vide, hvad fanden der foregår!
Avatar billede jennemaan Nybegynder
25. marts 2002 - 10:49 #18
nolle_k > man kunne jo starte med at læse dokumentationen ;o)

/Jennemaan
Avatar billede nolle_k Nybegynder
25. marts 2002 - 10:55 #19
Det er jo lettere at gå herind at spørge! Og så vidt jeg ved synes jeg ikke at det står særlig tydeligt der!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB