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 Sub
Harjoitus 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 Sub
Iso 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 Sub
Kiitos 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.