Задавать вопросы в массиве - PullRequest
0 голосов
/ 11 января 2012

Привет всем, мне трудно найти правильный вопрос для формы вопроса. Допустим, у меня есть 6 вопросов. Я определяю их так:

 Dim firstStart As Boolean = True
 Dim totalQs As Integer = 0
 Dim currentQ As Integer = 0
 Dim theAnswers() As String
 Dim theQuestions() As String = {"Please scan barcode 1 then press NEXT", "" & _
                                "Please scan barcode 1 then press NEXT", "" & _
                                "Please scan barcode 1 then press NEXT", "" & _
                                "Please scan barcode 1 then press NEXT", "" & _
                                "Please scan barcode 1 then press NEXT", "" & _
                                "Please scan barcode 1 then press COMPLETE"}

Код кнопки Next / Complete выглядит следующим образом:

Private Sub cmdNextFinish_Click(ByVal sender As System.Object, ByVal e As             System.EventArgs) Handles cmdNextFinish.Click
   Call theQs(currentQ)
End Sub

Form_load выглядит так:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Call theQs(0)
End Sub

А теперь настройка вопроса выглядит следующим образом:

Private Sub theQs(ByRef theQNum As Integer)
    If firstStart = True And theQNum = 0 Then
        firstStart = False
        totalQs = (theQuestions.Length)
        ReDim theAnswers(totalQs)
        lblQ.Text = theQuestions(0)
        cmdNextFinish.Enabled = True
        cmdNextFinish.Text = "NEXT"
        Call buttons(theQNum)
        txtNumber.Text = ""
        txtNumber.MaxLength = theQuestionTextboxLimits(theQNum)
        txtNumber.Focus()
    ElseIf theQNum = 0 Then 'ANSWERING THE FIRST QUESTION
        theAnswers(currentQ) = "-" & txtNumber.Text

        If currentQ <> totalQs Then
            currentQ = currentQ + 1
            lblQ.Text = theQuestions(currentQ)

            If (totalQs - currentQ) = 0 Then
                cmdNextFinish.Text = "Complete"
            Else
                cmdNextFinish.Text = "NEXT"
            End If

            txtNumber.Text = ""
            txtNumber.MaxLength = theQuestionTextboxLimits(theQNum)
            txtNumber.Focus()
            Call buttons(currentQ)
        Else
            'Call writeXMLFile()
            MsgBox("exited")
        End If
    ElseIf theQNum = 1 Then 'ANSWERING THE SECOND QUESTION
        theAnswers(currentQ) = txtNumber.Text

        If theQNum <> totalQs Then
            currentQ = currentQ + 1
            lblQ.Text = theQuestions(currentQ)

            If (totalQs - currentQ) = 0 Then
                cmdNextFinish.Text = "Complete"
            Else
                cmdNextFinish.Text = "NEXT"
            End If

            txtNumber.Text = ""
            txtNumber.MaxLength = theQuestionTextboxLimits(theQNum)
            txtNumber.Focus()
            Call buttons(currentQ)
        Else
            'Call writeXMLFile()
            MsgBox("exited")
        End If
    ElseIf theQNum = 2 Then 'ANSWERING THE THIRD QUESTION
        theAnswers(currentQ) = txtNumber.Text

        If theQNum <> totalQs Then
            currentQ = currentQ + 1
            lblQ.Text = theQuestions(currentQ)

            If (totalQs - currentQ) = 0 Then
                cmdNextFinish.Text = "Complete"
            Else
                cmdNextFinish.Text = "NEXT"
            End If

            txtNumber.Text = ""
            txtNumber.MaxLength = theQuestionTextboxLimits(theQNum)
            txtNumber.Focus()
            Call buttons(currentQ)
        Else
            'Call writeXMLFile()
            MsgBox("exited")
        End If
    ElseIf theQNum = 3 Then 'ANSWERING THE FORTH QUESTION
        theAnswers(currentQ) = txtNumber.Text

        If theQNum <> totalQs Then
            currentQ = currentQ + 1
            lblQ.Text = theQuestions(currentQ)

            If (totalQs - currentQ) = 0 Then
                cmdNextFinish.Text = "Complete"
            Else
                cmdNextFinish.Text = "NEXT"
            End If

            txtNumber.Text = ""
            txtNumber.MaxLength = theQuestionTextboxLimits(theQNum)
            txtNumber.Focus()
            Call buttons(currentQ)
        Else
            'Call writeXMLFile()
            MsgBox("exited")
        End If
    ElseIf theQNum = 4 Then 'ANSWERING THE FIFTH QUESTION
        theAnswers(currentQ) = txtNumber.Text

        If theQNum <> totalQs Then
            currentQ = currentQ + 1
            lblQ.Text = theQuestions(currentQ)

            If (totalQs - currentQ) = 0 Then
                cmdNextFinish.Text = "Complete"
            Else
                cmdNextFinish.Text = "NEXT"
            End If

            txtNumber.Text = ""
            txtNumber.MaxLength = theQuestionTextboxLimits(theQNum)
            txtNumber.Focus()
            Call buttons(currentQ)
        Else
            'Call writeXMLFile()
            MsgBox("exited")
        End If
    ElseIf theQNum = 5 Then 'ANSWERING THE SIXTH QUESTION
        theAnswers(currentQ) = txtNumber.Text

        If theQNum <> totalQs Then
            currentQ = currentQ + 1
            lblQ.Text = theQuestions(currentQ)

            If (totalQs - currentQ) = 0 Then
                cmdNextFinish.Text = "Complete"
            Else
                cmdNextFinish.Text = "NEXT"
            End If

            txtNumber.Text = ""
            txtNumber.MaxLength = theQuestionTextboxLimits(theQNum)
            txtNumber.Focus()
            Call buttons(currentQ)
        Else
            'Call writeXMLFile()
            MsgBox("exited")
        End If
    End If
End Sub

Я, кажется, запутался, потому что, когда он дойдет до 5-го вопроса, он выдаст мне ошибку Индекс находится за пределами массива. lblQ.Text = theQuestions(currentQ) для theQNum = 5

Я знаю это по 5-му вопросу, но массив не поднимается до 6.

Что я здесь не так делаю (или думаю что-то простое)

Спасибо

David

ОБНОВЛЕНИЕ ПОЛУЧИЛО ЭТО

 Private theQNum As Integer

 Sub Start
   theQNum =0
   SetupNextQuestion
 End Sub

 Sub SetupNextQuestion
   txtNumber.Text = ""
   lblQuestion.Text = theQuestions(theQNum)

   If theQNum = (theQuestions.Length - 1) Then
      cmdNextFinish.Text = "Complete"
   Else
      cmdNextFinish.Text = "NEXT"
   End If

 End Sub

 Sub cmdNextFinish_Click
   theAnswers(theQNum) = txtNumber.Text

   'Check if this is a finish
   theQNum += 1
   If theQNum >= theQuestions.Length Then
      'Call writeXMLFile()
       MsgBox("exited")
   Else 
       SetupNextQuestion
   End If
 End Sub

David

Ответы [ 2 ]

1 голос
/ 11 января 2012

Эти строки:

If theQNum <> totalQs Then
            currentQ = currentQ + 1
            lblQ.Text = theQuestions(currentQ)

Что находится внутри If для вашего ElseIf theQNum = 5 Then, что заставляет вас выйти за пределы.Но проблема гораздо раньше в вашем, если.Вы начинаете с

If firstStart = True And theQNum = 0 Then
       ' Code here
ElseIf theQNum = 0 Then 'ANSWERING THE FIRST QUESTION
       'More code here that doesn't get called

То, что ElseIf theQNum = 0 не будет вызываться при первом запуске, потому что первая часть if - true.И в этом первом бите кода, когда firstStart имеет значение true, вы не увеличиваете currentQ, поэтому в следующий раз этот sub называется firststart - false, но currentQ по-прежнему равен 0. Корень вашей проблемы.

Простое решение состоит в том, чтобы увеличивать ваш currentQ внутри первого бита вашего if и всегда устанавливать текст метки ДО , когда вы увеличиваете currentQ.И не увеличивайте его, когда у вас последний вопрос.Таким образом, currentQ никогда не выйдет за пределы диапазона.

0 голосов
/ 11 января 2012

Массивы начинаются с 0 и далее. Итак, ваш первый вопрос по индексу 0 и шестой вопрос по индексу 5 в массиве. Если вы заранее увеличите индекс для последнего вопроса, индекс станет 6, который не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...