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 Subpistä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 SubKiitoksia, 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 + 1Eli 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ähtienEdit: Muotoilua ja typo-hunting
Kiitos! Nyt toimiin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.