Visual Basic -kurssi menossa koulussa ja nyt ilmaantui ongelma, johon en löytänyt vastausta netistä.
Harjoitus 5.1
Tee ohjelma, jossa tutkitaan käyttäjän
* tunnus ja salasana. (esim. InputBox ja If -rakenne)
* tervehdys (Select Case)
Miten saisin koodin toimimaan niin, ettei tarvitse jokaisen if:n tai elseif:n jälkeen laittaa select case rimpsua?
Private Sub Form_Load()
lstKäyttäjätunnus.AddItem "tun"
lstKäyttäjätunnus.AddItem "jaa"
lstKäyttäjätunnus.AddItem "aun"
lstKäyttäjätunnus.AddItem "run"
lstKäyttäjätunnus.AddItem "saa"
lstKäyttäjätunnus.AddItem "iaa"
End Sub
Private Sub cmdKirjaudu_Click()
If lstKäyttäjätunnus = "tun" And txtSalasana.Text = "qwerty" Then
Select Case lstKäyttäjätunnus.ListIndex
Case 0
lblTervehdys.Caption = "Tervetuloa, Tanja"
Case 1
lblTervehdys.Caption = "Tervetuloa, Janne"
Case 2
lblTervehdys.Caption = "Tervetuloa, Anneli"
Case 3
lblTervehdys.Caption = "Tervetuloa, Raimo"
Case 4
lblTervehdys.Caption = "Tervetuloa, Sirkka"
Case 5
lblTervehdys.Caption = "Tervetuloa, Ilmo"
End Select
ElseIf lstKäyttäjätunnus = "jaa" And txtSalasana.Text = "pinus" Then
Select Case lstKäyttäjätunnus.ListIndex
Case 0
lblTervehdys.Caption = "Tervetuloa, Tanja"
Case 1
lblTervehdys.Caption = "Tervetuloa, Janne"
Case 2
lblTervehdys.Caption = "Tervetuloa, Anneli"
Case 3
lblTervehdys.Caption = "Tervetuloa, Raimo"
Case 4
lblTervehdys.Caption = "Tervetuloa, Sirkka"
Case 5
lblTervehdys.Caption = "Tervetuloa, Ilmo"
End Select
ElseIf lstKäyttäjätunnus = "aun" And txtSalasana.Text = "lotta" Then
Select Case lstKäyttäjätunnus.ListIndex
Case 0
lblTervehdys.Caption = "Tervetuloa, Tanja"
Case 1
lblTervehdys.Caption = "Tervetuloa, Janne"
Case 2
lblTervehdys.Caption = "Tervetuloa, Anneli"
Case 3
lblTervehdys.Caption = "Tervetuloa, Raimo"
Case 4
lblTervehdys.Caption = "Tervetuloa, Sirkka"
Case 5
lblTervehdys.Caption = "Tervetuloa, Ilmo"
End Select
ElseIf lstKäyttäjätunnus = "run" And txtSalasana.Text = "hessu" Then
Select Case lstKäyttäjätunnus.ListIndex
Case 0
lblTervehdys.Caption = "Tervetuloa, Tanja"
Case 1
lblTervehdys.Caption = "Tervetuloa, Janne"
Case 2
lblTervehdys.Caption = "Tervetuloa, Anneli"
Case 3
lblTervehdys.Caption = "Tervetuloa, Raimo"
Case 4
lblTervehdys.Caption = "Tervetuloa, Sirkka"
Case 5
lblTervehdys.Caption = "Tervetuloa, Ilmo"
End Select
ElseIf lstKäyttäjätunnus = "saa" And txtSalasana.Text = "aapo" Then
Select Case lstKäyttäjätunnus.ListIndex
Case 0
lblTervehdys.Caption = "Tervetuloa, Tanja"
Case 1
lblTervehdys.Caption = "Tervetuloa, Janne"
Case 2
lblTervehdys.Caption = "Tervetuloa, Anneli"
Case 3
lblTervehdys.Caption = "Tervetuloa, Raimo"
Case 4
lblTervehdys.Caption = "Tervetuloa, Sirkka"
Case 5
lblTervehdys.Caption = "Tervetuloa, Ilmo"
End Select
ElseIf lstKäyttäjätunnus = "iaa" And txtSalasana.Text = "kaura" Then
Select Case lstKäyttäjätunnus.ListIndex
Case 0
lblTervehdys.Caption = "Tervetuloa, Tanja"
Case 1
lblTervehdys.Caption = "Tervetuloa, Janne"
Case 2
lblTervehdys.Caption = "Tervetuloa, Anneli"
Case 3
lblTervehdys.Caption = "Tervetuloa, Raimo"
Case 4
lblTervehdys.Caption = "Tervetuloa, Sirkka"
Case 5
lblTervehdys.Caption = "Tervetuloa, Ilmo"
End Select
Else
lblTervehdys.Caption = "Väärä salasana"
End If
End SubHarjoitus 5.2
Muuta edellistä tehtävää niin, että käyttäjällä on kolme mahdollisuutta arvata tunnus ja salasana (For -silmukka)
Tämä oli ihan sekavaa minulle. Eli sama kysymys kuin edelliseen, eli myös tässä on nuo kaikki select case rimpsut tuolla if:n ja elseif:n välissä.
Lisäksi haluaisin, että ohjelma ilmottaisi kolmannen yrityksen jälkeen "Väärä salasana" ja samuttaisi automaattisesti ohjelman. Nyt en saa sitä ainakaan tällä koodilla toimimaan.
Lisäksi nyt se valittaa "End If without block If", ei ymmärrä.
Private Sub Form_Load()
lstKäyttäjätunnus.AddItem "tun"
lstKäyttäjätunnus.AddItem "jaa"
lstKäyttäjätunnus.AddItem "aun"
lstKäyttäjätunnus.AddItem "run"
lstKäyttäjätunnus.AddItem "saa"
lstKäyttäjätunnus.AddItem "iaa"
End Sub
Private Sub cmdKirjaudu_Click()
For i = 1 To 4
If lstKäyttäjätunnus = "tun" And txtSalasana.Text = "qwerty" Then
Select Case lstKäyttäjätunnus.ListIndex
Case 0
lblTervehdys.Caption = "Tervetuloa, Tanja"
Case 1
lblTervehdys.Caption = "Tervetuloa, Janne"
Case 2
lblTervehdys.Caption = "Tervetuloa, Anneli"
Case 3
lblTervehdys.Caption = "Tervetuloa, Raimo"
Case 4
lblTervehdys.Caption = "Tervetuloa, Sirkka"
Case 5
lblTervehdys.Caption = "Tervetuloa, Ilmo"
End Select
ElseIf lstKäyttäjätunnus = "jaa" And txtSalasana.Text = "pinus" Then
Select Case lstKäyttäjätunnus.ListIndex
Case 0
lblTervehdys.Caption = "Tervetuloa, Tanja"
Case 1
lblTervehdys.Caption = "Tervetuloa, Janne"
Case 2
lblTervehdys.Caption = "Tervetuloa, Anneli"
Case 3
lblTervehdys.Caption = "Tervetuloa, Raimo"
Case 4
lblTervehdys.Caption = "Tervetuloa, Sirkka"
Case 5
lblTervehdys.Caption = "Tervetuloa, Ilmo"
End Select
ElseIf lstKäyttäjätunnus = "aun" And txtSalasana.Text = "lotta" Then
Select Case lstKäyttäjätunnus.ListIndex
Case 0
lblTervehdys.Caption = "Tervetuloa, Tanja"
Case 1
lblTervehdys.Caption = "Tervetuloa, Janne"
Case 2
lblTervehdys.Caption = "Tervetuloa, Anneli"
Case 3
lblTervehdys.Caption = "Tervetuloa, Raimo"
Case 4
lblTervehdys.Caption = "Tervetuloa, Sirkka"
Case 5
lblTervehdys.Caption = "Tervetuloa, Ilmo"
End Select
ElseIf lstKäyttäjätunnus = "run" And txtSalasana.Text = "hessu" Then
Select Case lstKäyttäjätunnus.ListIndex
Case 0
lblTervehdys.Caption = "Tervetuloa, Tanja"
Case 1
lblTervehdys.Caption = "Tervetuloa, Janne"
Case 2
lblTervehdys.Caption = "Tervetuloa, Anneli"
Case 3
lblTervehdys.Caption = "Tervetuloa, Raimo"
Case 4
lblTervehdys.Caption = "Tervetuloa, Sirkka"
Case 5
lblTervehdys.Caption = "Tervetuloa, Ilmo"
End Select
ElseIf lstKäyttäjätunnus = "saa" And txtSalasana.Text = "aapo" Then
Select Case lstKäyttäjätunnus.ListIndex
Case 0
lblTervehdys.Caption = "Tervetuloa, Tanja"
Case 1
lblTervehdys.Caption = "Tervetuloa, Janne"
Case 2
lblTervehdys.Caption = "Tervetuloa, Anneli"
Case 3
lblTervehdys.Caption = "Tervetuloa, Raimo"
Case 4
lblTervehdys.Caption = "Tervetuloa, Sirkka"
Case 5
lblTervehdys.Caption = "Tervetuloa, Ilmo"
End Select
ElseIf lstKäyttäjätunnus = "iaa" And txtSalasana.Text = "kaura" Then
Select Case lstKäyttäjätunnus.ListIndex
Case 0
lblTervehdys.Caption = "Tervetuloa, Tanja"
Case 1
lblTervehdys.Caption = "Tervetuloa, Janne"
Case 2
lblTervehdys.Caption = "Tervetuloa, Anneli"
Case 3
lblTervehdys.Caption = "Tervetuloa, Raimo"
Case 4
lblTervehdys.Caption = "Tervetuloa, Sirkka"
Case 5
lblTervehdys.Caption = "Tervetuloa, Ilmo"
End Select
Else
lblTervehdys.Caption = "Väärä salasana"
End If
If i > 3 Then lblTervehdys.Caption = "Väärä salasana"
Unload Me
End If
Next i
End SubIso kiitos kaikille auttaville neroille!
5.1. Selkein ratkaisu olisi tallentaa kaikki nimet, tunnukset ja salasanat taulukkoon, jolloin koodi kutistuisi muutamaan riviin. Mutta jos teillä ei ole vielä käsitelty taulukoita, niin helppo ratkaisu on tehdä muuttuja nimeltä kelpaa, joka saa arvon 1, jos mikä tahansa ehto toteutuu. Jos muuttujan arvo on kaikkien ehtojen jälkeen 0, poistutaan aliohjelmasta (komento "Exit Sub"). Vasta tämän jälkeen tulostetaan tervehdys. Nyt Select-rakenteita tarvitaan ainoastaan yksi.
5.2. Harjoituksen 5.1 ohjeessa viitattiin InputBox-funktion käyttöön, mutta jos toteutatkin ohjelman listan avulla, For-silmukan käyttö ei tule kysymykseen. Tarvitaan yleinen muuttuja kerrat, jonka arvo on aluksi 0. Yleisen muuttujan määrittely kirjoitetaan ohjelman ensimmäiselle riville ennen kaikkia aliohjelmia. Aina, kun käyttäjä painaa napista, muuttujan arvo kasvaa yhdellä. Jos muuttujan uusi arvo on suurempi kuin kolme, ohjelma sulkeutuu.
5.1./2.
Dim strPwd As String 'Password
strPwd = InputBox("Anna Salasana:")InputBoxille pitää määritellä muuttuja, johon arvo syötetään, sekä vähintään "ohjetekstin" InputBoxiin. Muita mahdollisuuksia ovat esim. InputBoxin otsikko sekä oletusarvo.
muuttuja = InputBox(Ohjeteksti[, Otsikko][, Oletusarvo]) <-hakasulkeet merkkaavat valinnaisuutta
5.2. Virheilmoituksen aiheuttaa seuraavat rivit
If i > 3 Then lblTervehdys.Caption = "Väärä salasana" Unload Me End If
Jos If...Then rakennetta seuraa samalla rivillä tapahtumia, niin silloin ainoastaan nuo tapahtumat kuuluvat ehdon piiriin, eikä tällöin käytetä enään End If:ä.
If i > 3 Then lblTervehdys.Caption = "Väärä salasana" 'tulosti tai ei, mutta ehto loppuu tähän riviin Unload Me 'formi unloadataan aina ja joka kerta End If 'aiheuttaa virheen, sillä ei ole lopetusta tarvitsevaa If-alkua
Jos haluat ratkaista tehtävä itse, niin lopeta lukeminen tähän!
Private Sub cmdKirjaudu_Click()
Dim strTunnus As String
Dim strPwd As String 'password
Dim intKuka As Integer
Dim i As Integer
For i = 1 To 3 'kysytään max kolmesti tunnusta ja salasanaa
strTunnus = InputBox("Anna Tunnus:") 'kysytään tunnusta InputBoxilla
strPwd = InputBox("Anna Salasana:")
If strTunnus = "tun" And strPwd = "qwerty" Then
intKuka = 1 'Tanja
Exit For 'poistutaan silmukasta ja jatketaan koodia Select Case -kohdasta
ElseIf strTunnus = "jaa" And strPwd = "pinus" Then
intKuka = 2 'Janne
Exit For
Else
MsgBox "Väärä tunnus ja/tai salasana."
End If
Next i
Select Case intKuka
Case 0 'ketään ei sijoitettu intKuka-muuttujaan, joten se pysyi nollana
MsgBox "Käyttäjätunnistus epäonnistui"
End 'ohjelma sammutetaan
Case 1
MsgBox "Tervetuloa, Tanja"
Case 2
MsgBox "Tervetuloa, Janne"
End Select
End SubKiitos avusta, nyt on tehtävät saatu tehtyä ja osasin jopa tehdä kolmannen tehtävän ilman neuvoja (Do-While-Silmukka).
Aihe on jo aika vanha, joten et voi enää vastata siihen.