Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Miten pitäisi VB:n koodia muuttaa?

Sivun loppuun

juku [16.11.2004 12:06:42]

#

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

Bill Keltanen [16.11.2004 12:15:03]

#

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

maka78 [16.11.2004 15:15:01]

#

pistät ton MsgBox " Et taida tietää salasanaa? Ohjelma lopetetaan"
jälkeen että:
End
jolloin ohjelman suoritus loppuu

juku [16.11.2004 15:34:02]

#

Ongelma onkin siinä, ettei käyttäjä voi kirjoittaa tunnusta toista kertaa. MsgBoxit jäävät näkyviin.

maka78 [16.11.2004 16:08:09]

#

ah joo eli tee ne näin:

MsgBox "Tekstiä", vbOkOnly

jolloin Ok napilla kuitataan se messu boxi

juku [16.11.2004 18:15:49]

#

Taitaa olla rakenteessa jotakin mätää? Ei kummene.

maka78 [17.11.2004 14:56:22]

#

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.

BadSource [18.11.2004 08:11:25]

#

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

juku [18.11.2004 21:02:15]

#

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?

BadSource [19.11.2004 07:04:57]

#

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

juku [19.11.2004 11:27:39]

#

Kiitos! Nyt toimiin.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta