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"
|