Der Index und die Länge müssen sich auf eine Position in der Zeichenfolge beziehen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von MaxeStudios.

    Der Index und die Länge müssen sich auf eine Position in der Zeichenfolge beziehen

    Hallo, ich sitze momentan an einem kleinem Spiel welches ich mittels der UTicket dll Multiplayer fähig machen will. Soviel zum Grundgerüst, mein eigentliches Problem liegt dabei ein Teil eines Strings welcher einen Point darstellt, wieder zu einem Point zu konvertieren. Ungefähr folgenden Code habe ich dafür bis jetzt:

    VB.NET-Quellcode

    1. 'deklarationen
    2. Dim playercommand As String = CStr("player1 {X=576,Y=101}")
    3. Dim playeronlynumber As String = playercommand(6)
    4. 'das "{X=576,Y=101}" vom "player1 {X=576,Y=101}" herausschneiden
    5. Dim value As String = playercommand.Substring(7, playercommand.Length)
    6. 'umwandlung in point
    7. value = value.ToUpper().Replace(" ", String.Empty)
    8. Dim il As Point = New Point(0, 0)
    9. If Not String.IsNullOrWhiteSpace(value) Then
    10. Dim stringSeparators() As String = {",", "=", "X", "Y", "{", "}"}
    11. Dim parts As String() = value.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries)
    12. If parts.Length = 2 Then
    13. il = New Point(Integer.Parse(parts(0)), Integer.Parse(parts(1)))
    14. player1.Location = il
    15. End If
    16. End If



    Leider bekomme ich bei Zeile 9 folgende Exception:
    Der Index und die Länge müssen sich auf eine Position in der Zeichenfolge beziehen. Parametername: lenght.


    Irgendwie kann ich garnicht nachvollziehen was daran das Problem ist. Angenommen der String xyz hat den Wert "ABCDEFG", dann müsste mir xyz.lenght doch den Wert 7 ausgeben.
    Screenshot ist im Anhang



    Liebe Grüße
    Bilder
    • Unbenannt.PNG

      14,88 kB, 440×177, 6 mal angesehen

    ╔══╦═╦╦╦═╦══╦══╦╗╔╦═╦╦═╦══╗
    ║║║║╩╠..╣╦╬╗╚╬╗╔╣╚╝║╠║║║╠╗╚╣
    ╚╩╩╩╩╩╩╩═╩══╝╚╝╚══╩═╩╩═╩══╝

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MaxeStudios“ ()

    Du hast nen String von der Länge 10 und fängst bei Stelle 3 an, die nächsten 10 Zeichen zu holen. Klingelt's?
    Lass einfach den 2. Parameter weg, dann wird automatisch der Rest genommen.
    btw: Zeile#7 kann keinen Fehler erzeugen, weil diese bei Dir hier ein Kommentar ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ich glaub du hast mir gerade auf die Sprünge geholfen, danke.
    Habe die Zeile geändert, danke für deinen Hinweis! :D



    lg

    ╔══╦═╦╦╦═╦══╦══╦╗╔╦═╦╦═╦══╗
    ║║║║╩╠..╣╦╬╗╚╬╗╔╣╚╝║╠║║║╠╗╚╣
    ╚╩╩╩╩╩╩╩═╩══╝╚╝╚══╩═╩╩═╩══╝
    @MaxeStudios Bei der nächsten solchen Exception machst Du folgendes:
    • Drücke auf den Button Details und sieh Dir an, was da in den Details steht, das kannst Du auch als Fehlermeldung posten
      oder
    • Starte Dein Programm im Debug-Modus, und es bleibt in der Fehlerzeile mit einer entsprechenden Meldung stehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Dim playercommand As String = CStr("player1 {X=576,Y=101}")
    2. Dim playeronlynumber As String = playercommand(6)
    3. 'das "{X=576,Y=101}" vom "player1 {X=576,Y=101}" herausschneiden
    4. Dim value As String = playercommand.Substring(7, playercommand.Length)


    Was ist wenn der Spieler nicht "player1" sondern HuberMaierMüller heißt?
    Ich empfehle dir ohne den genauen Hintergrund zu wissen dafür eine separate Eigenschaften in einer "Player" Klasse zu definieren, dann kannst du auch X & Y getrent speichern oder zumindest eine Function um diese Daten getrennt zu laden falls notwendig.

    VB.NET-Quellcode

    1. Public Class Player
    2. Property Name As String
    3. Property Location As Point
    4. Public Function GetLocationX() As String
    5. Return Location.X.ToString
    6. End Function
    7. Public Function GetLocationY() As String
    8. Return Location.Y.ToString
    9. End Function
    10. End Class


    Da ich die Übertrag von uticket nicht kenne und wenn du nur Strings übertragen kannst, dann empfehle ich dir ein spezielles Trennzeichen damit beim Server auch die Daten richtig gelesen werden.

    VB.NET-Quellcode

    1. Public Overrides Function ToString() As String
    2. Return $"{Name}|$$|{GetLocationX()}|$$|{GetLocationY()}"
    3. End Function
    4. Public Sub LoadFromString()
    5. 'String Splitten und Bereich 0 in Name... 1 in LocationX usw...
    6. End Sub
    Danke für eure Antworten, hab das Problem gelöst: Statt Dim value As String = playercommand.Substring(7, playercommand.Length) habe ich Dim value As String = playercommand.Substring(7, playercommand.Length - 7) verwendet.

    @ThomasM habe ein kleines Login System geschrieben, der erste der sich zum Server verbindet bekommt den Nickname "player1" und der 2. "player2". Trozdem danke dass du daran gedacht hast :)


    Auch danke an RodFromGermany




    lg

    ╔══╦═╦╦╦═╦══╦══╦╗╔╦═╦╦═╦══╗
    ║║║║╩╠..╣╦╬╗╚╬╗╔╣╚╝║╠║║║╠╗╚╣
    ╚╩╩╩╩╩╩╩═╩══╝╚╝╚══╩═╩╩═╩══╝