Visual Basic - Lösning Lab 14-2

Option Explicit

Private Sub cmdAvbryt_Click()

'Ingenting att göra mer än att stänga formuläret
Unload Ny

End Sub

Private Sub cmdOK_Click()

'Öka antalet och vektorns storlek med 1
antalPersoner = antalPersoner + 1
ReDim Preserve vektorPerson(antalPersoner)

'Lagra från textboxarnas innehåll i vektorn
vektorPerson(antalPersoner).Förnamn = txtFörnamn.Text
vektorPerson(antalPersoner).Efternamn = txtEfternamn.Text
vektorPerson(antalPersoner).Telefonnummer = txtTelefonnummer.Text

'Stäng formuläret
Unload Ny

End Sub


Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

'Kontrollera att det är 'Esc'-knappen
If KeyCode = 27 Then

'I så fall avbryt
Call cmdAvbryt_Click

End If

End Sub

Private Sub Label3_Click()

End Sub

Option Explicit
Dim visadPerson As Integer

Private Sub cmdFöregående_Click()

'Kontrollera att det går att visa föregående
If visadPerson > 1 Then

'Visa föregåend person
visadPerson = visadPerson - 1
VisaPerson (visadPerson)

Else

MsgBox "Du visar redan den första!"

End If

End Sub

Private Sub cmdNy_Click()

'Öppna formuläret 'Ny' modalt

Ny.Show 1

'Visa den senaste om det finns några att visa
If antalPersoner > 0 Then

VisaPerson (antalPersoner)
txtAntal.Text = Str(antalPersoner)

End If

End Sub

Private Sub cmdNästa_Click()

'Kontrollera att det går att visa nästa
If visadPerson < antalPersoner Then

'Visa nästa person
visadPerson = visadPerson + 1
VisaPerson (visadPerson)

Else


MsgBox "Du visar redan den sista!"

End If

End Sub

Private Sub cmdSpara_Click()

'MsgBox "Här ska du se till att det sparas till filen"

Dim i As Integer 'Loop-variabel
Dim tmpPerson As Person 'Behövs för att beräkna poststorlek

'Öppna filen för att spara
Open FilNamn For Random As #1 Len = Len(tmpPerson)

'Gå igenom alla poster
For i = 1 To antalPersoner


'Spara person nummer 'i'
Put #1, i, vektorPerson(i)

Next i

'Stäng filen
Close #1

End Sub

Private Sub Initiera()

'Nollställ variabler
antalPersoner = 0

'Läs in posterna från filen
Dim tmpPerson As Person 'Används vid inläsning från fil


'Öppna filen för att läsa poster av storleken på 'Person'-strukturen
Open FilNamn For Random As #1 Len = Len(tmpPerson)

'Läs in den första
Get #1, , tmpPerson

'Fortsätt så länge det finns några poster kvar i filen
While Not EOF(1)

'Öka antalet med 1
antalPersoner = antalPersoner + 1

'Gör plats för en till i vektorn
ReDim Preserve vektorPerson(antalPersoner)

'Spara den inlästa i vektorn
vektorPerson(antalPersoner) = tmpPerson

'Hämta nästa
Get #1, , tmpPerson


Wend

'Stäng filen
Close #1

End Sub

Private Sub Form_Load()

'Initiera
Call Initiera

'Kolla om det finns några att visa
If antalPersoner = 0 Then

'Ge varningsinformation
MsgBox "OBS! Det finns inga personer i registret"
txtVisas.Text = "0"
txtAntal.Text = "Tomt"


Else

'Visa den första
Call VisaPerson(1)

'Visa hur många det finns
txtAntal.Text = Str(antalPersoner)

End If

End Sub

Private Sub VisaPerson(nr As Integer)

'Kolla att person 'nr' verkligen finns
If nr < 1 Or nr > antalPersoner Then

'Ge felmeddelande
MsgBox "Person nummer " & nr & " finns inte i registret"
visadPerson = 0

Else


'Håll reda på vilken som visas
visadPerson = nr

'Visa
txtFörnamn.Text = vektorPerson(nr).Förnamn
txtEfternamn.Text = vektorPerson(nr).Efternamn
txtTelefonnummer.Text = vektorPerson(nr).Telefonnummer
txtVisas.Text = Str(visadPerson)

End If

End Sub

Private Sub Form_Unload(Cancel As Integer)

Dim svar

svar = MsgBox("Vill du spara?", vbYesNoCancel)

If svar = vbNo Then
End
End If

If svar = vbYes Then
Call cmdSpara_Click
End
End If


If svar = vbCancel Then
Cancel = True
End If

End Sub

Private Sub mnuAvsluta_Click()

Unload Me
End

End Sub

Private Sub mnuEfternamn_Click()

'Genomför bubbelsortering

'Loopvariabler
Dim i As Integer

'Håller reda på om någon förändring skett
Dim bytt As Boolean

Do
bytt = False


For i = 1 To antalPersoner - 1

'Jämför efternamnen
If vektorPerson(i).Efternamn > vektorPerson(i + 1).Efternamn Then

Dim tmp As Person
tmp = vektorPerson(i)
vektorPerson(i) = vektorPerson(i + 1)
vektorPerson(i + 1) = tmp

bytt = True

End If

Next i

Loop While bytt

'Visa om
Call VisaPerson(visadPerson)


End Sub

Private Sub mnuFörnamn_Click()

'Genomför bubbelsortering

'Loopvariabler
Dim i As Integer

'Håller reda på om någon förändring skett
Dim bytt As Boolean

Do
bytt = False

For i = 1 To antalPersoner - 1

'Jämför förnamnen
If vektorPerson(i).Förnamn > vektorPerson(i + 1).Förnamn Then

Dim tmp As Person
tmp = vektorPerson(i)
vektorPerson(i) = vektorPerson(i + 1)
vektorPerson(i + 1) = tmp

bytt = True

End If

Next i

Loop While bytt

'Visa om
Call VisaPerson(visadPerson)

End Sub

Option Explicit

'Bestäm vilka data som ska lagras
Type Person
Förnamn As String * 20
Efternamn As String * 30
Telefonnummer As String * 20
End Type

'Dynamisk vektor innehållande aktuella poster av typen 'Person'
Public vektorPerson() As Person

'Håller reda på antal personer i vektorn
Public antalPersoner As Integer

'Den fil som används för att lagra personerna
Public Const FilNamn = "personer2.txt"