Gå til innhold

Lagring av all data i ein Collection?


Anbefalte innlegg

Jeg har en collection med egen definerte classer som jeg skulle ha lagret til hardisken og hente opp igjenn...

 

er det mulig og bruke propertybag til dette?

 

class'en min bestar av folgende:

'clsItems
Public Text As String
Public Application As String
Public Icon As Picture

Ingenting egentlig, men hvordan kan jeg lagre en hauv(collection) av disse fort og enkelt?

 

[EDIT] Ikke lost avlike vel... TRENGER HJELP!

hvordan kan jeg lagre en collection av objecter enkelt?

 

btw koden min er na:

Public Function Save(StrName As String, Obj As Object)
Dim FF As Long, b() As Byte
FF = FreeFile
Open strData For Binary Access Write As #FF
   Dim PB As New PropertyBag
   PB.WriteProperty StrName, Obj
   
   Put #FF, , PB.Contents
Close #FF
End Function

 

Eksempel kode:

Dim User As New clsUser
User.Password = "test"
User.UserID = Users.Count
User.UserName = "Administrator"
Users.Add User, User.UserName

Save.Save "Users", Users

 

clsUser:

Option Explicit

Public UserID As Long
Public UserName As String
Public Password As String

Endret av Richard87
Lenke til kommentar
Videoannonse
Annonse

For å få dette til å fungere, må du endre Persistable-egenskapen til klassemodulen din til «1 - Persistable», slik at du får tilgang til ReadProperty- og WriteProperty-hendelsene. Denne egenskapen blir kun tilgjengelig dersom klassen er synlig utenfor prosjektrekkevidden - dvs. at Instancing ikke er avmarkert som «1 - Private» - hvilket simpelthen ikke kan gjøres dersom prosjektet ditt er av typen Standard EXE. I så fall må du enten plassere klassemodulen i en ekstern DLL-fil (ActiveX DLL), eller endre prosjekttypen innunder Project -> [prosjektnavn] Properties -> Project Type til ActiveX EXE. I samme slengen er det nok fordelaktig å sette Start Mode (lokalisert under klaffen Component) til Standalone.

 

I hvert fall, i ditt tilfelle blir koden som følger:

 

Private Sub Class_ReadProperties(PropBag As PropertyBag)

 

    Set Icon = PropBag.ReadProperty("Icon", Nothing)

    Text = PropBag.ReadProperty("Text", "")

    Application = PropBag.ReadProperty("Application", "")

 

End Sub

 

Private Sub Class_WriteProperties(PropBag As PropertyBag)

 

    PropBag.WriteProperty "Icon", Icon

    PropBag.WriteProperty "Text", Text, ""

    PropBag.WriteProperty "Application", Application, ""

 

End Sub

 

Denne metoden er for øvrig kun egnet for mindre datamengder der antall elementer ikke overstiger 1000. Dersom du skal lagre mer data, kan du enten benytte en array (og laste inn klassemodulene når det trengs), eller et databasesystem.

Endret av aadnk
Lenke til kommentar

Hehe, indeed chills, men det sa ganske mye mer stress ut...

her er enn annen losning jeg bruker na.. (la til en "Contents" funksjon i clsUser..

Option Explicit

Public UserID As Long
Public UserName As String
Public Password As String
Private pb As New PropertyBag

Public Property Get Contents()
pb.WriteProperty "UserID", UserID
pb.WriteProperty "UserName", UserName
pb.WriteProperty "Password", Password
Contents = pb.Contents
End Property

Public Property Let Contents(B() As Byte)
pb.Contents = B()
UserID = pb.ReadProperty("UserID")
UserName = pb.ReadProperty("UserName")
Password = pb.ReadProperty("Password")
End Property

 

Public Function Save()
Dim FF As Long, B() As Byte, Obj As clsUser
FF = FreeFile
Open strData For Binary Access Write As #FF
   For Each Obj In Users
       B() = Obj.Contents
       Put #FF, , CLng(Len(B))
       Put #FF, , B()
   Next
Close #FF
End Function

 

og sa bare modifisere Open koden...

 

Men tusen takk for hjelpen.. veldig laere rikt...;)

 

[EDIT] jeg har litt problemer med og sette contents i PropertyBag'en..

Public Function SetContents(bContents As Byte, lLenght As Long)
On Error Resume Next
ReDim b(lLenght) As Byte
CopyMemory bContents, b(0), lLenght
Debug.Print UBound(b)
pb.Contents = b()
UserID = pb.ReadProperty("UserID")
UserName = pb.ReadProperty("UserName")
Password = pb.ReadProperty("Password")
End Function

Jeg far feil melding pa "pb.Contents = b()"

Invalid procedure call or argument (Error 5)

Endret av Richard87
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...