conny< Geschrieben 11. August 2010 Teilen Geschrieben 11. August 2010 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Ze29 Geschrieben 11. August 2010 Teilen Geschrieben 11. August 2010 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... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ToolsDevler Geschrieben 13. August 2010 Teilen Geschrieben 13. August 2010 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
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.