Zum Inhalt springen

Wörter in RichTextBox färben


conny<

Empfohlene Beiträge

Boah ey.... programmieren ist echt nur ein Gehangle von Problem zu Problem...

Ich glaub ich mir doch als erste Programmierpraxis ein Tick zu schwieriges Beispiel ausgesucht...

Naja, ich beschreib mal mein Problem:

Die Methode faerben(int index, Color currentColor) soll aus einer Listbox(lstAusgabe) an der Position index einen String auslesen. Die Liste schaut ungefähr so aus:

64 die

39 der

20 ist

12 man

9 er

...

Nun muss ich logischerweise den String spliten und dann trimen. Von dem zurückgegebenen Array das letzte Element sollte das Wort beinhalten, welches ich im Text(der in txtHauptfeld(RichTextBox) steht) färben will(mit currentColor).

Wichtig dabei ist, dass das Programm den Unterschied zwischen dem Wort man und dem Worteil jemand erkennt.

Ich habe geschrieben:

public void faerben(int index, Color currentColor)

        {

            // Erst alles wieder normal machen

            txtHauptfeld.SelectAll();

            txtHauptfeld.SelectionBackColor = Color.White;


            int pos = 0;

            int suc = 0;


            if (index < words.Count)

            {

                String temp = Convert.ToString(lstAusgabe.Items[index]);

                String[] tempSplit = temp.Split(' ');


                int WordsToColor = Convert.ToInt32(tempSplit[0]);

                String WordToColor = tempSplit[tempSplit.Length - 1].Trim();

                Boolean frontIsLetter = false;


                while (suc < WordsToColor)

                {

                    int selectStart = txtHauptfeld.Text.IndexOf(WordToColor, pos);


                    if (selectStart > 0 && selectStart < txtHauptfeld.Text.Length)

                    {

                        try

                        {

                            txtHauptfeld.Select(selectStart, WordToColor.Length); // ArgumentOutOfRangeException


                            if (selectStart != 0)

                            {

                                int frontValue = Convert.ToInt32(txtHauptfeld.Text[selectStart - 1]);


                                if ((frontValue > 64 && frontValue < 92) || (frontValue > 96 && frontValue < 123) || frontValue == 246 || frontValue == 228 || frontValue == 252 || frontValue == 220 || frontValue == 214 || frontValue == 196)

                                    frontIsLetter = true;

                            }



                            int backValue = Convert.ToInt32(txtHauptfeld.Text[selectStart + txtHauptfeld.SelectedText.Length]);


                            if (!((backValue > 64 && backValue < 92) || frontIsLetter || (backValue > 96 && backValue < 123) || backValue == 246 || backValue == 228 || backValue == 252 || backValue == 220 || backValue == 214 || backValue == 196))

                            {

                                txtHauptfeld.SelectionBackColor = currentColor;


                                pos = selectStart + txtHauptfeld.SelectionLength;


                                suc++;

                            }

                            else

                                pos = selectStart + txtHauptfeld.SelectionLength;

                        }

                        catch (Exception e)

                        {

                            MessageBox.Show(e.Message);

                        }

                    }

                    else

                        pos = selectStart + txtHauptfeld.SelectionLength;

                }

            }

        }
Ich schätze ich programmiere noch deutlich zu kompliziert... Ich bekomme nun bei dieser Codezeile,
txtHauptfeld.Select(selectStart, WordToColor.Length);
eine ArgumentOutOfRangeException. Dabei habe ich keinen Schimmer wie es dazu kommt. Die Methode wird ausschließlich durch das SelectedIndexChange von der lstAusgabe aufgerufen:

        private void lstAusgabe_SelectedIndexChanged(object sender, EventArgs e)

        {

            if (lstAusgabe.SelectedIndex != 0)

                if (farbig)

                    faerben(lstAusgabe.SelectedIndex, Color.Red);

        }

wär echt schön wenn mir da noch wer helfen könnte, dann könnte ich zumindest mein erstes Projekt abschließen.

Gruß Conny

Link zu diesem Kommentar
Auf anderen Seiten teilen

Folgende Hinweise:

1) Limitiere deine Methoden eine Länge von maximal 10 Zeilen - versuche sie so um ~5 Zeilen lang zu halten.

2) Zerlege ein komplexes Problem in kleine, einfachere Probleme (brauchen dann auch kürzere Methoden)

Schreib damit das ganze nochmal neu und du wirst Fehler schneller finden, als in so einem riesen Wust von if else if if else else if else...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi conny<,

der Codeausschnitt sollte dir weiterhelfen:


        /// <summary>

        /// Hebt alle in txtHauptfeld vorkommenden Wörter die dem übergebenen Schlüsselwort übereinstimmen hervor.

        /// </summary>

        /// <param name="value">Schlüsselwort, das gesucht werden soll.</param>

        /// <param name="highlightColor">Farbe, mit der Suchergebnisse hervorgehoben werden sollen.</param>

        public void HighlightValue(String value, Color highlightColor)

        {   

            //Den Text aus der RichTextBox splitten, damit wir alle Wörter bekommen

            String[] wordsInHauptfeld = txtHauptfeld.Text.Split(' ');


            //Der Zähler enthält immer die aktuelle Position, damit wir uns kompliziertes zusammenrechnen von irgendwelchen Zahlenwerten sparen können.

            Int32 positionCounter = 0;


            //Wir iterieren durch die ganzen Wörter aus der Textbox

            foreach (String word in wordsInHauptfeld)

            {

                //Wenn das Wort dem mitgegebenem Schlüsselwort gleicht, dann...

                if (word.Equals(value))

                {

                    //...markiere die Zeichen an der aktuellen Stelle

                    txtHauptfeld.Select(positionCounter, word.Length);

                    txtHauptfeld.SelectionBackColor = highlightColor;


                    //Damit der Cursor immer schön am ende der Textbox bleibt:

                    txtHauptfeld.Select(txtHauptfeld.Text.Length - 1, 0);

                }


                //Hier zählen wir die aktuelle Position um die Länge des aktuellen Worts auf, plus das Leerzeichen (dass beim Splitten ja wegfällt!).

                positionCounter += word.Length + 1;

            }

        }

Grüße

ToolsDevler

P.S.: Nicht Copy&Paste! Versuche den Code mithilfe meiner Kommentare zu verstehen und probiere es dann (ohne abzulesen!) selbst zu schreiben. Wenn du das schaffst, hats dus verstanden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...