[Richtextbox] Zeile/Wörter farbig setzen, funktioniert nicht richtig...

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von TiTo.

    [Richtextbox] Zeile/Wörter farbig setzen, funktioniert nicht richtig...

    Hallo leute,

    ich habe ein Problem.
    Und zwar möchte ich bei meinem Chat, ein paar Wörter oder Server-Meldungen farbig setzen.
    Jede Server Meldung beginnt mit [SERVER]...
    Und ich habe das so probiert:

    VB.NET-Quellcode

    1. If s.StartsWith("[SERVER]") Then
    2. RichTextBox1.AppendText(s)
    3. RichTextBox1.SelectionStart = 0
    4. RichTextBox1.SelectionLength = 50
    5. RichTextBox1.SelectionColor = Color.Gray
    6. Else
    7. RichTextBox1.ForeColor = Color.Black
    8. RichTextBox1.AppendText(s)
    9. End If

    Das Problem ist da aber, dass wenn diie Meldung eben kürzer wie die 50 sind, dass dann einfach der komplette Chat Grau ist...

    Desweiteren würde ich gerne jeden User farbig unterlegen. Ich hoffe ihr könnt mir da etwas helfen.

    VB.NET-Quellcode

    1. Imports System.RegularExpressions
    2. Public Class Form1
    3. Dim ende As Integer
    4. Dim line As Integer
    5. Dim x As Integer
    6. Private Sub Markieren()
    7. x = x + 1
    8. If x - 1 = RichTextBox1.Lines.Length Then
    9. Exit Sub
    10. End If
    11. If RichTextBox1.Lines(x).Contains("SERVER") Then
    12. ende = RichTextBox1.GetFirstCharIndexFromLine(x) - 1
    13. Else
    14. GoTo 1
    15. End If
    16. RichTextBox1.SelectionColor = Color.Green
    17. RichTextBox1.SelectionStart = RichTextBox1.Text.IndexOf("SERVER")
    18. RichTextBox1.SelectionLength = ende
    19. End Sub
    20. End Class


    [VB 2008] Problem - RichtTextBox Contains färben [VB8]

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

    -> [VB 2008] RegEx Tutorial - Blutige Anfänger und Fortgeschrittene
    Einfach mit Matches arbeiten und dann immer die Zeilen mit einer passenden Farbe markieren, z.B.

    VB.NET-Quellcode

    1. "\[SERVER\].*"


    //EDIT: User unterlegen geht auch ganz einfach, einfach zuallererst für jeden User eine Farbe zuweisen und dann immer durch alle Namen durchloopen und dann immer mit Regex prüfen, ob die Zeile zu ihm gehört, so irgendwie:

    VB.NET-Quellcode

    1. Dim strName As String = "a i9w3"
    2. Dim matches As MatchCollection = Regex.Matches(RichTextBox1.Text, Regex.Escape(strName))
    So müsste es zumindest sein (machs grad ausm Kopf), probiers aus ;).

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

    TiTo schrieb:

    VB.NET-Quellcode

    1. RichTextBox1.SelectionLength = 50
    Machst Du

    VB.NET-Quellcode

    1. RichTextBox1.SelectionLength = s.Length
    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!
    Du meinst So was !?



    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim sucheNach As String = "[SERVER]"
    4. Dim StartIndex As Integer = 0
    5. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. RichTextBox1.Text = "[SERVER]" & vbCrLf & "Das ist was du suchst weil du es brauchst" & vbCrLf & vbCrLf & "[SERVER]" & vbCrLf & "War das hilfreich ?"
    7. End Sub
    8. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    9. While RichTextBox1.Text.IndexOf(sucheNach, StartIndex) >= 0
    10. RichTextBox1.SelectionStart = RichTextBox1.Text.IndexOf(sucheNach, StartIndex)
    11. RichTextBox1.SelectionLength = sucheNach.Length
    12. RichTextBox1.SelectionColor = Color.Red
    13. StartIndex = RichTextBox1.Text.IndexOf(sucheNach, StartIndex) + sucheNach.Length
    14. End While
    15. End Sub
    16. End Class


    Seit RodFromGermany mich auf (( While / End While )) verwiesen hat bin ich hin und weg davon :thumbsup:

    LG Andre............... ;)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „TVX“ ()

    oh, vlt. wirst du auch die Do-Schleife lieben:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim StartIndex = -sucheNach.Length
    3. Do
    4. StartIndex = RichTextBox1.Text.IndexOf(sucheNach, StartIndex + sucheNach.Length)
    5. If StartIndex < 0 Then Exit Do
    6. RichTextBox1.Select(StartIndex, sucheNach.Length)
    7. RichTextBox1.SelectionColor = Color.Red
    8. Loop
    9. End Sub
    hier ist der Vorteil, dass pro Durchlauf String.IndexOf nur einmal aufgerufen wird, weil das Durchsuchen des Strings ist prinzipiell ein teurer Aufruf (hier nicht wirklich relevant, aber es gibt kein Grund, auf eine Verbesserung zu verzichten, die um keinerlei Nachteil erkauft ist).
    Ihr seid die besten, erstmal vielen vielen Dank!
    Blos das Problem liegt daran, dass ich die komplette Server Nachricht färben will.
    Nicht nur SERVER. Obwohl das auch nicht funktioniert.

    Hier ein Ausschnitt, aus meinem Code:

    VB.NET-Quellcode

    1. Private Sub AddItem(ByVal s As String)
    2. Dim userlist As String()
    3. If s.StartsWith("/u ") Then
    4. userlist = s.Remove(0, 3).Split(",")
    5. ListBox2.Items.Clear()
    6. ListBox2.Items.AddRange(userlist)
    7. Else
    8. If RichTextBox1.Text = "" Then ' Existiert ein Beitrag? Nein?
    9. If s.StartsWith("[SERVER]") Then
    10. RichTextBox1.SelectionStart = RichTextBox1.Text.IndexOf(sucheNach, StartIndex)
    11. RichTextBox1.SelectionLength = sucheNach.Length
    12. RichTextBox1.SelectionColor = Color.Red
    13. StartIndex = RichTextBox1.Text.IndexOf(sucheNach, StartIndex) + sucheNach.Length
    14. RichTextBox1.AppendText(s)
    15. Else
    16. RichTextBox1.AppendText(s)
    17. End If
    18. Else ' Ja Eintrag vorhanden, bitte Neue Zeile vor Eintrag!
    19. If s.StartsWith("[SERVER]") Then
    20. RichTextBox1.SelectionStart = RichTextBox1.Text.IndexOf(sucheNach, StartIndex)
    21. RichTextBox1.SelectionLength = sucheNach.Length
    22. RichTextBox1.SelectionColor = Color.Red
    23. StartIndex = RichTextBox1.Text.IndexOf(sucheNach, StartIndex) + sucheNach.Length
    24. RichTextBox1.AppendText(vbNewLine & s)
    25. Else
    26. RichTextBox1.AppendText(vbNewLine & s)
    27. End If
    28. End If
    @TiTo
    Hier. Das musst du halt nur an dein Ding anpassen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim StartIndex As Integer = 0
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Dim a As String = TextBox1.Text
    5. If a.StartsWith("[SERVER]") Then
    6. Dim i As Integer = a.Length
    7. RichTextBox1.AppendText(a & Environment.NewLine)
    8. RichTextBox1.SelectionStart = RichTextBox1.Text.IndexOf("[SERVER]", StartIndex)
    9. RichTextBox1.SelectionLength = i
    10. RichTextBox1.SelectionColor = Color.Red
    11. StartIndex = RichTextBox1.Text.IndexOf("[SERVER]", StartIndex) + a.Length
    12. Else
    13. RichTextBox1.AppendText(TextBox1.Text & Environment.NewLine)
    14. End If
    15. End Sub
    16. End Class
    Bilder
    • Beweis.png

      5,29 kB, 497×381, 113 mal angesehen
    Sobald es in einem Button verpackt ist, funktioniert das.
    Aber wenn ich die Funktion AddItem aufrufe nicht..

    Vielleicht hilft das:

    VB.NET-Quellcode

    1. Private Sub AddItem(ByVal s As String)
    2. Dim userlist As String()
    3. If s.StartsWith("/u ") Then
    4. userlist = s.Remove(0, 3).Split(",")
    5. ListBox2.Items.Clear()
    6. ListBox2.Items.AddRange(userlist)
    7. Else
    8. If RichTextBox1.Text = "" Then ' Existiert ein Beitrag? Nein?
    9. If s.StartsWith("[SERVER]") Then
    10. Dim i As Integer = s.Length
    11. RichTextBox1.AppendText(s)
    12. RichTextBox1.SelectionStart = RichTextBox1.Text.IndexOf("[SERVER]", StartIndex)
    13. RichTextBox1.SelectionLength = i
    14. RichTextBox1.SelectionColor = Color.Red
    15. StartIndex = RichTextBox1.Text.IndexOf("[SERVER]", StartIndex) + s.Length
    16. Else
    17. RichTextBox1.AppendText(s)
    18. End If
    19. Else ' Ja Eintrag vorhanden, bitte Neue Zeile vor Eintrag!
    20. If s.StartsWith("[SERVER]") Then
    21. Dim i As Integer = s.Length
    22. RichTextBox1.AppendText(vbNewLine & s)
    23. RichTextBox1.SelectionStart = RichTextBox1.Text.IndexOf("[SERVER]", StartIndex)
    24. RichTextBox1.SelectionLength = i
    25. RichTextBox1.SelectionColor = Color.Red
    26. StartIndex = RichTextBox1.Text.IndexOf("[SERVER]", StartIndex) + s.Length
    27. Else
    28. RichTextBox1.AppendText(vbNewLine & s)
    29. End If
    30. End If
    31. Me.RichTextBox1.SelectionStart = Me.RichTextBox1.Text.Length - 1
    32. Me.RichTextBox1.ScrollToCaret()
    33. If Not s.Contains(My.Settings.username_tmp) Then
    34. Message_Notifiy.Visible = True
    35. Message_Notifiy.ShowBalloonTip(1, "New Message!", s, ToolTipIcon.Info)
    36. End If
    37. End If
    38. End Sub


    Ich weißt leider echt nicht mehr weiter :(
    Trotzdem seit ihr die besten :) :thumbsup:

    TiTo schrieb:

    Sobald es in einem Button verpackt ist, funktioniert das.
    Aber wenn ich die Funktion AddItem aufrufe nicht..
    Was ist hier der Unterschied?
    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!
    Wie rufst Du denn AddItem() auf?
    Wo nimmst Du sden String in der Button-Click-Prozedur her?
    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!