对象变量或未设置块变量(数组)

时间:2015-09-02 12:44:19

标签: arrays vb.net

对于现在的几个项目,我已经出现了这个错误并完全启动了我的项目。在大多数情况下,我只需要离开它们并开始一个新的,不同的。基本上,我只是希望能够引用符合特定条件的表单上的每个对象。在这种情况下,它是一款具有四种不同游戏模式的街机风格游戏。有一个计时器可以创建要拍摄的对象,它可以正常工作,可以是PictureBox,也可以是标签,具体取决于哪种模式。在创建时,它将每个对象的标记更改为“Obj”& 任何形状/数学数字,中间有空格。但由于某种原因,它不会在不同的计时器刻度事件上创建一系列排序来移动它们。

我只需要它能够不断添加和删除要拍摄的对象,添加和移动和删除工作正常,但在我所有其他情况下使用数组这个错误只是蠕动它和我和我认真合格的IPT老师无法弄明白。它为什么突然开始这样做,我该如何解决?附件是对象移动事件的一些代码。

Dim NumofObjsLeft As Integer = 0
    For Each obj As Object In Me.Controls
        If obj.Tag.Contains("Obj") Then
            NumofObjsLeft += 1
            If NumofObjsLeft <= 0 Then
                Wav += 1
                WaveStart = True
            End If
            Select Case GameMode
                Case "Protector"
                    Select Case Curry
                        Case "Shapes"
                            If TypeOf obj Is PictureBox AndAlso obj.Tag.Contains("Obj") Then
                                obj.Left += 15
                            End If
                        Case "Maths"
                            If TypeOf obj Is Label AndAlso obj.tag.Contains("Obj") Then
                                obj.Left += 15
                            End If
                    End Select

编辑:我想我会为Shape Spawn和Move添加所有代码。我还没有完成Shape Move的另一半代码,因为我无法让第一部分工作。

Private Sub tmrShapeSpawn_Tick(sender As System.Object, e As System.EventArgs) Handles tmrShapeSpawn.Tick
    If WaveStart = True Then
        Select Case Wav
            Case 1
                NumofObjs = Wave1
            Case 2
                NumofObjs = Wave2
            Case 3
                NumofObjs = Wave3
            Case 4
                NumofObjs = Wave4
            Case 5
                NumofObjs = Wave5
            Case 6
                NumofObjs = Wave6
        End Select
        If F < NumofObjs Then
            Dim newPic As PictureBox = New PictureBox
            Dim newLab As Label = New Label
            Dim CorrectLabel As Label = New Label
            Dim CorrectPictureBox As PictureBox = New PictureBox
            CorrectPictureBox.Height = 75
            CorrectPictureBox.Width = 100
            CorrectLabel.AutoSize = True
            CorrectLabel.BackColor = Color.Transparent
            CorrectPictureBox.BackColor = Color.Transparent
            CorrectPictureBox.SizeMode = PictureBoxSizeMode.Zoom
            CorrectLabel.ForeColor = Color.Blue
            CorrectLabel.Font = New Font("Goudy Stout", 60, FontStyle.Regular)
            Select Case GameMode
                Case "Protector"
                    Randomize()
                    If CorrectMade = False Then
                        CorrectLabel.Left = CorrectLabel.Width
                        CorrectPictureBox.Left = CorrectPictureBox.Width
                        CorrectLabel.Top = Int(Rnd() * (Me.Height - CorrectLabel.Height))
                        CorrectPictureBox.Top = Int(Rnd() * (Me.Height - CorrectPictureBox.Height))
                    End If
                    newLab.Left = newLab.Width
                    newPic.Left = newPic.Width
                    newLab.Top = Int(Rnd() * (Me.Height - newLab.Height))
                    newPic.Top = Int(Rnd() * (Me.Height - newPic.Height))
                Case "Catcher"
                    Randomize()
                    If CorrectMade = False Then
                        CorrectLabel.Top = CorrectLabel.Height
                        CorrectPictureBox.Top = CorrectPictureBox.Height
                        CorrectLabel.Left = Int(Rnd() * (Me.Width - CorrectLabel.Width))
                        CorrectPictureBox.Left = Int(Rnd() * (Me.Width - CorrectPictureBox.Width))
                    End If
                    newLab.Top = newLab.Height
                    newPic.Top = newPic.Height
                    newLab.Left = Int(Rnd() * (Me.Width - newLab.Width))
                    newPic.Left = Int(Rnd() * (Me.Width - newPic.Width))
            End Select
            Select Case Curry
                Case "Maths"
                    lblCriteria.Text = lstNum1.Items.Item(Wav - 1) & " " & lstOp.Items.Item(Wav - 1) & " " & lstNum2.Items.Item(Wav - 1) & " ="
                    If CorrectMade = False Then
                        CorrectLabel.Text = lstAns.Items.Item(Wav - 1)
                        CorrectLabel.Tag = "Obj " & lstAns.Items.Item(Wav - 1)
                        Me.Controls.Add(CorrectLabel)
                        CorrectLabel.BringToFront()
                    End If
                    Randomize()
                    newLab.Text = Int(Rnd() * 100)
                    newLab.Tag = "Obj " & newLab.Text
                    Me.Controls.Add(CorrectLabel)
                    CorrectLabel.BringToFront()
                Case "Shapes"
                    Dim epahs As Integer
                    Dim sap As String
                    lblCriteria.Text = lstShape.Items.Item(Wav - 1)
                    If CorrectMade = False Then
                        CorrectPictureBox.ImageLocation = "Shapes\" & lstShape.Items.Item(Wav - 1) & ".png"
                        CorrectPictureBox.Tag = "Obj " & lstShape.Items.Item(Wav - 1)
                        Me.Controls.Add(CorrectPictureBox)
                        CorrectPictureBox.BringToFront()
                    End If
                    Randomize()
                    epahs = Int(Rnd() * 9)
                    Select Case epahs
                        Case 0
                            sap = "Square"
                        Case 1
                            sap = "Circle"
                        Case 2
                            sap = "Triangle"
                        Case 3
                            sap = "Rectangle"
                        Case 4
                            sap = "Oval"
                        Case 5
                            sap = "Hexagon"
                        Case 6
                            sap = "Star"
                        Case 7
                            sap = "Diamond"
                        Case 8
                            sap = "Trapezium"
                        Case 9
                            sap = "Rhombus"
                    End Select
                    newPic.ImageLocation = "Shapes\" & sap & ".png"
                    newPic.Tag = "Obj " & sap
                    newPic.SizeMode = PictureBoxSizeMode.Zoom
                    Me.Controls.Add(newPic)
                    newPic.BringToFront()
            End Select
            CorrectMade = True
            F += 1
        Else
            WaveStart = False
        End If
    End If
End Sub

 Private Sub tmrShapeMove_Tick(sender As System.Object, e As System.EventArgs) Handles tmrShapeMove.Tick
    Dim CBA As Integer
    Dim NumofObjsLeft As Integer = 0
    For Each obj As Object In Me.Controls
        If obj.Tag.Contains("Obj") Then
            NumofObjsLeft += 1
            If NumofObjsLeft <= 0 Then
                Wav += 1
                WaveStart = True
            End If
            Select Case GameMode
                Case "Protector"
                    Select Case Curry
                        Case "Shapes"
                            If TypeOf obj Is PictureBox AndAlso obj.Tag.Contains("Obj") Then
                                obj.Left += 15
                            End If
                        Case "Maths"
                            If TypeOf obj Is Label AndAlso obj.tag.Contains("Obj") Then
                                obj.Left += 15
                            End If
                    End Select
                    For CBA = 0 To ABC Step 1
                        If Collision(obj, Missile(CBA)) Then
                            Missile(CBA).Visible = False
                            Missile(CBA).Enabled = False
                            If picExplosion1.Visible = True And picExplosion2.Visible = False And picExplosion3.Visible = False Then
                                picExplosion2.Visible = True
                                tmrExplosion2.Start()
                                CentreOn(obj, picExplosion2)
                            ElseIf picExplosion1.Visible = True And picExplosion2.Visible = True And picExplosion3.Visible = False Then
                                picExplosion3.Visible = True
                                tmrExplosion3.Start()
                                CentreOn(obj, picExplosion3)
                            ElseIf picExplosion1.Visible = False Then
                                picExplosion1.Visible = True
                                tmrExplosion1.Start()
                                CentreOn(obj, picExplosion1)
                            Else
                            End If
                            If obj.Tag.Contains(lblCriteria.Text) Then
                                lblScore.Text += 1
                            Else
                                lblLives.Text -= 1
                            End If
                            Me.Controls.Remove(obj)
                        End If
                    Next CBA
                Case "Catcher"
                    Select Case Curry
                        Case "Shapes"
                            If TypeOf obj Is PictureBox AndAlso obj.Tag.Contains("Obj") Then
                                obj.Top += 15
                            End If
                        Case "Maths"
                            If TypeOf obj Is Label AndAlso obj.Tag.Contains("Obj") Then
                                obj.Top += 15
                            End If
                    End Select
                    If Collision(obj, picChar) Then
                        If obj.Tag.Contains(lblCriteria.Text) Then
                            Score += 1
                        Else
                            Lives -= 1
                        End If
                        Me.Controls.Remove(obj)
                    End If
            End Select
        End If
    Next obj

End Sub

2 个答案:

答案 0 :(得分:4)

1)使用background worker代替计时器。它构建为与主表单线程正确交互并更清晰地处理控件交互。对于主要的UI线程同步问题和意外退出,计时器都是出了问题。

2)你必须处理obj.Tag或obj什么都不是。最简单的方法是添加

If obj is Nothing OrElse String.IsNullOrWhitespace(obj.Tag) Then
 Continue For
End If

...作为For循环后的第一个语句。

答案 1 :(得分:0)

对,感谢所有评论的人,回答说。它现在似乎只是在那个额外的条件下工作。添加if语句以在比较文本之前检查标记是否为空。

Dim NumofObjsLeft As Integer = 0
    For Each obj As Object In Me.Controls
        If obj.Tag > "" Then
            If obj.Tag.Contains("Obj") Then
                NumofObjsLeft += 1
                If NumofObjsLeft <= 0 Then
                    Wav += 1
                    WaveStart = True
                End If
                Select Case GameMode
                    Case "Protector"
                        Select Case Curry
ETC...................................................