Lesen von .txt Datei und trennen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 181 Antworten in diesem Thema. Der letzte Beitrag () ist von Lightsource.

    Klare Sätze und Vorgaben. Besser ;)

    MrSKY schrieb:

    Sobald dies geschehen ist soll bereits der zweite Eintrag der .txt als "CommandText" entstehen.
    Aha. Das ist mir neu. Das ist an sich leicht gemacht. Statt SelectedIndex auf -1 zu setzen, setze ihn auf … 1?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Das ist an sich leicht gemacht.

    Naja fast, das ändert ja nichts in der TextBoxCommand.
    Sobald ich was auswähle in der ItemCB soll schon $ci ItemCB entstehen.
    Ich würde sagen das der Fehler bzw die richtige Definition hier fehlt:

    VB.NET-Quellcode

    1. Private Sub CreateNewCommandText()
    2. If Not GunaRadioButton_EQAAdventurer.Checked AndAlso Not GunaRadioButton_EQASwordsman.Checked AndAlso Not GunaRadioButton_EQAArcher.Checked AndAlso Not GunaRadioButton_EQAMage.Checked AndAlso Not GunaRadioButton_EQAMartialArtist.Checked OrElse ComboBox_EQAItem.SelectedIndex = -1 OrElse ComboBox_EQARarity.SelectedIndex = -1 OrElse ComboBox_EQAUpgrade.SelectedIndex = -1 Then Return
    3. Dim CommandText = "$ci " + EQAAdventurer(ComboBox_EQAItem.SelectedIndex)
    4. If ComboBox_EQARarity.SelectedItem.ToString <> "0" Then
    5. CommandText &= " " & ComboBox_EQARarity.SelectedItem.ToString
    6. If ComboBox_EQAUpgrade.SelectedItem.ToString <> "0" Then CommandText &= " " & ComboBox_EQAUpgrade.SelectedItem.ToString
    7. ElseIf ComboBox_EQAUpgrade.SelectedItem.ToString <> "0" Then
    8. CommandText &= " 0 " & ComboBox_EQAUpgrade.SelectedItem.ToString
    9. End If
    10. TextBox_EQACommand.Text = CommandText
    11. End Sub
    Zeile#3 erstellt den Anfang von CommandText. Da steht dann eben $ci und das ausgewählte Item drinne. Und dann eben ggf. noch Rarity und Upgrade. Was soll denn sonst noch passieren? Irgendwie scheine ich das aktuelle Problem nicht zu verstehen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    aktuelle Problem nicht zu verstehen.

    gyazo.com/de0606c6a15171db8f269d430038ce91

    Anders kann ich es nicht erklären.
    Ich wähl den RB an -> wähle dann etwas in der Item CB und dann fehlt der Command.
    Dieser muss bereits nach dem auswählen des Items in der TextBox erscheinen.
    Der Text erscheint erst wenn man Rarity und Upgrade auch ausgewählt hat.
    Nochemol zum Thema Debuggen und Problem selber finden: Setze in der CreateNewCommandText()-Methode geschickt Haltepunkte.
    Erstmal in der Anfangsbedingungszeile, einmal in der Zeile#4 (If ComboBox_EQARarity.SelectedItem.ToString <> "0" Then) und einen bei der Zeile TextBox_EQACommand.Text = CommandText. Dann starte Dein Programm, wähle eine Spielerrolle aus (wenn das Programm jetzt stoppt, setze das Programm fort) und dann wähle ein Item. Dann muss der Compiler zuerst bei dem ersten Haltepunkt halten.
    • Wenn der 1. Haltepunkt nicht erreicht wird, wird die Methode gar nicht aufgerufen, also ist da der Fehler. -> Methodenaufruf prüfen
    • Wenn der 1. Haltepunkt doch erreicht wird, setzt Du das Programm fort.
      • Wenn der 2. Haltepunkt nicht erreicht wird, trifft eine der Abbruchbedingungen zu, also ist da der Fehler. -> Gehe alle Bedingungen durch und schaue, welche da zutrifft und korrigiere den Code oder gib bescheid, welche Abbruchbedingung zutrifft.
      • Wenn der 2. Haltepunkt erreicht wird, setzt Du das Programm fort.
        • Wenn der 3. Haltepunkt erreicht wird, schaust Du rein, was in CommandText drinsteht, indem Du mit der Maus auf die Variable zeigst.
    So. Und nun sag mir, wo der Fehler ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Wenn der 1. Haltepunkt nicht erreicht wird, wird die Methode gar nicht aufgerufen, also ist da der Fehler. -> Methodenaufruf prüfen

    Folgendes tritt bei mir zu die beiden Haltepunkte werden gar nicht erreicht.

    VB.NET-Quellcode

    1. ​Dim CommandText = "$ci " + EQAAdventurer(ComboBox_EQAItem.SelectedIndex)


    heißt der Fehler muss hier irgendwo sein
    Wenn Du den 1. Haltepunkt in der 1. Zeile der Methode setzt (alternativ in der Zeile Private Sub CreateNewCommandText()) und dieser Punkt nicht erreicht wird, rufst Du somit die Methode nicht auf, obwohl Du es solltest. Daher musst Du schauen, ob in dem SelectedIndexChanged-EventHandler der ItemComboBox die Methode aufgerufen wird.
    Was steht in der Private Sub ComboBox_EQAItem_SelectedIndex(sender As Object, e As EventArgs) Handles ComboBox_EQAItem_SelectedIndex? Bitte per Screenshot belegen.


    Wenn die 1. Zeile nicht erreicht wird, wird eine spätere Zeile auch nicht erreicht. Von daher weiß ich jetzt auch nicht, warum Du Zeile mit Dim CommandText erwähnst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Wenn Zeile#1 erreicht wird, aber Zeile#3 nicht, dann trifft eine der Abbruchbedingungen zu, obwohl das nicht sein sollte. Hatte ich doch schon oben aufgezählt, wie Dein Vorgehen sein sollte. Jetzt musst Du eben schauen, welche Abbruchbedingung zutrifft und da nachbessern.
    Setze also einen Haltepunkt auf End Sub und sobald Du eine Rolle und ein Item gewählt hast, kommt der Compiler wieder beim Haltepunkt bei End Sub vorbei. Der Haltepunkt in Zeile#3 wurde dann nicht erreicht. Dann kannst Du mit der Maus auf die einzelnen Abbruchbedingungen zeigen und sobald Du ein True siehst, weißt Du, wo der Fehler ist.

    ##########

    @MrSKY
    Oder eine Debug-Technik niedriger:

    VB.NET-Quellcode

    1. Private Sub CreateNewCommandText()
    2. If Not GunaRadioButton_EQAAdventurer.Checked AndAlso Not GunaRadioButton_EQASwordsman.Checked AndAlso Not GunaRadioButton_EQAArcher.Checked AndAlso Not GunaRadioButton_EQAMage.Checked AndAlso Not GunaRadioButton_EQAMartialArtist.Checked Then MessageBox.Show("Es wurde keine Rolle gewählt.") : Return
    3. If ComboBox_EQAItem.SelectedIndex = -1 Then MessageBox.Show("Es wurde kein Item gewählt.") : Return
    4. If ComboBox_EQARarity.SelectedIndex = -1 Then MessageBox.Show("Es wurde keine Seltenheit gewählt.") : Return
    5. If ComboBox_EQAUpgrade.SelectedIndex = -1 Then MessageBox.Show("Es wurde kein Upgrade gewählt.") : Return
    6. Dim CommandText = "$ci " + EQAAdventurer(ComboBox_EQAItem.SelectedIndex)
    7. If ComboBox_EQARarity.SelectedItem.ToString <> "0" Then
    8. CommandText &= " " & ComboBox_EQARarity.SelectedItem.ToString
    9. If ComboBox_EQAUpgrade.SelectedItem.ToString <> "0" Then CommandText &= " " & ComboBox_EQAUpgrade.SelectedItem.ToString
    10. ElseIf ComboBox_EQAUpgrade.SelectedItem.ToString <> "0" Then
    11. CommandText &= " 0 " & ComboBox_EQAUpgrade.SelectedItem.ToString
    12. End If
    13. TextBox_EQACommand.Text = CommandText
    14. End Sub

    Welche Nachricht kommt jetzt, nachdem Du Rolle und Item gewählt hast?
    Bilder
    • Debugging.png

      29,19 kB, 1.137×246, 30 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    VaporiZed schrieb:

    sobald Du ein True siehst, weißt Du, wo der Fehler ist.
    Das war eine Aussage über die Zukunft, keine Frage. Und was sagt uns Deine Debugausgabe? Dass bei der RarityComboBox und der UpgradeComboBox der SelectedIndex jeweils -1 ist. Deshalb wird die Methode abgebrochen. Und deshalb kommt es nicht zu einem CommandText. Da stellt sich natürlich die Frage, wie das sein kann, schließich ist in Deinem Video zu sehen, dass bei den ComboBoxen was ausgewählt ist. Daher ist es ausgeschlossen, dass deren Index -1 ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Tja, da stellt sich die Frage, wie nach Programmstart diese RarityComboBox zu ihrem ausgewählten Wert kommt. Legst Du einen zu Programmstart fest? Wenn ja, wie? Zeig mal bitte den Index-Festlegecode und die Eigenschaften der RarityComboBox, also sowas:
    Bilder
    • Properties.png

      44,43 kB, 821×859, 27 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Legst Du einen zu Programmstart fest?


    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. 'Armour Rarity ComboBox
    3. ComboBox_EQARarity.Items.Add("-2")
    4. ComboBox_EQARarity.Items.Add("-1")
    5. ComboBox_EQARarity.Items.Add("0")
    6. ComboBox_EQARarity.Items.Add("1")
    7. ComboBox_EQARarity.Items.Add("2")
    8. ComboBox_EQARarity.Items.Add("3")
    9. ComboBox_EQARarity.Items.Add("4")
    10. ComboBox_EQARarity.Items.Add("5")
    11. ComboBox_EQARarity.Items.Add("6")
    12. ComboBox_EQARarity.Items.Add("7")
    13. ComboBox_EQARarity.Items.Add("8")
    14. '<<<------>>>
    15. End Sub


    Habe das so eingetragen, selbes gilt für die ComboBox_EQAUpgrade.
    Oder soll ich das nun raus nehmen und im Designer eintragen da sich mittlerweile die Methode geändert hat.

    Edit:
    Habe das alles rausgenommen und im Designer unter Items (Sammlung) eingetragen nun scheint es zu funktionieren.

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

    Dazu 3 Punkte:
    • Kürzer wäre der Code mit ComboBox_EQARarity.Items.AddRange({"-2", "-1", "0", "1", "2", "3", "4", "5", "6", "7", "8"})
    • Aber trag die Items nicht per Code, sondern im Designer ein, dann wird Dein eigener Code kürzer.
    • Ich hab nicht gefragt, wie die Items in die ComboBox kommen, sondern mit welchem Code Du zu Programmstart den SelectedIndex der beiden ComboBoxen festlegst, um sicherzustellen, dass von Anfang an eine Rarity und ein Upgrade gewählt sind und somit die beiden ComboBoxen nie den SelectedIndex -1 haben können.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Ich hab nicht gefragt, wie die Items in die ComboBox kommen, sondern mit welchem Code Du zu Programmstart den SelectedIndex der beiden ComboBoxen festlegst, um sicherzustellen, dass von Anfang an eine Rarity und ein Upgrade gewählt sind und somit die beiden ComboBoxen nie den SelectedIndex -1 haben können.



    Falls damit gemeint soll wie die 0 in die Boxen kommt ich habe im Designer bei den Eigenschaften unter Text die 0 eingefügt.
    Was mir eben aufgefallen ist, wenn ich Adventurer auswähle dann etwas in der CbItem CbRarity und CbUpgrade passt alles jedoch wenn ich dann einen anderen RadioButton benutze z.B. Swordman leert sich die CommandTextBox und auch die CbItem wird richtig gelesen jedoch bleibt bei CbRarity und CbUpgrade der "vorherige" ausgewähle Wert.
    Heißt wenn ich dann unter Swordman nur ein Item auswähle erhalte ich direkt "$ci Item Rarity und Upgrade in die CommandTextBox wobei es einfach nur §ci Item sein sollte.
    Was fehlt wäre das wenn man den RadioButton ändert der "vorherige" ausgewählte Wert in Rarity und Upgrade wieder auf 0 gehen soll.

    VB.NET-Quellcode

    1. Private Sub GunaRadioButton_EQAAdventurer_CheckedChanged(sender As Object, e As EventArgs) Handles GunaRadioButton_EQAAdventurer.CheckedChanged
    2. 'Read File & Split EQAAdventurer
    3. Dim lines() = System.IO.File.ReadAllLines("Ring.txt")
    4. EQAAdventurer.Clear()
    5. ComboBox_EQAItem.Items.Clear()
    6. TextBox_EQACommand.Clear()
    7. For Each line In lines
    8. Dim parts() = line.Split(","c)
    9. ComboBox_EQAItem.Items.Add(parts(0))
    10. EQAAdventurer.Add(parts(1))
    11. Next
    12. ComboBox_EQAItem.SelectedIndex = -1
    13. ComboBox_EQARarity.SelectedIndex = 2
    14. ComboBox_EQAUpgrade.SelectedIndex = 0
    15. '<<<------>>>
    16. CreateNewCommandText()
    17. GunaImageButton_ClipEQA.Visible = False
    18. End Sub

    Ich habe nun unter ​ComboBox_EQAItem.SelectedIndex = -1

    VB.NET-Quellcode

    1. ​ComboBox_EQARarity.SelectedIndex = 2
    2. ComboBox_EQAUpgrade.SelectedIndex = 0

    eingefügt.

    Funktionieren tut es nun, jedoch wollte ich wissen ob das auch richtig gehandhabt ist.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MrSKY“ ()

    Solange Du nicht mit DataBinding arbeitest, ist das der sinnvollste Weg. Belass es dabei.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Belass es dabei.

    Hab ich getan.

    Irgendwie scheint es ein Problem zu geben.

    VB.NET-Quellcode

    1. Private Sub CreateNewCommandText()
    2. If Not GunaRadioButton_EQAAdventurer.Checked AndAlso Not GunaRadioButton_EQASwordsman.Checked AndAlso Not GunaRadioButton_EQAArcher.Checked AndAlso Not GunaRadioButton_EQAMage.Checked AndAlso Not GunaRadioButton_EQAMartialArtist.Checked OrElse ComboBox_EQAItem.SelectedIndex = -1 OrElse ComboBox_EQARarity.SelectedIndex = -1 OrElse ComboBox_EQAUpgrade.SelectedIndex = -1 Then Return
    3. Dim CommandText = "$ci " + EQAAdventurer(ComboBox_EQAItem.SelectedIndex)
    4. If ComboBox_EQARarity.SelectedItem.ToString <> "0" Then
    5. CommandText &= " " & ComboBox_EQARarity.SelectedItem.ToString
    6. If ComboBox_EQAUpgrade.SelectedItem.ToString <> "0" Then CommandText &= " " & ComboBox_EQAUpgrade.SelectedItem.ToString
    7. ElseIf ComboBox_EQAUpgrade.SelectedItem.ToString <> "0" Then
    8. CommandText &= " 0 " & ComboBox_EQAUpgrade.SelectedItem.ToString
    9. End If
    10. TextBox_EQACommand.Text = CommandText
    11. End Sub


    Zeile #3 wird nur EQAAdventurer abgefragt.
    Die Liste von Adventurer ist klein diese hat nur 6 Einträge.
    Wähle ich dann Swordsman funktionieren nur die ersten 6 Einträge, jedoch auch nur die von dem eigentlichen "Adventurer"

    Frage nebenbei:
    Ich habe in dem Debug Ordner nun sehr viele .txt womit die "Übersicht" der tatsächlichen .exe erschwert wird.
    Wie lege ich das fest wenn ich diese ganzen .txt in einem Ordner packe?
    Aktuell hab ich das so geregelt:
    Dim lines() = System.IO.File.ReadAllLines("Ring.txt")

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MrSKY“ ()

    MrSKY schrieb:

    Wähle ich dann Swordsman funktionieren nur die ersten 6 Einträge, jedoch auch nur die von dem eigentlichen "Adventurer"
    Ja sicher. Woher soll der Computer auch wissen, dass Du was anderes haben willst? Da gibt es jetzt mehrere Lösungmöglichkeiten:
    • abfragen, welche Rolle gewählt wurde und mit If-Abfragen dann rausfinden, welche Liste Du brauchst (statt EQAAdventurer)
    • bei Auswahl einer Rolle die EQAAdventurer-Liste neu befüllen, und zwar mit den Daten, die zu der gewählten Rolle gehören; dann wär es aber auch sinnvoll, die Variable umzubenennen, weil der Name EQAAdventurer ja darauf hinweist, dass da drin nur Daten vom Adventurer sind
    • mit richtigen Klassen arbeiten und so die Daten zusammenpacken, die auch zusammengehören (je früher Du den guten Umgang mit eigenen Klassen lernst, desto besser, aber ich befürchte, dass da von Dir zuvor noch einiges an Programmverständnis zu erfassen ist)
    bzgl. der Datei: Wenn alle txt-Dateien nicht direkt im Ordner der EXE liegen, sondern in z.B. dem Unterordner Daten, dann:
    Dim lines() = System.IO.File.ReadAllLines("Daten\Ring.txt")

    btw: wieso beginnen die Namen vieler Variablen bei Dir mit EQA? Selbst wenn das Spiel so heißt, ist das unnötig/redundant
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    btw: wieso beginnen die Namen vieler Variablen bei Dir mit EQA? Selbst wenn das Spiel so heißt, ist das unnötig/redundant

    Weil es mehrere solcher Boxen geben wird bzw. schon gibt und ich so im Code eine bessere Übersicht habe.
    EQW, EQA, EQR, EQAC
    EQ steht für Equipment
    W - Weapon
    A - Armour
    R - Resistance
    AC - Accessories

    Das mit dem Unterordner hat geklappt, lieben Dank :)

    Welcher deiner Punkte findest du am besten bzw. am einfachsten für mich umzusetzen?