Spiedi Geschrieben 25. Juni 2010 Geschrieben 25. Juni 2010 Huhu, ich versuche im Moment, ein Menü zu erstellen, wo man wenn man die 1 drückt die Schriftfarbe auswählen kann, bei die 2 die Hintergrundfarbe und bei 3 das Programm startet kann das so gut wie fertig ist. Wie die Befehle heißen weiß ich, bloß ich bekomme das einfach nicht hin...also bei der 1. Man drückt die 1, wählt die Farbe aus...und kommt zurück zum Menü wo man zwischen 1 bis 3 auswählen kann. Mir wurde geraten das mit goto zu machen...hab da auch schon was geschafft, aber ich bekomm das einfach nicht hin wie oben beschrieben. Mfg Spiedi Zitieren
streffin Geschrieben 25. Juni 2010 Geschrieben 25. Juni 2010 goto hat bei mir nix mit .net zu tun, und wär bei mir im besten fall nen dirty, very DIRTY trick .... Kannst du mal ein bissl code posten ? Ein wenig mehr info zu dem Programm das du schreiben willst wär auch nicht schlecht, also z.b. Konsolen App vs Window App usw. So wirklich verstanden was du ham willst hab ich nämlich nicht. Gruß Sven Zitieren
Spiedi Geschrieben 26. Juni 2010 Autor Geschrieben 26. Juni 2010 (bearbeitet) Huhu, hier in C# static void Main(string[] args) { Farbe: Console.WriteLine("Drücke 1 für die Hintergrundfarbe."); Console.WriteLine("Drücke 2 für die Schriftfarbe."); Console.WriteLine("Um das Programm zu starten, drücke 3."); int Farbe_Hintergrund = Convert.ToInt32(Console.ReadLine()); int Farbe_Schriftart = Convert.ToInt32(Console.ReadLine()); if (Farbe_Hintergrund == 1) { Console.WriteLine("Für Grün, drücke 1 und Enter."); Console.WriteLine("Für Gelb, drücke 2 un Enter."); int Hintergrund_Farbe = Convert.ToInt32(Console.ReadLine()); if (Hintergrund_Farbe == 1) { Console.BackgroundColor = ConsoleColor.Green; Console.Clear(); goto Farbe; } if (Farbe_Hintergrund == 2) { Console.BackgroundColor = ConsoleColor.Yellow; Console.Clear(); goto Farbe; } } if (Farbe_Schriftart == 2) { Console.WriteLine("Für Grün, drücke 1 und Enter."); Console.WriteLine("Für Gelb, drücke 2 und Enter."); int Schriftart_Farbe = Convert.ToInt32(Console.ReadLine()); if (Schriftart_Farbe == 1) { Console.ForegroundColor = ConsoleColor.Green; Console.Clear(); goto Farbe; } if (Schriftart_Farbe == 2) { Console.ForegroundColor = ConsoleColor.Yellow; Console.Clear(); goto Farbe; } } Console.ReadLine(); } } } Warum muss ich immer 1 Enter und dann nochmal 1 und Enter drücke bis man die Hintergrundfarbe auswählen kann? Bearbeitet 26. Juni 2010 von Spiedi Zitieren
Klotzkopp Geschrieben 26. Juni 2010 Geschrieben 26. Juni 2010 Warum muss ich immer 1 Enter und dann nochmal 1 und Enter drücke bis man die Hintergrundfarbe auswählen kann?Weil du am Anfang zweimal von der Konsole einliest. Das Einlesen von Farbe_Schriftart ist Unsinn. Auch die Namenswahl der Variablen für das erste Menü ist irreführend. Du liest ja nur eine Benutzereingabe ein. Ob das dann Hintergrundfarbe oder Schriftfarbe wird, weißt du vorher nicht, daher ist es unpassend, die dafür benutzte Variable schon so zu benennen. Benenn Farbe_Hintergrund in Auswahl1 oder so etwas um, dann ist dein Programm auch besser zu verstehen. Das goto solltest du auch schnellstens loswerden. Dafür gibt es Schleifen. Zitieren
Spiedi Geschrieben 26. Juni 2010 Autor Geschrieben 26. Juni 2010 Achso, Danke. Schleifen? Ich glaub die kenn ich gar nicht. Zitieren
Mcolli Geschrieben 26. Juni 2010 Geschrieben 26. Juni 2010 Ich kann mich den Vorredner nur anschließen: Jumpanweisungen haben in modernen Programmiesprachen nix zu suchen. Ausnahme bildet die "return" Anweisung. Aber auch diese sollte pro Methode auch nur einmal geschrieben werden (Sollte). Die Jumpprediktion-Unit kann heutzutage sehr gut auf ne Alternativ-Abfrage reagieren die den Zeiger im optimal Fall zum Ende einer Methode und damit zur Return-Anweisung führt. ansonsten muss immer die komplette Pipeline in der CPU gefluscht werden .... wie dem auch sei ich hab Dir mal Die Main Methode geschrieben. Da haste jetzt einen Color-Cykle, also keine Auswahl!!!, drin, musst nicht mehr Enter drücken zum bestätigen, zudem kannste das Programm mit "q" oder "Q" direkt beenden. Ist nicht genau das was Du vorher hattest aber das Umschreieben geht schnell und so kannste mal sehen wie man "dynamisch" mit Enums(Sprachkonstrukt) und der Klasse Enum umgeht. Die Lösung mit der (Endlos)Schleife ist natürlich das Mittel der Wahl. Ähnlich wie bei Windows.Forms Anwendungen, bei denen durch "Application.Run(Control)", ein Infinity-Loop gestartet wird. /// <summary> /// Speichert die letzte Eingabe. /// </summary> public static String LAST_INPUT = ""; /// <summary> /// Stellt den numerischen Wert der aktuellen Hintergrundfarbe der Konsole dar. /// </summary> public static int COLOR_BACKGROUND = 0; /// <summary> /// Stellt den numerischen Wert der aktuellen Schriftfarbe der Konsole dar. /// </summary> public static int COLOR_FONT = 0; // Haupteinstiegspunkt static void Main(string[] args) { // Programmende wird durch die Eingabe von "q" oder "Q" ermöglicht. while (LAST_INPUT.ToUpper() != "Q") { Console.Clear(); Console.WriteLine("Drücken Sie 1 um die Schriftfarbe durch zu schalten."); Console.WriteLine("Drücken Sie 2 um die Hintergrundfarbe durch zu schalten."); Console.WriteLine("Drücken Sie 3 um das Programm zu starten."); Console.WriteLine(); Console.WriteLine("Zum Beenden bitte q eingeben."); Console.WriteLine("----------------------------------------------------------"); LAST_INPUT = Console.ReadKey().KeyChar.ToString(); if (LAST_INPUT == "1") { // Die Anweisugn ist praktisch nen IF-Statement ... bedingter Ausdruck heisst das // Ziel ist den Farbwert immer um 1 zu erhöhen. Wäre der Farbwert nach einer Erhöhung // größer als die Anzahl an Farben wird er auf "0" gesetzt und beginnt wieder von vorn // Syntax: "Bedingung" ? "Ausdruck 1" : "Ausdruck 2" // Ausdruck 1 und 2 müssen den Selben Rückgabe Typ haben. Dieser Entspricht auch dem // gesammt Rückgabetyp des bedingten Ausdrucks .... in dem Fall also int. COLOR_FONT += COLOR_FONT + 1 >= Enum.GetValues(typeof(ConsoleColor)).Length ? 0 : 1; Console.ForegroundColor = (ConsoleColor)Enum.ToObject(typeof(ConsoleColor), COLOR_FONT); } else if (LAST_INPUT == "2") { COLOR_BACKGROUND += COLOR_BACKGROUND + 1 >= Enum.GetValues(typeof(ConsoleColor)).Length ? 0 : 1; Console.BackgroundColor = (ConsoleColor)Enum.ToObject(typeof(ConsoleColor), COLOR_BACKGROUND); } else if (LAST_INPUT == "3") { // Programm starten } } } Zitieren
Spiedi Geschrieben 26. Juni 2010 Autor Geschrieben 26. Juni 2010 Oh...Danke. Aber das bringt mir auch nicht viel, wenn ich die Befehle nicht kenne. Wie geht denn das mit Return? Hab bis jetzt: static void Main(string[] args) { Farbe: Console.WriteLine("Drücke 1 für die Hintergrundfarbe."); Console.WriteLine("Drücke 2 für die Schriftfarbe."); Console.WriteLine("Um das Programm zu starten, drücke 3."); int Auswahl = Convert.ToInt32(Console.ReadLine()); if (Auswahl == 1) { Console.WriteLine("Für Grün, drücke 1 und Enter."); Console.WriteLine("Für Dunkelgrün, drücke 2 und Enter."); Console.WriteLine("Für Gelb, drücke 3 und Enter."); Console.WriteLine("Für Dunkelgelb, drücke 4 und Enter."); Console.WriteLine("Für Blau, drücke 5 und Enter."); int Background = Convert.ToInt32(Console.ReadLine()); if (Background == 1) { Console.BackgroundColor = ConsoleColor.Green; Console.Clear(); goto Farbe; } if (Background == 2) { Console.BackgroundColor = ConsoleColor.DarkGreen; Console.Clear(); goto Farbe; } if (Background == 3) { Console.BackgroundColor = ConsoleColor.Yellow; Console.Clear(); goto Farbe; } if (Background == 4) { Console.BackgroundColor = ConsoleColor.DarkYellow; Console.Clear(); goto Farbe; } if (Background == 5) { Console.BackgroundColor = ConsoleColor.Blue; Console.Clear(); goto Farbe; } } if (Auswahl == 2) { Console.WriteLine("Für Grün, drücke 1 und Enter."); Console.WriteLine("Für Dunkelgrün, drücke 2 und Enter."); Console.WriteLine("Für Gelb, drücke 3 und Enter."); Console.WriteLine("Für Dunkelgelb, drücke 4 und Enter."); Console.WriteLine("Für Blau, drücke 5 und Enter."); int Font = Convert.ToInt32(Console.ReadLine()); if (Font == 1) { Console.ForegroundColor = ConsoleColor.Green; Console.Clear(); goto Farbe; } if (Font == 2) { Console.ForegroundColor = ConsoleColor.DarkGreen; Console.Clear(); goto Farbe; } if (Font == 3) { Console.ForegroundColor = ConsoleColor.Yellow; Console.Clear(); goto Farbe; } if (Font == 4) { Console.ForegroundColor = ConsoleColor.DarkYellow; Console.Clear(); goto Farbe; } if (Font == 5) { Console.ForegroundColor = ConsoleColor.Blue; Console.Clear(); goto Farbe; } } Console.ReadLine(); } } } Zitieren
Mcolli Geschrieben 26. Juni 2010 Geschrieben 26. Juni 2010 (bearbeitet) Ja das mit dem Return und der ganze erste Absatz war auch nur geplänkel .... Zum durchlesen und vergessen.... hat nix mit Deinem Programm zu tun. Du musst nur den Code den Du gepostet hast komplett mit meinem ersetzten... Zur Erklärung (Es folgt nur ein BEISPIEL das ist kein relevanter Code): Bei jeglichem Programmstart wird immer genau einmal die Main-Methode aufgerufne ... also Die Methode die Du gepostet hast, die ich mit neuem Inhalt versehen habe(siehe meine Post von gerade). Das ist bei allen Programmen die man mit C# entwickelt so. Wenn Jetzt die Main-Methode so aussehen würde: static void Main(string[] args) { [INDENT] String auswahl = Console.ReadLine(); if (auswahlt == "bla") { .....} else if (auswahl == "blu") { ....... } // weiterer Blödsin soll nur Beispiel sein int a = 21; [/INDENT] [B][COLOR="Red"]}[/COLOR][/B] - Dann Liest der einmal eine Eingabe ein ("String auswahl = Console.ReadLine();"). - Vergleicht Die Eingabe ("if .... else if...") - macht andern Blödsin danach evtl noch ("int a = 21") - und kommt dann an der fetten roten Klammer an und dann wars das auch -> das Programm ist beendet. Solang der nie zu der Klammer kommt läuft das Porgramm noch. Jetzt musste den "Programmfluss" also nachdem "int a = 21"(ist nur ein Beispiel) wieder nachoben zu ("String auswahl = Console.ReadLine();") buchsieren. Das würde mit ner Sprunganweisung gehen (goto XY). Das ist aber DENKBAR SCHLECHT!!!111ELF11 Das geht nur noch weil das bei (geschätzten) 100²²² Programmiersprachen vor C# gegangen ist. Sowas sollman niemals NIEMALS NIEMALS machen. Deshalb wählt man den Weg ne Endlosschleife einzubaen, dessen "Start" unmittelbar vor der Stelle ist an die das Programm, nach einmaligen Abarbeiten von dem was gewollt ist (Farbe ändern in dem Fall), zurückkehren soll und dessen "Ende" unmittelbar nach der letzten wichtigen Naweisung ist. --> Start vor "String auswahl = Console.ReadLine();" --> Ende nach "int a = 21" also : static void Main(string[] args) { [INDENT] while (true) { [INDENT] String auswahl = Console.ReadLine(); if (auswahlt == "bla") { .....} else if (auswahl == "blu") { ....... } // weiterer Blödsin soll nur Beispiel sein int a = 21; } [/INDENT] [/INDENT] [COLOR="Red"]}[/COLOR] bzw. static void Main(string[] args) { [INDENT] Do { [INDENT] String auswahl = Console.ReadLine(); if (auswahlt == "bla") { .....} else if (auswahl == "blu") { ....... } // weiterer Blödsin soll nur Beispiel sein int a = 21; [/INDENT] } while (true) [/INDENT] [COLOR="Red"]}[/COLOR] Und schon läuft das Programm bis du es aus dem ******* Taskmanager gewaltsam entfernst. Bei meiner Post oben habe ich statt "while("true"), while(LAST_INPUT.ToUpper() != "Q") gewählt, da man so durch simples Drücken der Taste "q", wenn man aufgefordet ist eine Aktion zu wählen, die While Schleiche und somit auch das Programm verkassen kann. Das wird dadruch gewährleistet, dass der Input des User in der Variablen "LAST_INPUT" abgelegt wird. Wenn weder 1 noch 2 noch 3 gedrückt wurden passiert bis Zum "Ende" der While-Schleife nix und der kehrt zum "Start" dieser Schleife zurück dort würd überprüft ob die Bedingung noch zutrifft (also ob die Variable LAST_INPUT nicht mit einem "Q" belegt ist). Wenn die Bedingung zutrifft (in LAST_INPUT stekt KEIN "q") dann wird die Schleife weiter durchlaufen. Wenn man das wie in dem Beispiel oben gemacht hätte könnte die Bedingung niemal falsch werden ( denn da steht ja "while(true)") und er läuft und läuft und läuft. Bearbeitet 26. Juni 2010 von Mcolli Zitieren
Mcolli Geschrieben 26. Juni 2010 Geschrieben 26. Juni 2010 (WICHTIG) Habe einen kleinen Fehler im Code oben den Du rauskopieren sollst ... der bewirkt dass die Farbe wenn Die Einmal weis geworden ist weiss bleibt: Du musst statt: COLOR_FONT += COLOR_FONT + 1 >= Enum.GetValues(typeof(ConsoleColor)).Length ? 0 : 1; das schreiben: COLOR_FONT = COLOR_FONT + 1 >= Enum.GetValues(typeof(ConsoleColor)).Length ? 0 : COLOR_FONT + 1; Analog gilt das gleiche für die Hintergrund farbe (5 Zeilen tiefer) Zitieren
lbm1305 Geschrieben 26. Juni 2010 Geschrieben 26. Juni 2010 (bearbeitet) (WICHTIG) Habe einen kleinen Fehler im Code oben den Du rauskopieren sollst ... der bewirkt dass die Farbe wenn Die Einmal weis geworden ist weiss bleibt: Du musst statt: COLOR_FONT += COLOR_FONT + 1 >= Enum.GetValues(typeof(ConsoleColor)).Length ? 0 : 1; das schreiben: COLOR_FONT = COLOR_FONT + 1 >= Enum.GetValues(typeof(ConsoleColor)).Length ? 0 : COLOR_FONT + 1; Analog gilt das gleiche für die Hintergrund farbe (5 Zeilen tiefer) Möglicherweise wird dieser Code den Threadersteller noch mehr überfordern. Als Tipp: Bevor man sich an irgendwelche Aufgaben macht, sollte man erst einmal die simpelsten Strukturen und Datentypen des .NET kennen. Meiner Meinung nach sollte man einem Anfänger nicht gleich die Lösung präsentieren. Man lernt einfach nichts dabei :-O Bearbeitet 26. Juni 2010 von lbm1305 Zitieren
Spiedi Geschrieben 27. Juni 2010 Autor Geschrieben 27. Juni 2010 Möglicherweise wird dieser Code den Threadersteller noch mehr überfordern. Als Tipp: Bevor man sich an irgendwelche Aufgaben macht, sollte man erst einmal die simpelsten Strukturen und Datentypen des .NET kennen. Meiner Meinung nach sollte man einem Anfänger nicht gleich die Lösung präsentieren. Man lernt einfach nichts dabei :-O Da hast du Recht. 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.