Приостановить подпрограмму до нажатия кнопки? VB.net - PullRequest
0 голосов
/ 25 апреля 2020

Код, над которым я работаю, немного запутан, но вот глупая версия того, что я пытаюсь сделать:

Допустим, есть программа, которая генерирует случайное число и отображает его texbox. Затем пользователь должен нажать любую из двух кнопок, чтобы определить, является ли число нечетным или четным. если они отвечают правильно, балл увеличивается, и количество вопросов, на которые они ответили, также увеличивается. если это не так, то увеличивается только количество ответов. Новый номер генерируется и отображается каждый раз, когда пользователь отвечает. Все это длится две минуты. Вот пример того, как это может выглядеть:

    Public RandomNumber as integer = 0

Sub Main()
    Dim QuestionsAnswered as integer = 0
    Dim CorrectlyAnswered as integer = 0
    Dim timer as new stopwatch
    timer.start()
    While timer.ElapsedMilliseconds < 120000
        RandomNumber = Math.Ceiling(Rnd() * 1000)
        MyTextBox.Text = RandomNumber
        'WAIT UNTIL EITHER BUTTON IS PRESSED HERE
    End While
    MsgBox("Well Done you scored: " & CorrectlyAnswered & "/" & QuestionsAnswered)
End Sub

Private Sub EVEN_Click(sender As Object, e As EventArgs) Handles BtnA3.Click
        If RandomNumber Mod 2 = 0 then
            CorrectlyAnswered += 1
            QuestionsAnswered += 1
            Main()
        Else
            QuestionsAnswered += 1
            Main()
        End If
    End Sub

Private Sub ODD_Click(sender As Object, e As EventArgs) Handles BtnA3.Click
        If RandomNumber Mod 2 = 1 then
            CorrectlyAnswered += 1
            QuestionsAnswered += 1
            Main()
        Else
            QuestionsAnswered += 1
            Main()
        End If
    End Sub

Я еще раз упомяну, у меня проблема не с приведенным выше кодом, а просто идея. Я новичок в программировании в формах, и все это получение информации от кнопки кажется кошмаром. Я предполагаю, что есть много решений для удержания программы на некоторое время, но я уверен, что кто-то ее знает лучшее решение. Используя функцию, переставляя код, приостанавливая его, что бы он ни работал!

Я был бы очень благодарен за некоторую помощь.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Установить компонент таймера из панели инструментов с интервалом 1000 мс (из свойств). Принципиально следует добавить две кнопки, а именно: «Нечетный и четный», кнопку «Пуск». А для некоторых украшений добавьте Ярлыки, чтобы показать счет времени.

Public Class Form1
    Private seconds As Byte ' Since we don't need larger numbers for 2 min counting
    Private correct As Byte
    Private answers As Byte
    Private random As Integer

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Timer1.Start()
        Button1.Enabled = False
        Button2.Enabled = True
        Button3.Enabled = True

        Shuffle()
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        seconds += 1

        Label1.Text = seconds.ToString + " seconds / 120 seconds"

        If seconds = 120 Then ' To count till 120000 ms (120s)
            Label1.Text = "Press ""Start"" to get started"
            Timer1.Stop()
            seconds = 0

            Button2.Enabled = False
            Button3.Enabled = False

            Label2.Text = correct.ToString + " correct / " + answers.ToString + " answers"

            Button1.Enabled = True
        End If
    End Sub

    Private Sub Button_Click(sender As Object, e As EventArgs) Handles Button3.Click, Button2.Click
        Shuffle()

        If random Mod 2 Then
            correct += 1
            answers += 1
        Else
            answers += 1
        End If
    End Sub

    Private Sub Shuffle()
        random = Math.Ceiling(Rnd() * 1000)
        Label2.Text = random.ToString
    End Sub
End Class

Надеюсь, это поможет вам.

Project OddEven

0 голосов
/ 26 апреля 2020

Для демонстрации комментария @jmcilhinney.

Ваша форма нуждается в 2 кнопках и метке, настроенной в конструкторе. Вам также нужно перетащить таймер из панели инструментов в форму, и он появится в панели компонентов. Вы можете выбрать таймер набор свойств, как элемент управления. Установите для свойства interval значение 120000. Возможно, вы должны установить имена элементов управления на более значимые имена. Если вы это сделаете, не забудьте изменить имена в коде везде, где появляется имя элемента управления. Я просто использую имена по умолчанию, доступные в моей тестовой программе.

Приложения WinForms управляются событиями. У элементов управления есть события. Когда пользователь или система вызывает событие, запускается ваш код. В противном случае программа просто сидит там. Вам нужно переключиться на консольные приложения, которым для продолжения нужны циклы.

Пожалуйста, проверьте комментарии в коде.

Private r As New Random 'An instance of the .net Random class
Private CorrectAnswer As Integer
Private QuestionCount As Integer
Private IsEven As Boolean

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'This is where the program begins
    DisplayNumber()
    Timer1.Start()
End Sub

'This event handles the click of both buttons. Note the Handles clause 
Private Sub ButtonClick(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click 'Text would be Even, Odd respectively
    'The sender tells us which button was clicked.
    'This will increment the Form level variables
    If sender Is Button1 AndAlso IsEven Then
        CorrectAnswer += 1
    ElseIf sender Is Button2 AndAlso Not IsEven Then
        CorrectAnswer += 1
    End If
    QuestionCount += 1
    DisplayNumber()
End Sub

'This method is called from both the Form.Load and ButtonClick. To avoid duplicating code
'we write a separate method.
Private Sub DisplayNumber()
    'Using the random class declared at Form level will return a random number up to 1000
    Dim num = r.Next(1000)
    'Mod divides two numbers and returns only the remainder.
    'Even numbers will always return 0 as remainder
    IsEven = (num Mod 2 = 0) 'The parenthesis are not necessary but I don't like 2 equals in a line of code.
    Label1.Text = num.ToString
End Sub

'Set Timer1.Interval which is in milliseconds to 120000 in the Form Desiner
'The Tick event will occur afer 2 minutes
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Button1.Enabled = False
    Button2.Enabled = False
    Timer1.Stop()
    Label1.Text = ""
    'The message box is using an Interpolated String designated by the $ preceding the quote sign.
    'This type of string can use variables surround by braces embedded exactly where you want them to appear.
    'It is an easier method than String.Format
    MessageBox.Show($"Time is up. You had {CorrectAnswer} correct response out of {QuestionCount} questions.")
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...