marbek Skrevet 29. april 2010 Del Skrevet 29. april 2010 Heisann, jeg har laget et program som du kan hente ut og legge til elever ved en tenkt skole! Dette fungerer fint og jeg kan ble i poster ved hjelp av fram og tilbake knapper. Men jeg savner en søke funskjon, er det noen som vet hvordan jeg kan løse dette? Har prøvd med en loop, men det vil ikke funke. Legger ved koden under! Structure StudentPost <VBFixedString(30)> Public navn As String <VBFixedString(5)> Public klasse As String <VBFixedString(25)> Public epost As String <VBFixedString(10)> Public født As Date End Structure Private minStudent As StudentPost Const postlengde = 70 Private antall As Integer Private posisjon As Integer Private filnummer As Integer Private Sub bt_search_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_search.Click Dim sok As String Dim teller As Integer sok = txt_search.Text teller = "0" posisjon = 1 Do Until teller = "1" With minStudent If sok = .navn Then txt_name.Text = .navn txt_class.Text = .klasse txt_email.Text = .epost txt_born.Text = .født teller = "1" Else posisjon = posisjon + 1 MsgBox("error") End If End With Loop End Sub Lenke til kommentar
aadnk Skrevet 2. juli 2010 Del Skrevet 2. juli 2010 (endret) Attributten VBFixedString, FileOpen, FileGet og FileClose ligger i Microsoft.VisualBasic og er først og fremst ment for å gjøre det mulig å automatisk oversette Visual Basic 6.0-programmer (du holder på med VB 7-10). Det er foretrukket at en bruker funksjoner i selve kjernen av .NET (System-navnerommet), men det er ikke i praksis et problem - VisualBasic-bakoverkompatibilitetslaget vil neppe bli fjernet fra .NET. Et slikt postsystem har sine fordeler, blant annet unngår du å måtte legge all informasjonen i RAM-en og det er mulig å endre størrelsen av felter uten å måtte skrive hele filen på nytt, men en er også begrenset av støttede datatyper og den øvre størrelsen i feltene. Disse innsparingene var muligens relevante i VB sin barndom, men i dag vil det være bedre og enklere å bare ha all informasjonen lagret i minne og skrive det ut til disken ved programslutt. I dag blir dette først et problem når man snakker om tusenvis/millioner av poster, og da burde en for lengst gått over til et skikkelig databasesystem med indeksering (Microsoft SQL Server, MySQL, Oracle, ect.). Men hvis antall poster er langt mindre enn dette, går det helt greit å åpne og lagre til en enkel filstruktur. I .NET er det lettest å oppnå dette med serialisering - nær automatisk konvertering fra objekter og til filer (gen. filstrømmer) og tilbake igjen. Dvs. at du kan lagre et objekt (eksempelvis en samling studenter) til en fil, og senere rekonstruerere dette objektet fra den samme filen. Først, gjør om strukturen din til en klasse uten attributtene: Public Class Student Public navn As String Public klasse As String Public epost As String Public født As Date End Class Deretter lager du et felt i formen (eller hovedklassen) som kan inneholde alle studentene. Det er også mulig å indeksere studentene slik at du f. eks. kan slå opp en student etter navn så som tallindeks: ' Dette er en array (som Dim s() As Students) som automatisk utvider seg ' Private studenter As New List(Of Student) Merk at syntaksen ovenfor krever .NET 2.0 eller nyere. Hvis du bruker en eldre versjon, vil du få feilmelding og du må du erstatte List(Of Student) med ArrayList. For å legge til en ny post, bruker du Add-metoden: Dim nyStudent As New Student With nyStudent .Navn = "Test" .Klasse = "Klasse" .Epost = "[email protected]" .Født = New Date(1990, 1, 1) End With Studenter.Add(nyStudent) Hvis du bruker .NET 4.0 kan du gjøre dette i en linje (evt. med en konstruktør før 4.0): studenter.Add(New Student With { navn = "Test", klasse = "Klasse", epost = "[email protected]", født = New Date(1990, 1, 1)} For å endre en student, kan du modifisere feltene direkte med en indeks: With studenter(0) ' første student ' .navn = "nytt navn" .klasse = "ny kasse" ' ect, ' End With Du bør også sjekke at indeksen er korrekt. Studenter.Count gir deg antall studenter i listen, hvor tallindeks 0 er første student og tallindeks Studenter.Count - 1 er siste student. Du kan åpne å søke i listen på to måter - enten ved å indeksere studentene etter f.eks. navn (dette er raskere dersom du har veldig mange studenter), eller du kan gå gjennom hver enkelt student om gangen, som du har forsøkt å gjøre i koden ovenfor. Dette kan du eksempelvis gjøre med en For-løkke: For i = 0 To studenter.Count - 1 ' Det vi er ute etter ' If studenter(i).navn = "Test" Then ' Last inn student etter gitt indeks ' LoadStudent(i) End If Next MessageBox.Show("Feil. Ingen student med det navnet") Hvis du har .NET 3.0 eller nyere, kan du bruke LINQ: ' Husk at LoadStudent-metoden må teste om indeksen er gyldig ' LoadStudent(studenter.FindIndex(Function(s) s.navn = "Test")) Endelig, for å serialisere (lagre) en liste med studenter, gjør du følgende: Try Using output As New IO.FileStream("data.dat", IO.FileMode.Create) ' Legg gjerne til Imports Runtime.Serialization.Formatters.Binary ' Dim Formater As New Runtime.Serialization.Formatters.Binary.BinaryFormatter Formater.Serialize(output, studenter) End Using Catch ex As Exception ' Vis feil ' MessageBox.Show(ex.ToString) End Try For å åpne, gjør du som så: If IO.File.Exists("data.dat") Then Try Using input As New IO.FileStream("data.dat", IO.FileMode.Open) ' Legg gjerne til Imports Runtime.Serialization.Formatters.Binary ' Dim Formater As New Runtime.Serialization.Formatters.Binary.BinaryFormatter studenter = Formater.Deserialize(input) End Using Catch ex As Exception ' Vis feil ' MessageBox.Show(ex.ToString) End Try End If Endret 2. juli 2010 av aadnk 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å