Ohjelman olisi tarkoitus toimia, niin että kolmannen epäonnistuneen yrityksen jälkeen ohjelma loppuisi…
Private Sub cmdOK_Click() ' määritellään muuttuja Dim i As Integer ' tapahtuu jokin odottamaton virhe On Error GoTo virhe 'siirretään kursori käyttäjä taulukon alkuun rsKayttajat.MoveFirst Do While Not rsKayttajat.EOF For i = 1 To 3 If (frmSisaan.txtKayttaja = rsKayttajat.Fields(4) And frmSisaan.txtSalasana = rsKayttajat.Fields(5)) Then If rsKayttajat.Fields(1) = 1 Then ' avataan pääkäyttäjä ryhmälle lomake, jossa on kaikki painonapit näkyvissä frmPaalomake.Show ' piilotetaan sisäänkirjautumislomake Me.Hide ' lopetetaan aliohjelma Exit Sub ElseIf rsKayttajat.Fields(1) = 2 Then ' piilotetaan tavallisilta käyttäjiltä turhat painonapit frmPaalomake.cmdKayttajat.Visible = False frmPaalomake.cmdTiedot.Visible = False frmPaalomake.Show ' piilotetaan tämä lomake Me.Hide ' lopetetaan aliohjelma Exit Sub End If ElseIf i <= 2 Then MsgBox "Väärä salasana, yritä uudelleen!" rsKayttajat.MoveNext txtKayttaja.SetFocus txtKayttaja = "" txtSalasana = "" End If Next MsgBox " Et taida tietää salasanaa? Ohjelma lopetetaan" Loop virhe: ' lopetetaan aliohjelma Exit Sub End Sub
pistäs tohon kohtaan, kun menee väärin, se lisää johonkin muuttujaan, vaikka yritykset aina 1 lisää, eli:
yritykset = "0" 'alku ----------- if yritykset = "3" then msgbox "yritykset loppu hähää" else yritykset = yritykset +1 end if
pistät ton MsgBox " Et taida tietää salasanaa? Ohjelma lopetetaan"
jälkeen että:
End
jolloin ohjelman suoritus loppuu
Ongelma onkin siinä, ettei käyttäjä voi kirjoittaa tunnusta toista kertaa. MsgBoxit jäävät näkyviin.
ah joo eli tee ne näin:
MsgBox "Tekstiä", vbOkOnly
jolloin Ok napilla kuitataan se messu boxi
Taitaa olla rakenteessa jotakin mätää? Ei kummene.
Käytä ton for silmukan sijasta do while:ia tai if:iä ja tee toi vastaus kerta laskuri yleiseks muuttujaks jota sit lisäät yhellä aina kun kaveri painaa ok:ta... nythän toi sun for silmukkas pyörähtää kolmasti aina kun ok:ta painetaan.
Rakenteellisia "pikku" fiboja. Kokeile seuraavaa.
Private Sub cmdOK_Click() 'määritellään muuttujat Static Kerta As Integer 'arvo säilyy kunhan ohjelma ei sammu Dim i As Integer 'Virheen käsittely On Error GoTo virhe With frmSisaan 'Jos käyttäjän tiedot ovat jo kohdalla, niin nopeutetaan hieman toimintaa käyttämällä 'niitä suoraan tarkistuksissa. Muuten käydään Käyttäjät läpi taulun alusta lähtien If (.txtKayttaja.Text <> rsKayttajat.Fields(4)) Then rsKayttajat.MoveFirst Do While Not rsKayttajat.EOF If (.txtKayttaja.Text = rsKayttajat.Fields(4)) _ And (.txtSalasana.Text = rsKayttajat.Fields(5)) Then 'molemmat oikein If rsKayttajat.Fields(1) = 1 Then 'Avataan pääkäyttäjä ryhmälle lomake, jossa on kaikki painonapit näkyvissä frmPaalomake.Show ElseIf rsKayttajat.Fields(1) = 2 Then 'Piilotetaan tavallisilta käyttäjiltä turhat painonapit frmPaalomake.cmdKayttajat.Visible = False frmPaalomake.cmdTiedot.Visible = False frmPaalomake.Show Else 'Jos rsKayttajat.Fields(1) > 2 niin joudutaan tänne MsgBox "Mitäs me muut tehdään?", vbQuestion End If 'Nollataan kertalaskuri, jos sitä vaikka tarvitaan uudestaan Kerta = 0 If frmPaalomake.Visible Then 'Jos päälomake esillä .Hide 'Piilotetaan frmSisaan-lomake... frmPaalomake.SetFocus '...ja aktivoidaan päälomake End If Exit Sub 'lopetetaan aliohjelma ElseIf (.txtKayttaja.Text = rsKayttajat.Fields(4)) _ And (.txtSalasana.Text <> rsKayttajat.Fields(5)) Then 'Tunnus oikein, salasana väärin Kerta = Kerta + 1 If Kerta >= 3 Then MsgBox "Kolmas huti, poistutaan ohjelmasta." Kerta = 0 'Varsin turha, kun kerran ohjelma sammuu tämän jälkeen End Else MsgBox "Väärä salasana, yritä uudelleen!" .txtSalasana.Text = "" .txtSalasana.SetFocus Exit Sub End If Else 'Tunnus väärin -> salasanalla ei väliä, joten siirrytään seuraavaan rsKayttajat.MoveNext End If Loop 'Annettu tunnus ei löydy kannasta, joten yksi huti lisää Kerta = Kerta + 1 If Kerta >= 3 Then MsgBox "Kolmas huti, poistutaan ohjelmasta." Kerta = 0 'Varsin turha, kun kerran ohjelma sammuu tämän jälkeen End Else MsgBox "Väärä tunnus, arvaa uudelleen!" .txtKayttaja.Text = "" .txtSalasana.Text = "" .txtKayttajat.SetFocus Exit Sub End If End With Exit Sub 'Poistutaan, ettei turhaan anneta virheilmoa virhe: 'Esitetään virhe, jos tänne kerran on päädytty MsgBox Err.Number & ":" & Err.Description, vbCritical, "Käyttäjän tunnistus" Err.Clear End Sub
Kiitoksia, onpa koodin tullut muutoksia. Koodi toimii eka yrittämällä ok. Toisella väärällä käyttökerralla antaa virheilmoituksen 3021:BOF- tai EOF - argumentin arvo on tosi tai nykyinen tietue poistettu. Pyydetty toiminto edellyttää nykyistä tietuetta. Mistähän tuo virheilmoitus voisi johtua?
Tuo virhe tulee siitä, että kun tunnusta ei ole löytynyt kannasta (käyty koko rsKayttajat läpi), niin "kohdistin" siellä kannassa on tuon Loopin lopetusehdossa, eli rsKayttajat-näkymän lopussa (EndOfFile = True). Kun sitten yrittää uudestaan ajaa koodia, niin se alun tunnuksentarkistus aiheuttaa tuon virheen.
Tee seuraava pieni muutos:
Loop rsKayttajat.MoveLast '<-Lisää tämä! 'Annettu tunnus ei löydy kannasta, joten yksi huti lisää Kerta = Kerta + 1
Eli tuo MoveLast siirtää kohdistimen takaisin tietokannan tietoihin, että voidaan verrata sitä käyttäjätunnusta seuraavalla kerralla.
Toinen vaihtoehto on lisätä siihen alun käyttäjätunnuksen tarkistuksen eteen tarkistuksen onko kannassa edes tietoja, joita voitaisiin verrata annettuihin tietoihin.
With frmSisaan 'BOF=Beginning Of File, EOF=End Of File 'Molemmat tosia samaan aikaan -> Kanta on tyhjä If rsKayttajat.BOF = True And rsKayttajat.EOF = True Then MsgBox "Kannassa ei ole käyttäjätietoja." & vbCrLf & "Ohjelman suoritus lopetetaan." End End If 'Jos käyttäjän tiedot ovat jo kohdalla, niin nopeutetaan hieman toimintaa käyttämällä 'niitä suoraan tarkistuksissa. Muuten käydään Käyttäjät läpi taulun alusta lähtien
Edit: Muotoilua ja typo-hunting
Kiitos! Nyt toimiin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.