1

多肢選択式クイズを作成しましたが、プレーヤーが正しい答えを含むボタンを選択すると、次の質問が自動的に表示される前に、その BackColor が数秒間緑色に変わるようにするための正しいコードを考え出すのに苦労しています通常の BackColor に戻ります。

また、プレイヤーが間違った答えを含むボタンを選択すると、その BackColor が赤に変わり、プレイヤーが間違っていることがわかります。

このために、私は尋ねられた質問を含むlabelと呼ばれるを持ち、次に 4 つ( 、、および) がすべて質問に対する潜在的な回答を含みます。もちろん、正しいのは 1 つだけです。lblQuestionbuttonsbtnAnswerAbtnAnswerBbtnAnswerCbtnAnswerD

私はしばらくの間コードをいじり、それを機能させようとしましたが、思い通りに機能しないので、この問題に関するガイダンスを求めてここに来ようと思いました.

以下は、この問題に関連するコードの一部です。私はそれを見れば、あなたの多くは私が間違っているところを知っていると確信しています!

Private Sub btnAnswerA_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnswerA.Click

    If strAnswer = "A" Then
        btnAnswerA.BackColor = Color.Green
        intScore = intScore + 100
        lblScore.Text = intScore
    Else
        btnAnswerA.BackColor = Color.Red
        Call GetQuestion(questionNumber)
    End If

    Call GetQuestion(questionNumber)
    prgbarOne.Value = 0

End Sub

Private Sub btnAnswerB_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnswerB.Click

    If strAnswer = "B" Then
        btnAnswerB.BackColor = Color.Green
        intScore = intScore + 100
        lblScore.Text = intScore
    Else
        btnAnswerB.BackColor = Color.Red
        Call GetQuestion(questionNumber)
    End If

    Call GetQuestion(questionNumber)
    prgbarOne.Value = 0

End Sub

Private Sub btnAnswerC_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnswerC.Click

    If strAnswer = "C" Then
        btnAnswerC.BackColor = Color.Green
        intScore = intScore + 100
        lblScore.Text = intScore
    Else
        btnAnswerC.BackColor = Color.Red
        Call GetQuestion(questionNumber)
    End If

    Call GetQuestion(questionNumber)
    prgbarOne.Value = 0

End Sub

Private Sub btnAnswerD_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnswerD.Click

    If strAnswer = "D" Then
        btnAnswerD.BackColor = Color.Green
        intScore = intScore + 100
        lblScore.Text = intScore
    Else
        btnAnswerD.BackColor = Color.Red
        Call GetQuestion(questionNumber)
    End If

    Call GetQuestion(questionNumber)
    prgbarOne.Value = 0

End Sub

基本的に、次の質問がどこにCall GetQuestion(questionNumber)あるかを示し、元の BackColor (プレーヤーがボタンをクリックする前に、次の質問に戻ります。

これが理にかなっていることを願っており、どんな助けも本当に感謝しています. 申し訳ありませんが、私はまだプログラミングに慣れていません (ご存知かもしれませんが)。また、さらにコードが必要な場合は提出します。

4

3 に答える 3

1

AProughが指摘したように、各Call GetQuestion(questionNumber).

millisecondsTimeoutスレッドがブロックされるミリ秒数を表すパラメーターを調整できます。たとえば、2 秒間スリープするには:

System.Threading.Thread.CurrentThread.Sleep(2000)

しかし、

私はそれを試しましたが、質問がラベルに表示されている間、ボタンの色を緑/赤に変更せずにフリーズするため、新しい回答が表示される次の質問に遅れることになります。

その動作の理由は、MSDN でApplication.DoEventsメソッドについて説明されています。これは解決策でもあります

コードで DoEvents を呼び出すと、アプリケーションは他のイベントを処理できます。たとえば、ListBox にデータを追加し、コードに DoEvents を追加するフォームがある場合、別のウィンドウがフォーム上にドラッグされると、フォームが再描画されます。コードから DoEvents を削除すると、ボタンのクリック イベント ハンドラーの実行が完了するまで、フォームは再描画されません。

メソッドで背景色をリセットしたと思われるため、背景色は更新されませんGetQuestionApplication.DoEventsしたがって、メソッドの前にこのメソッド ( ) を呼び出す必要がありますThread.Sleep

あなたのコードは次のようになります。

Private Sub btnAnswerA_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnswerA.Click

    If strAnswer = "A" Then
        btnAnswerA.BackColor = Color.Green
        intScore = intScore + 100
        lblScore.Text = intScore
    Else
        btnAnswerA.BackColor = Color.Red
        'Call GetQuestion(questionNumber) no need here, it will be called after
    End If

   'Make sure backcolor is refreshed
    Application.DoEvents()

    'Wait for two second
    System.Threading.Thread.Sleep(2000)

    Call GetQuestion(questionNumber)
    prgbarOne.Value = 0

End Sub

Private Sub btnAnswerB_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnswerB.Click

    If strAnswer = "B" Then
        btnAnswerB.BackColor = Color.Green
        intScore = intScore + 100
        lblScore.Text = intScore
    Else
        btnAnswerB.BackColor = Color.Red
        'Call GetQuestion(questionNumber) no need here, it will be called after
    End If

    'Make sure backcolor is refreshed
    Application.DoEvents()

    'Wait for two second
    System.Threading.Thread.Sleep(2000)

    Call GetQuestion(questionNumber)
    prgbarOne.Value = 0

End Sub

Private Sub btnAnswerC_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnswerC.Click

    If strAnswer = "C" Then
        btnAnswerC.BackColor = Color.Green
        intScore = intScore + 100
        lblScore.Text = intScore
    Else
        btnAnswerC.BackColor = Color.Red
        'Call GetQuestion(questionNumber) no need here, it will be called after
    End If

    'Make sure backcolor is refreshed
    Application.DoEvents()

    'Wait for two second
    System.Threading.Thread.Sleep(2000)

    Call GetQuestion(questionNumber)
    prgbarOne.Value = 0

End Sub

Private Sub btnAnswerD_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnswerD.Click

    If strAnswer = "D" Then
        btnAnswerD.BackColor = Color.Green
        intScore = intScore + 100
        lblScore.Text = intScore
    Else
        btnAnswerD.BackColor = Color.Red
        'Call GetQuestion(questionNumber) no need here, it will be called after
    End If

    'Make sure backcolor is refreshed
    Application.DoEvents()

    'Wait for two second
    System.Threading.Thread.Sleep(2000)

    Call GetQuestion(questionNumber)
    prgbarOne.Value = 0

End Sub
于 2013-08-22T23:05:30.330 に答える
0

vb.net タイマー コントロールの Google 検索を実行します。ボタンをクリックした後にタイマーを開始し、その .Tick() イベントを処理して、ボタンの BG 色をリセットし、次の質問を開始します。このようにして、アプリケーションが応答しなくなり、適切に移行することが保証されます。

于 2013-08-22T12:50:50.513 に答える