Text zwischen Zeichen anders formatieren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Text zwischen Zeichen anders formatieren

    Heyo!
    Ich habe mal eine kleine Frage....
    Wie schaffe ich das, dass ein Text, welcher zwischen zwei Zeichen geschrieben wird, anders formatiert wird.
    Z.B.:

    Eingabe: Hallo, wie heißt *du*?
    Ausgabe: Hallo, wie heißt *du*?

    Das ganze soll in einer RichtextBox ablaufen und im TextChanged Event passieren.

    Folgendes habe ich bereits gefunden, jedoch, wenn ich den Text eingebe, wird dieser markiert, fett dargestellt, und der Cursor springt vor das *.
    Sobald ich weiter schreiben will, und auch hinter dem Wort, springt der Cursor immer nach vorne.

    Der Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged
    2. mark("*", "+", FontStyle.Bold)
    3. mark("_", "-", FontStyle.Underline)
    4. mark("#", "'", FontStyle.Italic)
    5. End Sub
    6. Sub mark(ByVal strvon As String, ByVal strto As String, ByVal style As FontStyle)
    7. If RichTextBox1.Text.Contains(strvon) And RichTextBox1.Text.Contains(strto) Then
    8. RichTextBox1.SelectionStart = RichTextBox1.Find(strvon)
    9. RichTextBox1.SelectionLength = RichTextBox1.Find(strto) - RichTextBox1.Find(strvon) + 1
    10. RichTextBox1.SelectionFont = New Font(RichTextBox1.SelectionFont, style)
    11. RichTextBox1.SelectionLength = 0 'Das hab ich probiert, damit der Text wieder deselektiert wird. Jedoch dann springt er wieder vor das *
    12. End If
    13. End Sub​
    Jo, Richtextbox unterstützt sowas nur sehr schlecht. Also da muss man sich vorher halt die Cursor-Position merken, und nachm formatieren den Cursor wieder da hinsetzen.

    So zum Hin-Hampeln geht das, aber wenns ein gutes Control werden soll, empfehle ich dir die FastColoredTextbox, die man auf CodeProject iwo finden kann.
    Ist sehr mächtig das teil, und auch sehr performant. Aber ist auch recht advanced zu bedienen.

    wsk1000 schrieb:

    VB.NET-Quellcode

    1. RichTextBox1.SelectionLength = 0 'Das hab ich probiert, damit der Text wieder deselektiert wird. Jedoch dann springt er wieder vor das *
    Du musst SelectionStart richtig setzen:

    VB.NET-Quellcode

    1. RichTextBox1.SelectionStart = RichTextBox1.Find(strvon) + 1 ' oder so
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also ich habe jetzt einmal das raus bekommen:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged
    2. mark("*", FontStyle.Bold)
    3. 'mark("_", "_", FontStyle.Underline)
    4. 'mark("~", "~", FontStyle.Italic)
    5. End Sub
    6. Sub mark(ByVal str As String, ByVal style As FontStyle)
    7. If RichTextBox1.Text.Contains(str) Then
    8. RichTextBox1.SelectionStart = RichTextBox1.Find(str) + 1
    9. RichTextBox1.SelectionLength = 0 'RichTextBox1.Find(str) - RichTextBox1.Find(str) + 1
    10. RichTextBox1.SelectionFont = New Font(RichTextBox1.SelectionFont, style)
    11. RichTextBox1.SelectionStart += RichTextBox1.SelectionStart
    12. End If
    13. End Sub


    Bei der letzten Zeile, muss ich iwie die ​SelectionStart auf die jeweilige Cursor Position setzen, nur wie geht das? Mit ​RichTextbox1.Cursor.Position funktioniert es nicht. damit wird nämlich die Maus Position ausgelesen.

    wsk1000 schrieb:

    VB.NET-Quellcode

    1. RichTextBox1.SelectionStart += RichTextBox1.SelectionStart
    geht vor die Hose, weil die Index-Position verdoppelt wird.
    Zähle ab, wo Du bist und mach den richtigen Offset drauf:

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. RichTextBox1.SelectionStart = RichTextBox1.Find(strvon) + 1 ' oder so
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!