2015-09-02 3 views
-3

Для нескольких проектов теперь у меня была эта ошибка, вспышка и полностью заземление моих проектов. В большинстве случаев я просто должен был оставить их и начать новый, другой. В принципе, я просто хочу иметь возможность ссылаться на каждый объект формы, соответствующий определенным критериям. В этом случае это аркадная игра с четырьмя различными режимами игры. Существует таймер, который создает объекты для съемки, и он отлично работает, либо 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 

EDIT: Просто подумал, что я бы добавил весь код для 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 
+1

На какой строке появляется ошибка? –

+0

Ошибка в основном говорит: «Этот объект больше не существует». Это может быть не obj, а свойство obj (например, obj.Tag или Me.Controls). – StingyJack

+0

Это сообщение об ошибке является сообщением об ошибке VB6, а не VB.NET – Plutonix

ответ

4

1) Используйте background worker вместо таймера. Он построен так, чтобы корректно взаимодействовать с основным потоком формы и управлять взаимодействием с управлением немного чище. Таймеры, как известно, проблематичны как для основных проблем синхронизации потоков пользовательского интерфейса, так и для выхода из него неожиданно.

2) Вы должны обрабатывать объект obj.Tag или obj, являющийся ничем. Самый простой способ - добавить

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

... как первое утверждение после цикла For.

+0

Спасибо, но я думаю, что я просто использую свой путь. Я уверен, что использовать фона рабочего лучше, но, похоже, он работает для меня сейчас. Еще раз спасибо. –

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................................................... 
+1

«Если obj.Tag>» «Then» - это не то, что вы хотите использовать в будущем, особенно если другие программисты будут поддерживать код. – StingyJack

+0

Разве это не предложение StingyJack? Кроме того, его ответ лучше, чем делать> –

Смежные вопросы