Zum Inhalt springen

[C#] Console und Farbe


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben (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 von Spiedi
Geschrieben
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.

Geschrieben

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

        }



    }

}

Geschrieben

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();

        }

    }

}

Geschrieben (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 von Mcolli
Geschrieben

(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)

Geschrieben (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 von lbm1305
Geschrieben
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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...