Bill Stack
Bill Stack

Reputation: 67

Visual Basic - Updating data in a label on the fly?

Here is a portion of my code.. it is a dice game that checks if all 3 dice are the same. The user can hold/unhold any of the 3 and the dice use timers to roll. If they are all the same, Points goes up by 1. Problem is, the label doesn't update until the roll button is hit again. How do I make it so the label goes up by 1 as soon as there are 3 equal dice numbers?

EDITED WITH ALL CODE

Dim randomObject As New Random()
Dim n, m, o, p As Integer
Dim RollNumber = 1
Dim TurnNumber As Integer
Dim Points = 0
Dim Restart As Boolean = True


Private Sub btnRoll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRoll.Click


    If btnHold.Enabled = True Then
        Timer1.Enabled = True
    End If
    If btnHold2.Enabled = True Then
        Timer2.Enabled = True
    End If
    If btnHold3.Enabled = True Then
        Timer3.Enabled = True
    End If

    TurnNumber += 1
    lblTurns.Text = TurnNumber

    If TurnNumber = 3 Then
        RollNumber += 1
        TurnNumber = 0
    End If

    lblRolls.Text = RollNumber


    If Not Restart Then
        If (lblDice.Text = lblDice2.Text) And (lblDice2.Text = lblDice3.Text) Then
            Points += 1

        End If
        lblPoints.Text = Points
    End If
    Restart = False






End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    m = m + 1
    If m < 10 Then
        n = randomObject.Next(1, 7)
        lblDice.Text = n
        die1PictureBox.Image = ImageList1.Images(n - 1)
    Else
        Timer1.Enabled = False
        m = 0
    End If
End Sub

Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    m = m + 1
    If m < 10 Then
        n = randomObject.Next(1, 7)
        lblDice2.Text = n
        die2PictureBox.Image = ImageList1.Images(n - 1)
    Else
        Timer2.Enabled = False
        m = 0
    End If
End Sub

Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
    m = m + 1
    If m < 10 Then
        n = randomObject.Next(1, 7)
        lblDice3.Text = n
        die3PictureBox.Image = ImageList1.Images(n - 1)
    Else
        Timer3.Enabled = False
        m = 0
    End If
End Sub

Private Sub btnHold_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHold.Click
    btnHold.Enabled = False
    btnUnhold.Enabled = True
End Sub

Private Sub btnUnhold_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUnhold.Click
    btnHold.Enabled = True
    btnUnhold.Enabled = False
End Sub

Private Sub btnHold2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHold2.Click
    btnHold2.Enabled = False
    btnUnhold2.Enabled = True
End Sub

Private Sub btnUnhold2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUnhold2.Click
    btnHold2.Enabled = True
    btnUnhold2.Enabled = False
End Sub

Private Sub btnHold3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHold3.Click
    btnHold3.Enabled = False
    btnUnhold3.Enabled = True
End Sub

Private Sub btnUnhold3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUnhold3.Click
    btnHold3.Enabled = True
    btnUnhold3.Enabled = False
End Sub

Private Sub btnRestart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRestart.Click
    Dim msg As String
    Dim title As String
    Dim style As MsgBoxStyle
    Dim response As MsgBoxResult
    msg = "Are you sure you want to start a new game? If not, you can select 'No' to continue with your current game."
    style = MsgBoxStyle.DefaultButton2 Or _
       MsgBoxStyle.Critical Or MsgBoxStyle.YesNo
    title = "New Game"

    response = MsgBox(msg, style, title)
    If response = MsgBoxResult.Yes Then
        Reset()

    End If

    Restart = True

End Sub


Private Sub ColorChangeToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ColorChangeToolStripMenuItem.Click

    'Notice the ... in the menu...that means a dialog box will come

    Dim dialog As New ColorDialog   ' Color Dialog
    Dim result As DialogResult ' stores Button clicked

    dialog.FullOpen = True ' show all colors
    result = dialog.ShowDialog

    ' do nothing if user clicked dialog's Cancel Button
    If result <> Windows.Forms.DialogResult.Cancel Then
        ' assign new color to Paint object
        Label1.ForeColor = dialog.Color
    End If


End Sub

Private Sub FontChangeToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FontChangeToolStripMenuItem.Click
    'Notice the ... in the menu...that means a dialog box will come

    Dim dialog As New FontDialog   ' Font Dialog
    Dim result As DialogResult ' stores Button clicked

    ' show dialog and get result
    result = dialog.ShowDialog()

    ' do nothing if user clicked dialog's Cancel Button
    If result <> Windows.Forms.DialogResult.Cancel Then
        ' assign new font value to TextBox
        If Windows.Forms.DialogResult.OK = MessageBox.Show("Changing Font. Click Ok to Change,\n Cancel for no change to occur.", _
                                 "Warning", MessageBoxButtons.OKCancel) Then
            Label1.Font = dialog.Font
        End If


    End If


End Sub

Private Sub SelectAColorToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SelectAColorToolStripMenuItem.Click

    Dim dialog As New ColorDialog   ' Color Dialog
    Dim result As DialogResult ' stores Button clicked

    dialog.FullOpen = True ' show all colors
    result = dialog.ShowDialog()

    ' do nothing if user clicked dialog's Cancel Button
    If result <> Windows.Forms.DialogResult.Cancel Then
        Me.BackColor = dialog.Color
    End If

End Sub

Private Sub SelectAnImageToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SelectAnImageToolStripMenuItem.Click
    Dim msg As String
    Dim title As String
    Dim style As MsgBoxStyle
    Dim response As MsgBoxResult
    msg = "Are you sure you want to see what happens when you get a perfect score without actually playing? That's cheating.. and will reset the game!"
    style = MsgBoxStyle.DefaultButton2 Or _
       MsgBoxStyle.Critical Or MsgBoxStyle.YesNo
    title = "New Game"

    response = MsgBox(msg, style, title)
    If response = MsgBoxResult.Yes Then
        Dim FileChooser As New OpenFileDialog()
        Dim result As DialogResult

        result = DialogResult = FileChooser.ShowDialog()

        If result <> Windows.Forms.DialogResult.Cancel Then
            If FileChooser.FileName <> "" Then
                Me.BackgroundImage = System.Drawing.Image.FromFile(FileChooser.FileName)
                Reset()
            Else
                MessageBox.Show("No Change Made. File Not Selected!", "Warning", _
                                System.Windows.Forms.MessageBoxButtons.OK, _
                                System.Windows.Forms.MessageBoxIcon.Exclamation)
            End If
        End If
    End If

End Sub

Private Sub btnHow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHow.Click
    MessageBox.Show(" You will have 5 rolls.  In each roll you have up to 3 turns. Your object in each of the turns is to get three of a kind on the dice.  You can hold some die and roll only some of the die, or you can reroll all the dice.  If in a turn you get three of a kind, you get a point.  At the end of 5 turns you could have a maximum of 5 points and you will get a special prize.")
End Sub

Sub Reset()
    RollNumber = 1
    lblRolls.Text = RollNumber
    TurnNumber = 0
    lblTurns.Text = TurnNumber
    Points = 0
    lblPoints.Text = Points
    lblPoints2.Text = ""

    btnRoll.Enabled = True
    btnHold.Enabled = True
    btnHold2.Enabled = True
    btnHold3.Enabled = True
    btnUnhold.Enabled = False
    btnUnhold2.Enabled = False
    btnUnhold3.Enabled = False

    die1PictureBox.Image = Nothing
    die2PictureBox.Image = Nothing
    die3PictureBox.Image = Nothing
    lblDice.Text = ""
    lblDice2.Text = ""
    lblDice3.Text = ""

End Sub

Private Sub btnTriple_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTriple.Click
    Points += 1
    lblPoints.Text = Points

    btnTriple.Visible = False
End Sub

End Class

Upvotes: 1

Views: 823

Answers (3)

ron tornambe
ron tornambe

Reputation: 10780

Try calling DoEvents after setting the lblRolls.Text:

....

lblRolls.Text = RollNumber
Application.DoEvents()

....

EDIT

Private Sub SetTimers(Enable As Boolean)
    Timer1.Enabled = Enable
    Timer2.Enabled = Enable
    Timer3.Enabled = Enable
End Sub

''''
SetTImers(True)
....

If TurnNumber = 3 Then
    RollNumber += 1
    TurnNumber = 0
    SetTimers(False)
    Application.DoEvents()
    lblRolls.Text = RollNumber        
    Application.DoEvents()
    SetTimers(True)
Else
    lblRolls.Text = RollNumber
End If

....

Upvotes: 0

Mark Hall
Mark Hall

Reputation: 54532

This answer will remove the need of the answer that I gave you on your other question. Since you are using Timers to generate your dice numbers create a method that you call after you disable each Timer, this method will check that all of the Timers are disabled then check for equality. See if it works for you. You may want to move more of the code from your btnRoll_Click EventHandler to this method also.

Method to check for equality.

Private Sub CheckForMatch()
    If Not Timer1.Enabled And Not Timer2.Enabled And Not Timer3.Enabled Then
        If (lblDice.Text = lblDice2.Text) And (lblDice2.Text = lblDice3.Text) Then
            Points += 1
            lblPoints.Text = Points
        End If
    End If
End Sub

Modifed Timer Method example add to all three of your Timer's

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    m = m + 1
    If m < 10 Then
        n = randomObject.Next(1, 7)
        lblDice.Text = n
        die1PictureBox.Image = ImageList1.Images(n - 1)
    Else
        Timer1.Enabled = False
        CheckForMatch()
        m = 0
    End If
End Sub

Upvotes: 2

Zeddy
Zeddy

Reputation: 2089

Move your label line down after the end if, and see if that helps. I cannot see where you are incrementing the points - so its difficult to tell.

If (lblDice.Text = lblDice2.Text) And (lblDice2.Text = lblDice3.Text) Then
    btnTriple.Visible = True
End If

or even place it before the restart=false line instead of where it is now.

lblPoints.Text = Points
Restart = False

Upvotes: 0

Related Questions