emeriks
Goto Top

VB.NET 2010, Richtextbox während Eingabe formatieren

Ich will mir im VB.Net 2010 eine Richtextbox so einrichten, dass schon während der Eingabe bestimmte Wörter hervorgehoben werden, z.B. die Schriftfarbe. Ich bekomme das auch hin, über "TextChanged" und "SelectionColor". Der Faulheit halber lasse ich aber jedesmal den gesamten Inhalt prüfen und formatieren. Die erwartete Textmenge ist so groß nicht sodass das flott geht, auch wenn der Text mal ein paar Zeilen scrollen muss. Aber genau da hakt es. Jedesmal flimmert die Box, weil er jedesmal den Text nach unten durchscrollt und dann wieder an die Eingabestelle zurück springt.

Ich suche jetzt nach einem Weg, ihn davon abzuhalten, beim Durchlaufen des Texts jedesmal die Boax zu scrollen.

Ein einfaches Formular mit einer Richtextbox namens "rtb".

  Private Sub rtb_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rtb.TextChanged
    Try
      'Merken der aktuellen Cursor-Position  
      Dim CursorPosition As Long = rtb.SelectionStart
      'Die hervorzuhebende Phrase  
      Dim Phrase = "Hallo"  
      'Die aktuelle Suchposition  
      Dim p As Int32 = 0 - Phrase.Length
      Do
        'Das nächste Vorkommen der Phrase suchen  
        p = rtb.Text.IndexOf(Phrase, p + Phrase.Length)
        If p >= 0 Then
          rtb.SelectionStart = p
          rtb.SelectionLength = Phrase.Length
          rtb.SelectionColor = Color.Red
          'Application.DoEvents()  
        End If
      Loop While p >= 0
      rtb.SelectionStart = CursorPosition
      rtb.SelectionLength = 0

    Catch ex As Exception
      'ignoriert  
    End Try
  End Sub

Das geht doch sicher viel eleganter, oder?

Content-Key: 183319

Url: https://administrator.de/contentid/183319

Printed on: April 19, 2024 at 20:04 o'clock

Member: mrtux
mrtux Apr 10, 2012 at 14:18:02 (UTC)
Goto Top
Hi !

Nur eine blöde Idee aus dem Stand heraus und besonders elegant ist die leider auch nicht aber probier doch mal wie es aussieht, wenn Du den gesamten Text in eine zweite Box schiebst (die nur im Speicher existiert bzw. unsichtbar ist), ihn dort formatierst und dann wieder in die erste Box zurückschreibst. Natürlich musst Du während die Formatiervorgang läuft, die sichtbare Box vor Änderungen schützen und den Schutz danach wieder aufheben, am besten mit dem Ende des Try Blocks.

mrtux
Member: emeriks
emeriks Apr 10, 2012 at 14:33:18 (UTC)
Goto Top
Ja, nee is klar ....

Nicht elegant aber das Ergebnis zählt! geht super! Danke!

Ich erstelle zur Laufzeit eine Hilfsbox, kopiere den RTF-Inhalt rüber, formatiere und kopiere zurück.

    Dim rtb2 As RichTextBox = New RichTextBox
    rtb2.Rtf = rtb.Rtf

    .......

    rtb.rtf = rtb2.rtf
    rtb.SelectionStart = CursorPosition
    rtb.SelectionLength = 0

Jetzt muss ich das nur noch ein bißchen intelligenter aufbauen, damit der mir auch die Formate wieder raus nimmt, wenn man nachträglich ändert ...