marvin_hubert Geschrieben 18. Mai 2010 Geschrieben 18. Mai 2010 Guten Tag *Nicht zum Thema gehörend Ich bin zwar weder als Fachinformatiker tätig, noch werde ich demnächst meine Ausbildung in diese Fachrichtung beginnen. Ich bin gerade 17 Jahre alt und besuche derzeit die 10.Klasse eines Gymnasiums in Nordrhein-Westfahlen. Nach meinem Abi (vorraussichtlich 2013) strebe ich jedoch einen Beruf im IT-Bereich an. * Nicht zum Thema gehörend Nun aber zu meinem/n Problem/en: Zunächst einmal der Code um welchen sich alles dreht Form1.vb: Public Class Form1 Private Field As Game Dim position As String Dim wegfrei As Boolean Dim schritte As Integer = 0 Dim level As Integer = 1 Dim bausteine As New PictureBox Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Call stufen() End Sub Public Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown 'Links Select Case Field.Feld(Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.X - 1, Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.Y) Case 0 wegfrei = True Case 1 wegfrei = False Case 2 wegfrei = True Case 3 position = "links" End Select '' Start Try ' hier machst du was ' sollte dabei ein Fehler auftreten ' springt der Debugger automatisch zum Catch Block ' ohne eine Fehlermeldung dem User zu zeigen Catch ex As Exception ' hier kannst du im Falle eines Fehlers den Fehler bzw. die Exception (Ausnahmne) verarbeiten MsgBox(ex.Source & " : " & ex.InnerException.ToString & " : " & ex.Message) End Try '' Ende 'Rechts Select Case Field.Feld(Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.X + 1, Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.Y) Case 0 wegfrei = True Case 1 wegfrei = False Case 2 wegfrei = True Case 3 position = "rechts" Case 4 End Select 'Drunter Select Case Field.Feld(Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.X, Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.Y + 1) Case 0 wegfrei = True Case 1 wegfrei = False Case 2 wegfrei = True Case 3 position = "drunter" End Select 'Drüber Select Case Field.Feld(Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.X, Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.Y - 1) Case 0 wegfrei = True Case 1 wegfrei = False Case 2 wegfrei = True Case 3 position = "drüber" End Select Select Case e.KeyValue Case 37, 65 Select Case wegfrei Case True Me.Controls(Me.Controls.IndexOfKey("roboter")).Left -= 75 schritte = schritte + 1 schritte_ausg.Text = schritte Case False MsgBox("nicht möglich") End Select Case 38, 87 Select Case wegfrei Case True Me.Controls(Me.Controls.IndexOfKey("roboter")).Top -= 75 schritte = schritte + 1 schritte_ausg.Text = schritte Case False MsgBox("nicht möglich") End Select Case 39, 68 Select Case wegfrei Case True Me.Controls(Me.Controls.IndexOfKey("roboter")).Left += 75 schritte = schritte + 1 schritte_ausg.Text = schritte Case False MsgBox("nicht möglich") End Select Case 40, 83 Select Case wegfrei Case True Me.Controls(Me.Controls.IndexOfKey("roboter")).Top += 75 schritte = schritte + 1 schritte_ausg.Text = schritte Case False MsgBox("nicht möglich") End Select End Select If Field.Feld(Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.X, Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.Y) = 3 Then Call schieben() End If Call check() End Sub Private Sub schieben() With Me.Controls(Me.Controls.IndexOfKey("kiste")) Select Case position Case "rechts" Me.Controls(Me.Controls.IndexOfKey("kiste")).Left = Me.Controls(Me.Controls.IndexOfKey("kiste")).Left - 75 Case "links" Me.Controls(Me.Controls.IndexOfKey("kiste")).Left = Me.Controls(Me.Controls.IndexOfKey("kiste")).Left + 75 Case "drüber" Me.Controls(Me.Controls.IndexOfKey("kiste")).Top = Me.Controls(Me.Controls.IndexOfKey("kiste")).Top + 75 Case "drunter" Me.Controls(Me.Controls.IndexOfKey("kiste")).Top = Me.Controls(Me.Controls.IndexOfKey("kiste")).Top - 75 End Select End With End Sub Private Sub check() If Me.Controls(Me.Controls.IndexOfKey("roboter")).Left = Me.Controls(Me.Controls.IndexOfKey("ziel")).Left And Me.Controls(Me.Controls.IndexOfKey("roboter")).Top = Me.Controls(Me.Controls.IndexOfKey("ziel")).Top Then MsgBox("Stufe geschafft" & "Benötigte Schritte: " & schritte) level = level + 1 Me.Controls.Clear() Call stufen() Else End If End Sub Private Sub stufen() Select Case level Case 1 Field = New Game("C:\Users\Marvin\Desktop\Informatik2\Informatik-Sokoban-17.05.2010\Informatik-Sokoban-17.05.2010\LEVEL\1.txt") Case 2 Field = New Game("C:\Users\Marvin\Desktop\Informatik2\Informatik-Sokoban-17.05.2010\Informatik-Sokoban-17.05.2010\LEVEL\2.txt") Case 3 Field = New Game("C:\Users\Marvin\Desktop\Informatik2\Informatik-Sokoban-17.05.2010\Informatik-Sokoban-17.05.2010\LEVEL\3.txt") Case 4 Field = New Game("C:\Users\Marvin\Desktop\Informatik2\Informatik-Sokoban-17.05.2010\Informatik-Sokoban-17.05.2010\LEVEL\4.txt") Case 5 Field = New Game("C:\Users\Marvin\Desktop\Informatik2\Informatik-Sokoban-17.05.2010\Informatik-Sokoban-17.05.2010\LEVEL\5.txt") Case 6 MsgBox("Herzlichen Glückwunsch. Du hast das Spiel gewonnen. Das Programm wird nun beendet") Me.Close() End Select For x As Integer = 0 To 7 For y As Integer = 0 To 7 Dim baustein As New PictureBox Dim baustein2 As New PictureBox Select Case Field.Feld(x, y) Case 0 Me.Controls.Add(baustein) With baustein .Parent = Me .Name = "boden" & (x + (y * 2)) .Left = 75 * x .Top = 75 * y .Height = 75 .Width = 75 .BackgroundImage = My.Resources.Boden .SendToBack() End With Case 1 Me.Controls.Add(baustein) With baustein .Parent = Me .Name = "mauer" & (x + (y * 2)) .Left = 75 * x .Top = 75 * y .Height = 75 .Width = 75 .BackgroundImage = My.Resources.Mauer .SendToBack() End With Case 2 Me.Controls.Add(baustein) Me.Controls.Add(baustein2) With baustein .Parent = Me .Name = "boden" & (x + (y * 2)) .Left = 75 * x .Top = 75 * y .Height = 75 .Width = 75 .BackgroundImage = My.Resources.Boden .SendToBack() End With With baustein2 .Parent = Me .Name = "roboter" .Left = 75 * x .Top = 75 * y .Height = 75 .Width = 75 .BackgroundImage = My.Resources.Roboter .BringToFront() End With Case 3 Me.Controls.Add(baustein) Me.Controls.Add(baustein2) With baustein .Parent = Me .Name = "boden" & (x + (y * 2)) .Left = 75 * x .Top = 75 * y .Height = 75 .Width = 75 .BackgroundImage = My.Resources.Boden .SendToBack() End With With baustein2 .Parent = Me .Name = "kiste" & (x + (y * 2)) .Left = 75 * x .Top = 75 * y .Height = 75 .Width = 75 .BackgroundImage = My.Resources.Kiste .BringToFront() End With Case 4 Me.Controls.Add(baustein) With baustein .Parent = Me .Name = "ziel" & (x + (y * 2)) .Left = 75 * x .Top = 75 * y .Height = 75 .Width = 75 .BackgroundImage = My.Resources.Ziel .BringToFront() End With End Select Next Next 'end End Sub End Class Game.vb: Public Class Game Public Feld(,) As Integer Public Sub New(ByVal file As String) 'auslesen Dim inhalt As New List(Of String) inhalt.AddRange(IO.File.ReadAllText(file).Split(CChar(" "))) Dim k(7, 7) As Integer 'auswerten For x As Integer = 0 To 7 For y As Integer = 0 To 7 k(x, y) = CInt(CStr(inhalt(x)(y))) Next Next Feld = k End Sub End Class Mein derzeitiges Problem ist ein IndexOutOfRangeException-Fehler, welcher an folgender Stelle in der Form1.vb auftritt, wenn ich eine Pfeiltaste drücke (und somit das keydown Event anspreche) [...] Select Case Field.Feld(Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.X - 1, Me.Controls(Me.Controls.IndexOfKey("roboter")).Location.Y) Case 0 [...] Ich stehe völlig auf dem Schlauch. Ich hab echt keine Ahnung wodurch der Fehler entsteht. Ich würde mich über eine Hilfreiche Antwort sehr freuen! Mit freundlichen Grüßen, marvin_hubert Zitieren
Mcolli Geschrieben 19. Mai 2010 Geschrieben 19. Mai 2010 (bearbeitet) Hallo, Ich habe leider nur Visual Studio Express für c# deshalb kann ich deinen Code gerade nicht kopieren. Ich vermute aber es liegt am folgendem: Die Methode IndexOfKey der Klasse Control.ControlCollection die Du hier aufrufst Me.Controls.IndexOfKey("roboter") gibt wie alle "IndexOf" - Methoden den Wert -1 für eine nicht gefundenes Objekt zurück. -1 ist ein Index der bei einem Array / einer Liste / einer Colelction / etc. nicht möglich ist da der kleinste vergebene Index immer 0 ist. Wenn der Ausdruck Me.Controls.IndexOfKey("roboter") also den Wert -1 liefert führt dieser Ausdruck Me.Controls(Me.Controls.IndexOfKey("roboter")) zu der angezeigten Expcetion. Das wird daran Liegen, dass die Methode "IndexOfKey" nicht rekursiv arbeitet. Die Form (mit "Me" angesprochen) hat keine Control mit dem Namen "roboter", sondern nur sagen wir ein Panel. Das Panel wiederum beinhaltet dann die gesuchte Control mit dem Namen "roboter". Also musst statt in der Form (also "Me") in dem Panel suchen. [U]Panel1[/U].Controls(Panel1[I][/I].Controls.IndexOfKey("roboter")) Wenn Du keine Ahnung hast was der Parent der gesuchten Control ist musst Du eine rekursive Such Mehtode schreiben und die Dann mit dem TopParent (in dem Fall die Form also "Me") aufrufen: // Ist jetzt C# Code sollte aber gut umzumünzen sein private int findIndexOfControl(Control parent, String key) { [INDENT] if (parent.Controls.IndexOfKey(key) != -1) { [INDENT] // Wenn das Element gefunden wurde wird der Index zurück geben. return parent.Controls.IndexOfKey(key); [/INDENT] } else { [INDENT] int gesuchterIndex = -1; // Hier erfolgt der Rekursive aufruf der Suchmethode und zwar so lange bis // alles durchsucht wurde oder das Control gefunden wurde. for (int i = 0; i < parent.Controls.Count && gesuchterIndex == -1; i++) { [INDENT] gesuchterIndex = findIndexOfControl(parent.Controls[i], key); [/INDENT] } return gesuchterIndex;[/INDENT] } [/INDENT] } der Aufruf der Methode erfolgt dann Mittels findIndexOfControl(Me, "roboter"); Bearbeitet 19. Mai 2010 von Mcolli Zitieren
marvin_hubert Geschrieben 19. Mai 2010 Autor Geschrieben 19. Mai 2010 Hmm... hab da leider meine Schwierigkeiten im Umwandeln :/ soweit bekomme ich es ja noch hin: private function findIndexOfControl(Control parent, String key) as integer if parent.Controls.IndexOfKey(key) <> -1 then return parent.Controls.IndexOfKey(key) else dim gesuchterIndex as integer = -1 /*hier fängt es an zu hapern for (int i = 0; i < parent.Controls.Count && gesuchterIndex == -1; i++) { gesuchterIndex = findIndexOfControl(parent.Controls, key); /*hier hört es auf zu hapern return gesuchterIndex end function bitte um Hilfe :/ Gruß Zitieren
Mcolli Geschrieben 19. Mai 2010 Geschrieben 19. Mai 2010 Hab wie gesagt keine Entwicklungsumgebung (IDE) die VB unterstützt aber wenn ich an meine gehassten VBA-Makros zurück denke müsste das so aussehen (also nur der Teil wo es harpert): for i as Integer = 0 To parent.Controls.Count gesuchterIndex = findIndexOfControl(parent.Controls(i), key); if gesuchterIndex <> -1 then EXIT FOR Next Wenn Du allerdings weisst was der Container deines "Roboter" Controls ist kannst Du Dir die Suchmethode schenken und einfach: [I]Containername[/I].Controls.IndexOfKey("roboter") schreiben um an den Index des Controls zu kommen. Ein Container ist das Übergeordnete "Steuer"-Element ... Also ein Panel zum Beispiel. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.