Gå til innhold

Anbefalte innlegg

sitter å lager eit programm som skal lagre ein del data om forskellige datamaskiner som me har på skulen.

 

eg har laga ein versjon som lager ei ny fil for kvar maskin, men har lyst til å lage ein versjon der alt blir lagra i ei fil. men da kom eg i tvil korleis eg skulle få programmet til å skrive inn nye data, utan å skrive over dei gamle.

 

nokre som veit?

Endret av Scix
Lenke til kommentar
Videoannonse
Annonse

En mulighet er å bruke UDT for å lagre all informasjonen. Du kan f.eks gjøre dette ved å legge denne koden inn i en modul:

 

Type Computer
   Name As String
   Description As String
   RAM As Double
   Harddrive As Double
   CDRoom As Byte
   CDBurner As Byte
   DVDRoom As Byte
   DVDBurner As Byte
   Monitor As Double ' Tommer
   LCD As Boolean ' LCD eller CTR
   CPUName As String
   CPUSpeed As Double
   MouseName As String
   KeyboardName As String
   SoundCard As String
   ScreenCard As String
End Type

' Forhindrer at prosedyrene ikke prøver å laste inn data fra en gammel versjon
Const CurrentVer As Double = 1

Public Function LoadData(File As String, lpData() As Computer) As Long

Dim Free&, Ver As Double

Erase lpData
Free = FreeFile

Open File For Binary As Free
   Get #Free, , Ver
   
   If Ver <> CurrentVer Then
       LoadData = -1
       Exit Function
   End If
   
   ReDim lpData((LOF(1) - 8) / LenB(lpData(0)) - 1)

   Get #Free, , lpData
Close Free

LoadData = 1

End Function

Public Function SaveData(File As String, lpData() As Computer) As Long

Dim Free&

Free = FreeFile

' Sletter tidligere fil
If Dir(File) <> "" Then Kill File

Open File For Binary As Free
   Put #Free, , CurrentVer
   Put #Free, , lpData
Close Free

SaveData = 1

End Function

 

I begynnelsen av en form kan du etter dette legge til denne koden:

 

Dim Computers() As Computer, Cnt As Long

 

Dette skaper en array som vil holde all data om PC-ene. Cnt er antal datamaskiner i array-en pluss 1. For å legge til en datamaskin, bruk denne koden:

 

ReDim Preserve Computers(Cnt)

' Legg så inn all data her:

Computers(Cnt).Name = "Server"
Computers(Cnt).CPUName =  "AMD Athlon 2800"
Computers(Cnt).DVDBurner = True 
Computers(Cnt).DVDRoom = True
Computers(Cnt).Monitor = 19
Computers(Cnt).Harddrive = 200 ' GB

' Og så videre...

Cnt = Cnt + 1

 

Skal du lagre mer informasjon om hver enkel datamaskin, legger du bare til ønsket variabel i Type-en. Jeg la til CurrentVer for å forhindre at prosedyrene åpner filer som er blitt lagret i en versjon hvor Type Computer var deklarert annerledes. Endre denne når du endrer Type-en.

Endret av aadnk
Lenke til kommentar

File er bare en variabel i den prosedyren.

 

Hvis du har to knapper, cmdOpen og cmdSave, kan du bruke denne koden:

 

Dim Computers() As Computer, Cnt As Long

Private Sub cmdOpen_Click()

LoadData App.Path & IIf(Right(App.Path, 1) = "\", "", "\") & "Data.dat", Computers

End Sub

Private Sub cmdSave_Click()

SaveData App.Path & IIf(Right(App.Path, 1) = "\", "", "\") & "Data.dat", Computers

End Sub

Lenke til kommentar

prøver å adde alle namna på maskinene som skulle vert lagret inne i fila, inn i en list box, men får berre feilmeldingen: Subscript out of range!

 

prøvde meg med denne koden:(den er sikkert feil)


LoadData App.Path & IIf(Right(App.Path, 1) = "\", "", "\") & "Data.dat", Computers

List1.AddItem Computers(Cnt).Namn

Lenke til kommentar

Pga. Cnt alltid er større enn antall elementer i Computers vil derfor Computers(Cnt) resultere en feilmelding. For å legge til alle elementene i Computers kan du f.eks bruke denne koden:

 

Dim Tell&

For Tell = LBound(Computers) To UBound(Computers)
    List1.AddItem Computers(Tell).Namn
Next

 

Hvis du synes følgende kode dette er mer logisk, er det ingenting i veien for at du kan bruke den:

 

Dim Computer As Computer

For Each Computer In Computers
    List1.AddItem Computer.Namn
Next

Endret av aadnk
Lenke til kommentar

denne linja gir feil:

 

For Tell = LBound(Computers) To UBound(Computers)

 

Det som står på kvar enkelt ting i linja når eg helde over:

 

Tell = 0

LBound = LBound(Computers) = <Subscript out of range>

det samme står på UBound

Computers = Nothing

 

Edit:

 

Det er berre når eg skal opne fila!

 

Edit2:

 

La ut programmet slik det er no:

Kode.zip

Endret av Scix
Lenke til kommentar

Beklager, det gikk vel litt for fort i svingene. Jeg la ikke merke til at det manglet en linje i LoadData prosedyren. Nåvel, jeg fikset det iallefall nå, og den skulle være i orden.

 

Slik går det når man ikke sjekker koden godt nok. :no:

Lenke til kommentar

trur eg er begynt på noko som eg ikkje har kunskap til. :blush:

 

no som eg har fått namna over i ein listbox, korleis skal eg da hente ut resten av informasjonen som ligger under dette namnet?

 

eg vil det at bruker kan trykke på namet i listbox-en og få all info inn i ein textbox!

 

Edit: Fikk det til

Endret av Scix
Lenke til kommentar

er ikkje heilt pro enda, så om du kunne ha forklart litt bedre kva all koden i lagre og lese function-en betyr. da blir det kanje litt lettere å programere, og eg kan kansje klare å feilsøke litt sjøl?

 

Sliter med at programmet jobber seint, og ting forsvinner ++

 

ReDim lpData((LOF(1) - 8) / LenB(lpData(0)) - 1)  :dontgetit:

Endret av Scix
Lenke til kommentar

Ok, jeg skal prøve å forklare noen av linjene. Hvis vi først ser på denne linjen:

 

ReDim lpData((LOF(1) - 8) / LenB(lpData(0)) - 1) 

 

ReDim en er kommando som endrer størrelsen på en array. Variabelen etter denne kommandoen er den vi skal endre størrelse på. LOF er lengden på en åpnet fil i bytes (Lenght Of File) og LenB er da lengden av en variabel i Byes.

 

Først vil jeg si hvorfor jeg skrev -8. Dette er fordi vi allerede har hentet 8 bytes med informasjon i denne linjen:

 

Get #Free, , Ver

 

Ver er deklarert som Double, og denne data typen er på 8 bytes.

Videre deler vi på lengden av en post for å finne ut hvor mangen elementer det er plass til ved henting av all data i filen. Til slutt subtraherer vi med 1, ettersom en array teller som standard fra 0.

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å
×
×
  • Opprett ny...