index out of bounds..hoe te stoppen??

Status
Niet open voor verdere reacties.

Wilma1981

Gebruiker
Lid geworden
4 jun 2015
Berichten
5
Hallo allemaal,

Ik ben bezig met het maken van een quiz met 10 vragen en mogelijke antwoorden (steeds 2 of 3 opties)
Ik wil dat deze vragen en antwoorden van de volgende vraag in het formulier gezet worden als ik klik op een mogelijk antwoord. Nu lukt dit, tot het moment dat hij bij vraag 10 is en dan start hij weer bij vraag 1. Ik wil dat ie na vraag 10 doorgaat naar het scoreformulier (de scoring enzo moet ik nog invoegen hoor), maar nu geeft ie steeds aan dat de index exception out of bounds is en dat begrijp ik, maar weet niet hoe ik het anders moet doen. Iemand een idee??
Alvast bedankt.

Code:
Public Class frmQuestions

    Dim strQuestion(9) As String
    Dim strAnswer1(9) As String
    Dim strAnswer2(9) As String
    Dim strAnswer3(9) As String
    Dim intPosition As Integer = 0

    Private Sub frmQuestions_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        'vullen van de vragen (as string)

        strQuestion(0) = "1. Als hoeveelste gaf de mol de jarige een cadeau?"
        strAnswer1(0) = "1"
        strAnswer2(0) = "4"
        strAnswer3(0) = "De mol gaf geen cadeau"

        strQuestion(1) = "2. Schreef de mol tijdens de fietstocht?"
        strAnswer1(1) = "Ja"
        strAnswer2(1) = "Nee"
        
        strQuestion(2) = "3. Wat voor soort fiets had de mol vandaag bij zich?"
        strAnswer1(2) = "Mountainbike"
        strAnswer2(2) = "Omafiets"
        strAnswer3(2) = "Anders"

        strQuestion(3) = "4. Heeft de mol tijdens de vlaggenopdracht letters uitgebeeld met de vlag?"
        strAnswer1(3) = "Ja"
        strAnswer2(3) = "Nee"

        strQuestion(4) = "5. Was de mol dirigent bij het zingen van Vader Jacob?"
        strAnswer1(4) = "Ja"
        strAnswer2(4) = "Nee"

        strQuestion(5) = "6. Verdiende de kandidaten in de groep van de mol een joker?"
        strAnswer1(5) = "Ja"
        strAnswer2(5) = "Nee"

        strQuestion(6) = "7. Is de mol een meisje?"
        strAnswer1(6) = "Ja"
        strAnswer2(6) = "Nee"

        strQuestion(7) = "8. Waar stond de Mol bij het boogschieten?"
        strAnswer1(7) = "Naast Lucas"
        strAnswer2(7) = "Naast Jonathan"
        strAnswer3(7) = "Naast Marije"

        strQuestion(8) = "9. Welke kleur jas heeft de mol?"
        strAnswer1(8) = "Groen"
        strAnswer2(8) = "Blauw"
        strAnswer3(8) = "Zwart"

        strQuestion(9) = "10. In welke groep zit de Mol?"
        strAnswer1(9) = "Groep 6"
        strAnswer2(9) = "Groep 7"
        strAnswer3(9) = "Groep 8"

        NextQuestion(0)

    End Sub

    'volgende vraag na de index

    Private Sub NextQuestion(index As Integer)
        intPosition += index

        If intPosition < 0 Then
            intPosition = 9
        ElseIf intPosition > 9 Then
            frmScore.Show()
        End If

        txtQuestion.Text = strQuestion(intPosition)
        rbAnswer1.Text = strAnswer1(intPosition)
        rbAnswer2.Text = strAnswer2(intPosition)
        rbAnswer3.Text = strAnswer3(intPosition)

           End Sub

    Private Sub rbAnswer1_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbAnswer1.CheckedChanged
        If rbAnswer1.Checked Then
            NextQuestion(1)
        End If
        rbAnswer1.Checked = False
    End Sub

    Private Sub rbAnswer2_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbAnswer2.CheckedChanged
        If rbAnswer2.Checked Then
            NextQuestion(1)
            rbAnswer2.Checked = False
        End If
    End Sub

    Private Sub rbAnswer3_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbAnswer3.CheckedChanged
        If rbAnswer3.Checked Then
            NextQuestion(1)
            rbAnswer3.Checked = False
        End If
    End Sub

End Class
 
Laatst bewerkt door een moderator:
Als je intPosition > 9 is dan laat je het score scherm zien maar daarna zal hij doorgaan met de methode afmaken en dan komt hij met een intPostion die nu te groot is aan bij de .Text setters. Als je daar gewoon een if omheen zet (if tussen 0 en 9) zal het wel werken of je zet het in een try/catch statement.

Of een 'return' na je frmScore.Show() als dat werkt in VB, dan stopt de method met het doorlopen van de rest.

Als je een beetje bekend bent met het maken van classes dan zou ik dat eens gaan doen, dat maakt het allemaal een stukje beter.
 
Hoi bloodshed, bedankt voor het reageren. Ik ga het proberen. Ik ben zelf pas 2 mnd bezig met het mezelf aanleren van vb.net. ik weet dus nog niet super veel. Waarom is het werken met classes beter eigenlijk? En wat bedoel je met 'return' ?

In ieder geval erg bedankt voor je reactie.

Groetjes Wilma
 
in je else if

Code:
frmScore.Show()
Return

dan zal de rest van de method niet worden afgemaakt (dus dan gaat hij ook niet intPosition 10 die er niet is proberen in te vullen.
Normaal gebruik je return in combinatie met een waarde die de method terug kan geven maar het kan ook in void methods.
 
Wellicht is het overigens ook verstandig om even te kijken naar hoe intPosition berekend wordt binnen NextQuestion. Dat lijkt me namelijk ook niet helemaal juist te gaan :p. Wat je nu namelijk doet is de index die wordt meegegeven optellen bij de huidige waarde van intPosition. Dus bij NextQuestion(0) is intPosition 0 en bij NextQuestion(1) is intPosition 1, wat beide nog gewoon hoort bij hetgeen je verwacht, maar wanneer je vervolgens NextQuestion(2) aanroept wordt de waarde van intPosition 3 (1 + 2).
 
Hoi CoD_Nl, toch doet ie wat ie moet doen. Ik krijg de vragen gewoon op volgorde. Ik heb alles ook maar gewoon bij elkaar gegoogled...ik vind het nog best lastig nl.
Wat ik nog niet voor elkaar krijg is de tijd en de score. Als ik een timer zet bij het inlogformulier en vervolgens ga ik naar het vragenformulier dan wel ik dat de timer stopt bij het aanklikken van een antwoord op vraag 10 en vervolgens een tijd op het score formulier. Ik weet nog niet goed hoe. ..ditzelfde geldt voor scores. Als ik namelijk een score probeer te maken Door 1 van de antwoorden +1 te doen, blijf ik op het score formulier 0 krijgen. .. hebben jullie een idee? Ik vind het met de arrays nl nog erg lastig...
 
Ik heb echt al jaren eigenlijk niks meer met VB(.NET) gedaan, dus het is niet de mooiste code geworden, maar ik heb toch even de moeite genomen om je een voorbeeld in elkaar te zetten. Voor het tonen van de vragen heb ik een user control gemaakt welke een Question (een klasse die de representatie van een quizvraag is) als input krijgt en aan de hand daarvan de UI opbouwt (het aantal antwoorden waaruit gekozen kan worden is namelijk variabel). De hele lijst met vragen/user controls wordt vervolgens in een panel geladen welke scrollable is en de gebruiker moet het einde van de quiz aangeven door op 'Klaar' te drukken (maar in principe is het ook eenvoudig om bij te houden hoeveel vragen er beantwoord zijn).

Het voorbeeldproject kan je hier downloaden: http://www.filedropper.com/vbquiz
 
als je data wilt doorgeven aan je score form kun je dit op verschillende manieren doen, je kunt deze doorgeven in de constructor van je form, met properties of een public method (en meer).

je zou op je score form een method kunnen maken die je kunt aanroepen voor je het form laat zien
Code:
public Sub SetScore(quizScore As String)
    txtScore.Text = quizScore
End Sub

Code:
frmScore.SetScore("3")
frmScore.Show()

Je kunt dit hetzelfde doen met je timer, die kun je ook gewoon aanmaken en starten in je frmQuestions neem ik aan.


edit: was aan het schrijven, cod_nl heeft een voorbeeld gepost dat werkt ook :) (zelf doe ik ook geen vb.net)
 
Laatst bewerkt:
thnx

Thanks guys (tenminste denk dat jullie guys zijn ;))

Pffoe...wat een code CoD_NL...Ik ga m proberen uit te pluizen. Stap voor stap...waar begin je en wat doe je nou eigenlijk. Het is inderdaad op deze manier wel een stuk makkelijker. Super dat je dit ff voor mij hebt gemaakt...(voor jou..ff..hahahaha...voor mij ...aaahhhh).
Je hebt alleen nu alle vragen onder elkaar. Voor de opdracht die ik heb gekregen (als beginner...) moet ik een vraag full screen laden en dan bij het beantwoorden van de eerste vraag, de volgende vraag full screen te zien krijgen. Maar goed.ik ga kijken of ik dat in jouw code kan vinden en kan modificeren. Ik ga mn best doen. Ik vind het namelijk echt super tof om te doen, maar ik vind het wel ingewikkeld hoor..want er is zooveel om te weten en ik vind het soms lastig om te bedenken waar ik moet beginnen..soms denk ik te moeilijk en soms veel te makkelijk.

Nou...nogmaals super bedankt voor alle moeite. Super!!:thumb:

Groetjes Wilma
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan