Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Wörter in RichTextBox färben

Empfohlene Antworten

Veröffentlicht

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

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

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.