Scix Skrevet 5. juni 2004 Del Skrevet 5. juni 2004 (endret) 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 5. juni 2004 av Scix Lenke til kommentar
aadnk Skrevet 5. juni 2004 Del Skrevet 5. juni 2004 (endret) 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 7. juni 2004 av aadnk Lenke til kommentar
Scix Skrevet 6. juni 2004 Forfatter Del Skrevet 6. juni 2004 hmm... ka skal det så inne i knappen der informasjonen blir henta ut og den kor det skal lagrast? kva er File? Open File For Binary As Free Lenke til kommentar
aadnk Skrevet 6. juni 2004 Del Skrevet 6. juni 2004 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
Scix Skrevet 6. juni 2004 Forfatter Del Skrevet 6. juni 2004 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
aadnk Skrevet 6. juni 2004 Del Skrevet 6. juni 2004 (endret) 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 6. juni 2004 av aadnk Lenke til kommentar
Scix Skrevet 7. juni 2004 Forfatter Del Skrevet 7. juni 2004 no har eg skreve heila prosjektet om igjen slik som du skriver at eg må gjere. men får framleis den samme feilmeldinga. Lenke til kommentar
aadnk Skrevet 7. juni 2004 Del Skrevet 7. juni 2004 Kan du være litt mer spesifikk? Nøyaktig hvilken linje gir denne feilemeldingen? Lenke til kommentar
Scix Skrevet 7. juni 2004 Forfatter Del Skrevet 7. juni 2004 (endret) 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 7. juni 2004 av Scix Lenke til kommentar
aadnk Skrevet 7. juni 2004 Del Skrevet 7. juni 2004 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. Lenke til kommentar
Scix Skrevet 7. juni 2004 Forfatter Del Skrevet 7. juni 2004 (endret) trur eg er begynt på noko som eg ikkje har kunskap til. 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 7. juni 2004 av Scix Lenke til kommentar
Scix Skrevet 10. juni 2004 Forfatter Del Skrevet 10. juni 2004 (endret) 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) Endret 10. juni 2004 av Scix Lenke til kommentar
aadnk Skrevet 10. juni 2004 Del Skrevet 10. juni 2004 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå