Argumente fehlerhaft, Konvertierung scheitert



  • Ok, also ich habe in Zeile 28 den Breakpoint gesetzt. Gehe nun mit F10 durch. Er beginnt in folgendem Code (Haupteinstiegspunkt bis zum Ende):

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    using Hauptprogramm;
    
    namespace Magic_Deck_Viewer
    {
        static class Program
        {
            /// <summary>
            /// Der Haupteinstiegspunkt für die Anwendung.
            /// </summary>
            [STAThread]
    
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
    

    In der letzten Zeile öffnet er die Form1. Wie mache ich dann weiter? Wenn ich die Form beende wird das Debugging beendet, wenn ich in den Code drücke und F10 drücke, passiert nichts mehr.



  • Musst du Form1_Load eventuell noch Abonnieren? (this.Load += new EventHandler(this.Form1_Load);)

    PS.
    Du hast Hauptsächlich Deutsche Bezeichner außer "Colors" und "DeckValue" (Und dein Haupt Namespace). Versuch konsistent zu bleiben. Entweder alle Deutsch ("Farben", "DeckWert") oder alle Englisch.



  • Da ich das noch nicht getan habe ist das wohl da sProblem;)
    Das muss ich in diesem Entwurf (oder wie das heißt, weiß das leider nicht so genau) oder so ändern oder? Wie komme ich da denn hin. Gibts da eine bestimmte Taste.

    Wegen den Bezeichnungen muss ich sagen, das ich nicht hauptsächlich deutsche habe, da TEXT und NAME international sind;) Kategorie kam nachträglich und da habe ich mich vertippt, habe das natürlich jetzt aber geändert, danke für den Hinweis.



  • benutzer_1234 schrieb:

    Da ich das noch nicht getan habe ist das wohl da sProblem;)
    Das muss ich in diesem Entwurf (oder wie das heißt, weiß das leider nicht so genau) oder so ändern oder? Wie komme ich da denn hin. Gibts da eine bestimmte Taste.

    Du müsstest im Konstruktor
    this.Load +=
    tippen können, VS schlägt dann Text vor welches du mit Tab erstellen lassen kannst.
    Ansonsten schau mal in dem Properties Editor vom Designer, wenn ich mich recht erinnere gibts da ein bereich mit einem 'Blitz' Symbol, das wählst du aus, und da kannst du dann die Eventhandler automatisch erstellen lassen.


  • Administrator

    David W schrieb:

    Musst du Form1_Load eventuell noch Abonnieren? (this.Load += new EventHandler(this.Form1_Load);)

    Ich würde eher sagen, dass er die falsche Taste gedrückt hat. Mit F10 startet man am Anfang des Programmes, mit F5 startet das Programm im Debugmodus und geht bis zum ersten Breakpoint 🙂

    @benutzer_1234,
    Am Anfang F5 drücken, nicht F10! 🙂

    Grüssli



  • Letzteres habe ich gemacht, aber da öffnet er die Form sofort und danach passiert nichts mehr. ALso das mit dem Event müsste eigentlich schon stimmen. Da Event ist dann dafür, für den Fall, dass Form1 geladen wird oder?



  • Also das mit dem Event Handler hat geklappt. Ich habe es angefangen eizutippen und er hat den Rest vorgeschlagen. Nun steht dann in meiner listDecks jedoch beim Programmstart alles nicht untereinander dicht an dicht, sondern immer 2 nebeneinander und zwischen den Zeilen auch zweimal ein Zeilenumbruch. Dadurch sehen die Einträge sehr unübersichtlich aus. Wie kann man das ändern?



  • benutzer_1234 schrieb:

    Wie kann man das ändern?

    Indem du dir überlegst, was passiert ist. Du musst mal darüber nachdenken wie es zu dem Ergebnis kommen konnte (schließlich hat es einen Grund, das es jetzt so aussieht). Und schlussendlich indem du den Debugger benutzt und dir genau anschaust, wann was zur liste hinzugefügt wird 😉 Fragen denen du nachgehen solltest: Hat das Auslesen der Datei geklappt? Wie sieht meine Decktabelle nach dem Auslesen aus? Liegt das Problem beim Hinzufügen zur Liste?



  • OK, also da du weißt, wo der Fehler scheinbar liegt kann ich beruhigt versuchen den selber rauzufinden, da das Problem mal wieder vor dem Bildschirm sitzt 🙂
    Ich habe das mit dem Breakpoint mal versucht nach Anleitung.
    Habe mir die Werte reingezogen: deck.Name, liste, listDecks.Items
    Bei liste kam ganricht erst was und ich weiß nicht wieso. listDeck.Items lief einwandfrei nur beim letzten Eintrag meiner Textdatei soll was fehlerhaft gewesen sein. Problem ich kann nicht rekonstruieren. Das debugging funktioniert nun weider nicht mehr, obwohl der Evetnhandler noch vorhanden ist. Ich hatte was wegen einer Fehlermeldung im designer gelöscht und weiß nicht mehr was. Möglicherweise gab es da nochmal einen Eintrag zum Eventhandler.



  • Also das Debugging selber funktioniert natürlich, aber nur bis zum Form1_Load.
    Ab da kann ich nicht mehr mit F10 hin und her springen und überprüfen, was passiert in listDecks und so weiter. Es wird auch wieder nicht ausgegeben in listDecks. Der Eventhandler im Konstruktor ist aber unverändert.



  • Wieso machst du immer mit F10 rum? Setz ein Breakpoint in die Load Methode und steppe mit F5 durch.



  • OK, also ich habe F5 gedrückt nach dem Setzen eines Breakpoints auf die Form1_Load (listDecks.Items.Add(deck.Name.ToString());)
    Er öffnet dann die Form1 und dann kann ich nciht weiter debuggen. Wenn ich auf das Visual C Codefesnter klicke um weiter zu debuggen, passiert nichts mehr bei F5. Wenn das daran liegt, aber wieso?
    Ich müsste nur wissen, ob ich falsch debugge, oder das schon mit dem Grund zu tun hat, wesahlb nichts in list erscheint oder ob irgendwas anderes nicht stimmt, weil er die Liste ja vor 3-4 Stunden noch befüllt wurde ohne Probleme. Vielleicht muss ich ja mal den PC neu starten, hatte schonmal ein ähnliches Probelm 😉


  • Administrator

    Mit F5 startest du das Programm mit dem Debugger angehängt. Dieser läuft solange, bis er zum ersten Breakpoint kommt und stoppt dort. Du solltest beim Breakpoint sein, welcher eine gelbe Markierung nun hat. Sofern natürlich du überhaupt einen Breakpoint gesetzt hast?
    Mit F10 gehst du dann Schritt für Schritt weiter. F10 überspringt dabei aber Funktionen usw., während du mit F11 bei jedem Schritt auch in die Funktion selber vordringen kannst.
    Mit F5 kannst du sagen, dass der Debugger wieder weiterlaufen soll, bis zum nächsten Breakpoint.

    War das nun etwas verständlicher? 🙂
    Und sonst: Beschreib dein Problem genauer. "Passiert nichts mehr" ist mir etwas zu ungenau 🤡

    Grüssli



  • Ich tippe darauf, daß der Form.Load() gar nicht mehr abonniert ist.
    Schau mal in die zugehörige form.designer.cs, ob dort

    this.Load += new EventHandler(this.Form1_Load);
    

    noch drin steht (bzw. im Eigenschaftfenster beim Load-Ereignis).

    Außerdem könntest du den gesamten Code von Form.Load() auch im Konstruktor ausführen (nach InitializeComponent()).



  • @Dravere: Ahhh, dann macht es ja auch Sinn mehrere Breakpoints zu setzen. Kommt davon, wenn man sich nur ums programmieren kümmert, aber nicht um die Umgebung 😉
    Weshalb ich geschrieben habe, dass ernichts gemacht hat, hätte wirklich mal genauer sein können. Sorry für die mangelnde Ausführung. Mein Programm kommt bei F5 garnicht erst zum Breakpoint, der wird nicht auf Geld gesetzt.

    Womit wir also dazu kommen, dass der EventHandler nicht mehr stimmt, weshalb auch immer, wo ich dann zu Th69 komme:

    Der Eintrag fehlt im Designer tatsächlich. War aber vorher da?! Wenn ich die Zeile nun so eingebe, dann wird allerdings der Eventhandler angegangen, das ein using Verweis fehlt. Blöd nur, dass der Eventhandler im namespace Hauptprogramm ist, den die Form1 ja auch hat, also jetzt verstehe ich ganrichts mehr 😞



  • Habe jetzt kurzen Prozess gemacht. Eventhandler komplett raus und über den Blitz bei Eigenschaften einfach einen neuen genriert. Jetzt läuft das debugging auch wieder weiter.

    Wenn ich ale durchgehe, dann macht er alles erstmal wie gewollt. Beim Listen füllen erhöht er dann die Zahl der Counts, was ja auch sein soll. Allerdings ist bei öffnen der Form1 dann deck.Name null, weshalb er auch nichts ausgeben kann.

    Liegt der Fehler darin, wie ich die Liste zurückgebe?


  • Administrator

    benutzer_1234 schrieb:

    Habe jetzt kurzen Prozess gemacht. Eventhandler komplett raus und über den Blitz bei Eigenschaften einfach einen neuen genriert. Jetzt läuft das debugging auch wieder weiter.

    Hätte ich nicht anders gemacht 😉

    benutzer_1234 schrieb:

    Liegt der Fehler darin, wie ich die Liste zurückgebe?

    Sieht nicht so aus. Ausser der Code den du hier zeigst, stimmt nicht überrein mit deinem Code 😉
    Verkleinere mal das Deck auf ein paar Einträge und geh einfach mal mit dem Debugger durch, was er denn genau lädt. Du solltest unten beim Debuggen weitere Fenster haben (Autos, Locals). Sonst kannst du die Fenster holen über das Menü Debug -> Windows. Sobald der Debugger irgendwo hält, siehst du dort die Variablen und kannst sie auch aufklappen, um die inneren Werte zu sehen. Dies geht auch, wenn du mit der Maus über der Variable im Code schwebst.

    Also den Breakpoint am Anfang setzen und dann auch in die LoadFromFile reinsteppen mit F11 und die Methode durchgehen. Dann siehst du auch, ob alles korrekt geladen und abgelegt wird. Wenn du mit F10 durch die Methode stepst und ans Ende kommst, geht er automatisch wieder raus in die Load Methode. Bei GetDecks wieder F11 drücken, damit du reinkommst und wieder F10 bis du rauskommst.

    Über die Locals kannst du jeweils prüfen, welche Werte denn in der Liste sind.

    Noch so ein paar Dinge am Rande:
    Du hast erneut alle Variablen öffentlich gemacht. Komm davon weg! Mach alles privat was privat sein kann und nur das öffentlich, was wirklich öffentlich sein muss. Verwende Getter und Setter. Das erleichtert dir auch das Debuggen, damit nicht jeder von überallher auf die Variablen zugreifen kann und du damit bessere Kontrolle hast.
    Wieso verwendest du als Wert des Decks decimal ? decimal sollte man nur für Spezialfällen benutzen, da es eine 128 Bit 10er Potenz Gleitkommazahl ist. Für Dezimalzahlen reicht float oder double meistens aus. Wenn man mit Ganzzahlen arbeitet, sollte man auch Ganzzahlen verwenden, z.B. int .

    Grüssli



  • Ok, habe mir das Ausgabefenster geholt und das Debuggen gestartet.Ist es normal, dass dabei unzählige Zeilen rauskommen, bei denen in etwa das folgende steht:

    Einzelschritt: Nichtbenutzercode "System.Windows.Forms.Application.SetCompatibleTextRenderingDefault" wird übersprungen.
    


  • Was ich schonmal sagen kann, das Programm befühlt die Werte (deck.Name) ordnungsgemäß. Auslesen der Datei funktioniert also. Die while-Schleife:

    while ((line = rd.ReadLine()) != null)
                {
                    string[] words = line.Split('|');
    
                    Deck deck = new Deck();
                    deck.Colors = words[0];
                    deck.Name = words[1];
                    deck.Categorie = words[2];
                    deck.Text = words[3];
                    deck.DeckValue = decimal.Parse(words[4]);
    
                    liste.Add(deck);
                }
    

    wird bis zum letzten Eintrag durchgeführt. Dann springt er in die Kopfzeile und möchte von vorn anfangen. Beim F11 auf deck.Colors stellt er fest, es gitb nun keinen Eintrag mehr und beendet die Schleife und öffnet sofort das Formload.

    Danach springt er aber nicht in Hauptprogramm zurück, um:

    List<Deck> Decks = decktab.GetDecks();
    
                foreach (Deck deck in Decks)
                {
                    listDecks.Items.Add(deck.ToString());
                }
    

    auszuführen.


  • Administrator

    Hast du eine leere Zeile im File? Z.b. am Ende? Dann führt das line.Split('|') zu einem Array mit der Länge 0 und wenn du auf words[0] zugreifst, wird eine IndexOutOfRangeException geworfen.

    Er stellt daher nicht fest, dass es keine Einträge mehr gibt bei words[0] und beendet nicht einfach die Schleife, sondern er wirft dann eine IndexOutOfRangeException . Und das sollte jedem sofort auffallen ... 😕

    benutzer_1234 schrieb:

    Ok, habe mir das Ausgabefenster geholt und das Debuggen gestartet.Ist es normal, dass dabei unzählige Zeilen rauskommen, bei denen in etwa das folgende steht:

    Einzelschritt: Nichtbenutzercode "System.Windows.Forms.Application.SetCompatibleTextRenderingDefault" wird übersprungen.
    

    Ja, das ist normal. Wenn du irgendwo reinspringen wolltest, was nicht zu deinem Code gehört. Wenn also dein Debugger z.B. bei Application.SetCompatibleTextRenderingDefault(false) war und du auf F11 gedrückt hast 😉

    Grüssli


Anmelden zum Antworten