Laden...

RichTextBox Zeilenfärbung

Erstellt von PapaNoah vor 13 Jahren Letzter Beitrag vor 13 Jahren 892 Views
P
PapaNoah Themenstarter:in
6 Beiträge seit 2010
vor 13 Jahren
RichTextBox Zeilenfärbung

Guten Abend miteinander,

Ich kämpfe (im wahrsten Sinne des Wortes) nun schon den ganzen Nachmittag an einem eigentlich kleinen Problem. Für ein Testprogramm, das mit verschiedener Hardware kommuniziert, habe ich mir einen Logger geschrieben. Dieser gibt über eine Methode Text in einer zuvor darin gesetzten Control aus. Für die Übersicht hatte ich mir das Ziel gesetzt, die Ausgaben je nach Art einzufärben (Fehler z.B. rot). Ich bat also den guten alten Mr.Google um Hilfe und fand auch gleich Antworten. Jedoch finde ich keine Antwort auf folgendes Problem:

So soll es aussehen:

> (Bla bla bla läuft!

> (Bla bla bla fail..

So sieht es aus:

> Bla bla bla läuft!

>
:::

Ich dachte zuerst, ich würde ein Zeichen zuviel selektieren (Select()) und somit auch einfärben. Doch das ist es nicht, und ich bin auf Papier das ganze durchgegangen... laut diesen Versuchen sollte es funktionieren 🙁 Aber ihr kennt das ja.. 🤔

Hier mein Code:


public void WriteLogMessage(string text, Color textColor)
        {
            GuiHandler updateLog = delegate()
            {
                if (loggingCtrl != null)
                {
                    string lineStart;
                    if (loggingCtrl.Text.Length == 0)
                    {
                        //Wenn erste Linie in Textbox
                        lineStart = "> ";
                    }
                    else
                    {
                        //Wenn nicht erste Linie in Textbox
                        lineStart = "\n> ";
                    }
                    //Text anhängen
                    loggingCtrl.AppendText(lineStart + text);
                    //Text für Färbung auswählen Start: Textlänge von Textbox - Länge von neuem Text) / Länge: Länge von neuem Text
                    loggingCtrl.Select((loggingCtrl.Text.Length) - text.Length, text.Length);
                    //Farbe setzen
                    loggingCtrl.SelectionColor = textColor;
                    //Auswahlt zurücksetzen
                    loggingCtrl.DeselectAll();
                    
                    //Runter scrollen
                    loggingCtrl.SelectionStart = loggingCtrl.Text.Length;
                    loggingCtrl.ScrollToCaret();
                }
            };

            try
            {
                loggingCtrl.Invoke(updateLog);
            }
            catch { }           
        }

Ich hoffe ihr könnt mir helfen 🙂

PapaNoah

F
155 Beiträge seit 2009
vor 13 Jahren

Hallo,

das liegt daran das die RTB neuen Text mit der Farbe schreibt die in SelectionColor enthalten ist,
in der ersten Zeile legst du sie auf Grün fest, wenn du dann in der zweiten Zeile das '>' schreibst, ist die Farbe immer noch auf Grün festgelegt.

Um dies zu umgehen kannst du einfach die SelectionColor vor dem Schreiben von '>' auf Schwarz festlegen.

fz

"We better hurry up and start coding, there are going to be a lot of bugs to fix."

1.457 Beiträge seit 2004
vor 13 Jahren

Hallo PapaNoah,

Hier im Forum wurde das ganze schon desöfteren diskutiert. [Tutorial] Einfaches Keyword-Highlighting und die Forensuche wird dir weiterhelfen.

P
PapaNoah Themenstarter:in
6 Beiträge seit 2010
vor 13 Jahren

@fz7090:
Vielen Dank für deine Antwort. Ich hatte bereits mit diesem Gedanken gespielt, einfach die Farbe zu ändern, doch ich dachte das wäre dann eher so eine Art Workaround und ich könnte es irgendwie anders lösen. Sehr interessant finde ich, dass dieser Effekt mit der Färbung von neu hinzugefügtem Text nicht auftritt, wenn man den Newline hinter dem Text platziert (Nicht "\n> Test" sondern "> Test\n"), jedoch hat man dadurch immer eine Leerzeile, was auch nicht gerade schön aussieht.

@Timur Zanagar:
Okey dann möchte ich mich entschuldigen einen weiteren Thread zu diesem Thema eröffnet zu haben. Mein Problem war, dass alle Diskussionen, die ich zu diesem Thema gefunden habe, mir irgendwie nie eine Antwort lieferten, da die darin vorkommenden Probleme nicht dieselben waren (zugegeben, hier im Forum habe ich dann nicht mehr so genau gesucht, da ich die meiste Zeit des Nachmittags mit Google versuchte, eine Lösung zu meinem Problem zu finden. Danke für den Hinweis 😃.

PapaNoah