Replace und Contain geht nicht

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Replace und Contain geht nicht

    Hallo

    Ich habe versucht während man in meiner RichTextBox schreibt das zum Beispiel neu zu Neu geändert wird. Folgender Code funktioniert aber nicht:

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. With RichTextBox1.Text
    3. If RichTextBox1.Text.Contains("neu") Then
    4. .Replace("neu", "Neu")
    5. ElseIf .Contains("nEu") Then
    6. RichTextBox1.Text.Replace("nEu", "Neu")
    7. ElseIf .Contains("nEU") Then
    8. RichTextBox1.Text.Replace("nEU", "Neu")
    9. ElseIf .Contains("NEu") Then
    10. RichTextBox1.Text.Replace("NEu", "Neu")
    11. ElseIf .Contains("NEU") Then
    12. RichTextBox1.Text.Replace("NEU", "Neu")
    13. End If
    14. End With
    15. Me.Text = "test"
    16. End Sub
    Whos Faster ALPHA: Bald....
    Hi
    Das dürfte ganz schnell zu Mist führen. Der Text wird zwar überschrieben, aber mit ihm auch die Formatierung.

    VB.NET-Quellcode

    1. Public Shared Sub Replace(ByVal richTextBox As RichTextBox, ByVal word As String, ByVal replacement As String, ByVal ignoreCase As Boolean)
    2. Dim selectionStart As Integer = richTextBox.SelectionStart
    3. Dim index As Integer
    4. Dim cnt As Integer
    5. If ignoreCase Then
    6. Do
    7. index = richTextBox.Text.IndexOf(word, index, StringComparison.InvariantCultureIgnoreCase)
    8. If index <> -1 Then
    9. If index < selectionStart Then
    10. cnt += 1
    11. End If
    12. richTextBox.SelectionStart = index
    13. richTextBox.SelectionLength = word.Length
    14. richTextBox.SelectedText = replacement
    15. End If
    16. Loop Until index = -1
    17. Else
    18. Do
    19. index = richTextBox.Text.IndexOf(word, index)
    20. If index <> -1 Then
    21. If index + word.Length < selectionStart Then
    22. cnt += 1
    23. End If
    24. richTextBox.SelectionStart = index
    25. richTextBox.SelectionLength = word.Length
    26. richTextBox.SelectedText = replacement
    27. End If
    28. Loop Until index = -1
    29. End If
    30. richTextBox.SelectionStart = selectionStart + cnt * (replacement.Length - word.Length)
    31. End Sub


    So könnte das z.B. aussehen, um es RichTextBox-gerecht zu gestalten.

    Der Aufruf erfolgt dann so:

    VB.NET-Quellcode

    1. Replace(RichTextBox1, "meinText", "Text", True)

    ignoreCase gibt an, dass die Groß-und Kleinschreibung ignoriert werden soll.
    Für Syntax-Highlighting empfehle ich allerdings eine Variante, die das letzte Wort, bzw. den eingefügten Text durchsucht und eventuell Ersetzungen vornimmt.

    Gruß
    ~blaze~
    Da kann man einfach ne Boolean-Variable dafür deklarieren, die das verhindert.

    VB.NET-Quellcode

    1. Private bChanging As Boolean

    VB.NET-Quellcode

    1. Private Sub RichTextBox1_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles RichTextBox1.TextChanged
    2. If Not bChanging Then
    3. bChanging = True
    4. Replace(RichTextBox1, "neu", "Neu", True)
    5. bChanging = False
    6. End If
    7. End Sub


    Edit: *Hust* Was ich mir dabei gedacht habe, weiß ich grade selber nicht.

    VB.NET-Quellcode

    1. Private Sub RichTextBox1_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles RichTextBox1.TextChanged
    2. RemoveHandler RichTextBox1.TextChanged, AddressOf RichTextBox1.TextChanged
    3. Replace(RichTextBox1, "neu", "Neu", True)
    4. AddHandler RichTextBox1.TextChanged, AddressOf RichTextBox1.TextChanged
    5. End Sub


    Gruß
    ~blaze~

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()

    Wenn der User beispielsweise colortbl eintippen sollte wird das ebenfalls ersetzt. Damit wird die Funktionsfähigkeit der RTB beschränkt. Um dem vorzubeugen, habe ich einfach die obige Methode verwendet, wobei ich zugeben muss, dass diese nicht wirklich schön ist. Es ist natürlich möglich, jeden Fall indem der Text nach einem \, ein \\\ (usf.) steht, auszuschließen, aber das ist relativ umständlich. Außerdem kann es ja sein, dass eine Formatierung im Text enthalten ist, wie z.B. n\cf1 eu\cf0

    Gruß
    ~blaze~