none
Problem beim Färben von Text in RichTexBox RRS feed

  • Frage

  • Hallo zusammen,

    ich fülle RichTextBox.Text mit Text.
    Dann versuche ich, in jeder Linie, die das Zeichen ' irgendwo in der Mitte der Zeile enthalten, von diesem Zeichen an bis zum Ende der Zeile rot zu färben.
    Hier mal der Code:

    With RichTextBox
    	.WordWrap = False
    	.SelectionStart = 0 : .SelectionLength = 0
    	For j = 0 To .Lines.Count - 1
    		.Select(.GetFirstCharIndexFromLine(j), .Lines(j).Length)
    		L = .SelectedText
    		i = L.IndexOf("'") - 1
    		If i > 0 Then
    			k = L.Length - 1
    			Debug.Print(j & "/" & i & "/" & k & L)
    			.SelectionStart = i
    			.SelectionLength = k - i
    			.SelectionColor = Color.Red
    		End If
    	Next
    End With					

    Das funktioniert jedoch nicht und ich kann nicht erkennen, was am Code falsch ist...?

    Grüße-


    Dietrich



    • Bearbeitet dherrmann Dienstag, 14. April 2020 11:08
    Dienstag, 14. April 2020 11:05

Antworten

  • Hallo,

    nach erneuter Korrektur sieht der Code jetzt bei mir folgendermaßen aus:

    For j = 0 To .Lines.Count - 1
    	.Select(.GetFirstCharIndexFromLine(j), .Lines(j).Length)
    	l = .SelectedText
    	If l <> "" Then
    		i = l.IndexOf( "'")
    		If i >= 0 Then
    			k = l.Length
    			.SelectionStart = .GetFirstCharIndexFromLine(j) + i
    			.SelectionLength = k - i
    			.SelectionColor = theColor
    		End If
    	End If
    Next
    

    und funktioniert prima.

    Danke an alle "Mitarbeiter"!!

    Grüße-


    Dietrich

    • Als Antwort markiert dherrmann Donnerstag, 16. April 2020 06:50
    Donnerstag, 16. April 2020 06:50

Alle Antworten

  • Mittlerweile habe ich es "fast" gelöst. Ich habe den Code verändert in folgenden Zeilen:

                                    If i > 0 Then
                                        k = L.Length + 2
                                        .Select(.GetFirstCharIndexFromLine(j) + i, k - i)
                                        .SelectionColor = theColor
                                    End If

    Jetzt wird die Zeile ab Position des Zeichens ' bis zum Ende rot gefärbt.
    Eigenartiger Weise muss ich noch die Konstante 2 zur Länge von L addieren damit bis zum Ende der Zeile markiert wird.
    Und manchmal wird dann doch noch das erste Zeichen der nächsten Zeile markiert, und da weiß ich wirklich nicht, warum das so ist. Jetzt sieht es für mich so aus, dass die Längenermittlung der Zeile nicht immer richtig ist.

    Grüße-


    Dietrich

    Dienstag, 14. April 2020 19:26
  • Hallo Dietrich,

    Das Problem in Deinem ursprünglichen Code ist, dass die Länge der schon durchlaufenen Zeilen in der Variablen i nicht enthalten ist. In i wird der Index des gefundenen Hochstrichs in der jeweiligen Zeile gespeichert, gezählt vom Anfang der Zeile. SelectionStart erfordert dagegen den Index, gezählt vom Anfang des gesamten Textes in der RichtextBox. Die Längen der schon durchlaufenen Zeilen können zu diesem Zweck in einer Variablen (im Beispiel durchlaufen) gespeichert werden. Sieh Dir diesen Beispielcode an:

            Dim durchlaufen As Integer = 0
            With RichTextBox1
                .WordWrap = False
                .SelectionStart = 0 : .SelectionLength = 0
                For j = 0 To .Lines.Count - 1
                    .Select(.GetFirstCharIndexFromLine(j), .Lines(j).Length)
                    L = .SelectedText
                    i = L.IndexOf("'")
                    If i >= 0 Then          ' "=" für den Fall, dass die Zeile mit dem gesuchten Zeichen beginnt
                        k = L.Length
                        .SelectionStart = durchlaufen + i
                        .SelectionLength = k - i
                        .SelectionColor = Color.Red
                    End If
                    durchlaufen += L.Length + 1     '+1 wegen des Zeilenumbruchs
                Next
            End With

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.


    Mittwoch, 15. April 2020 05:16
    Administrator
  • Hallo Dimitar,danke für deinen Tipp.

    Allerdings hatte ich diesen Fakt schon selbst erkannt und in meinem Post kurz vor deinem berücksichtigt und im ursprünglichen Code geändert.

    Trotzdem besteht noch der Widerspruch bzgl. der Konstanten 2, die manchmal 1 sein müsste, wo aber nicht klar ist wann.

    Grüße-


    Dietrich

    Mittwoch, 15. April 2020 06:33
  • Hallo Dietrich,

    In Deinem Code schreibst Du:

    		i = L.IndexOf("'") - 1

    Dadurch wird jedoch der vor dem Hochstrich stehende Buchstabe, also im Screenshot an der ersten, dritten und vierten Zeile r, m und t, ebenfalls rot gefärbt. Deshalb habe ich den vollständigen Code veröffentlicht, damit auch das Ergebnis veranschaulicht wird.

    Trotzdem besteht noch der Widerspruch bzgl. der Konstanten 2, die manchmal 1 sein müsste, wo aber nicht klar ist wann.

    Wenn Du auf jenes -1 verzichtest, kannst Du 1 für den Zeilenumbruch addieren (steht auch als Kommentar im Code).

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 15. April 2020 07:03
    Administrator
  • Hallo Dietrich,

    Du kannst auch ohne die zusätzliche Variable auskommen, aber wenn diese zwei Zeilen wie in der ursprünglichen Fassung aus Deinem ersten Beitrag bleiben, dann wird die Zeile nicht zu Ende gefärbt, wie Du bemerkt hast:

                    i = L.IndexOf("'") - 1
                        k = L.Length - 1

    Wenn die Subtraktion von Eins nur in der ersten Zeile beibehalten und in der zweiten weggelassen wird, dann wird zu Ende gefärbt, aber das vor dem Hochstrich stehende Zeichen wird auch mit einbezogen. Es wird also mehr gefärbt als nötig. Wenn nur die zweite Subtraktion beibehalten wird, wird nicht zu Ende gefärbt und nur der Beginn ist richtig. Als Lösung bietet sich an, beide Subtraktionen wegzulassen, dann sind auch keine weiteren Anpassungen nötig. Das Addieren von Eins aus dem letzten Beitrag bezog sich nur auf das Verfahren mit einer zusätzlichen Variablen und ist hier nicht nötig.

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 15. April 2020 16:56
    Administrator
  • Hallo,

    nach erneuter Korrektur sieht der Code jetzt bei mir folgendermaßen aus:

    For j = 0 To .Lines.Count - 1
    	.Select(.GetFirstCharIndexFromLine(j), .Lines(j).Length)
    	l = .SelectedText
    	If l <> "" Then
    		i = l.IndexOf( "'")
    		If i >= 0 Then
    			k = l.Length
    			.SelectionStart = .GetFirstCharIndexFromLine(j) + i
    			.SelectionLength = k - i
    			.SelectionColor = theColor
    		End If
    	End If
    Next
    

    und funktioniert prima.

    Danke an alle "Mitarbeiter"!!

    Grüße-


    Dietrich

    • Als Antwort markiert dherrmann Donnerstag, 16. April 2020 06:50
    Donnerstag, 16. April 2020 06:50