Richtextbox verliert Formatierung

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von sunshine.

    Richtextbox verliert Formatierung

    Hallo,

    ich habe mit VB 2010 einen Chat gebaut, der mir leider einen Fehler produziert und den ich nach zig Stunden Recherche und Versuchen nicht lösen kann. Ich bin schon halb am verzweifeln. :( Ggf. liegt es aber auch an meiner Unkenntnis als Hobby-Programmierer.

    Mein Chat checkt alle 5 Sekunden, ob bei einer Acccess-Datei ein weiterer Eintrag erfolgt ist. Ist das der Fall, wird der neue Eintrag oder die neuen Einträge innerhalb einer Richtextbox hinzugefügt (Rtb1.AppendText...). Allerdings nach einem gewissen Format, wo jeder Teilnehmer z.B. auch eine andere Namenfarbe hat.

    If (Namen(p)) = "Muster1" Then Rtb1.SelectionColor = Color.Blue
    If (Namen(p)) = "Muster2" Then Rtb1.SelectionColor = Color.Purple
    If (Namen(p)) = "Muster3" Then Rtb1.SelectionColor = Color.Orange
    If (Namen(p)) = "Muster4" Then Rtb1.SelectionColor = Color.Green

    Rtb1.AppendText(Namen(p))

    Der Chat läuft fast immer rund. Aber läuft der Chat im Hintergrund und es kommt eine neue Message, wird die Formatierung nicht mehr berücksichtigt und läuft falsch. (Siehe Bild ab 13:18 Uhr...)

    Muss man hierzu etwas bei der Richtextbox besonders beachten? Zumindest habe ich diese auf ReadOnly=False gestellt. Aber das Problem ist damit nicht behoben.

    Bin für jegliche Ansätze mega dankbar.
    Bilder
    • Chat.JPG

      32,86 kB, 323×376, 69 mal angesehen
    probierma, vorher etwas zu selecten, bevor du die SelectionColor setzst.

    Rtb1.Select(Rtb1.TextLength-1,1)
    If (Namen(p)) = "Muster1" Then Rtb1.SelectionColor = Color.Blue
    If (Namen(p)) = "Muster2" Then Rtb1.SelectionColor = Color.Purple
    If (Namen(p)) = "Muster3" Then Rtb1.SelectionColor = Color.Orange
    If (Namen(p)) = "Muster4" Then Rtb1.SelectionColor = Color.Green

    Rtb1.AppendText(Namen(p))
    Hallo ErfinderDesRades,

    danke für Deinen Ansatz.

    Läuft mit Rtb1.Select(Rtb1.TextLength-1,1) auf folgenden Fehler:

    InvalidArgument=Value mit dem Wert -1 ist für start ungültig.
    Parametername: start

    Habe es dann anstatt "-1" gemacht und läuft. Erhalte aber wiederum denselben Fehler. Formatierung läuft für den neuen Eintrag im Hintergund (also Chat nicht das aktive Programm) wieder falsch.

    Starte ich aber das Programm neu, werden alle Nachrichten (auch die, die während des Betriebes des Chats falsch formatiert wurden) mit der korrekten Formatierung. Nur bei der Aktualisierung neuer Nachrichten im Hintergrund läuft das falsch. Für mich völlig unverständlich.
    Willkommen im Forum.

    Da braucht es wohl mehr Infos/echten Code. Denn mit folgendem Testcode ist es egal, ob das Teil im Hintergrund läuft.

    VB.NET-Quellcode

    1. Private ReadOnly RND As New Random
    2. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    3. Dim Color As Color
    4. Select Case RND.Next(3)
    5. Case 0 : Color = Color.Red
    6. Case 1 : Color = Color.Blue
    7. Case 2 : Color = Color.Green
    8. End Select
    9. RichTextBox1.SelectionColor = Color
    10. RichTextBox1.AppendText("User " & Color.ToString)
    11. RichTextBox1.SelectionColor = Color.Gray
    12. RichTextBox1.AppendText($" ({Date.Now.ToShortTimeString}){Environment.NewLine}")
    13. RichTextBox1.SelectionColor = Color.Black
    14. RichTextBox1.AppendText("Foo" & Environment.NewLine & Environment.NewLine)
    15. End Sub

    Bilder
    • ChatResult.png

      3,46 kB, 392×325, 72 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    sunshine schrieb:

    Ich hoffe, es lässt sich ein Fehler darin finden...
    In dem Code eher nicht, da wir nicht wissen, wie dieser Code einzubinden ist.
    Fehler finden sich besser durch Debuggen als durch Hinsehen.
    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!
    Das Problem ist, dass das Programm ja sauber durchläuft und somit beim Debuggen nicht auf einen Fehler läuft oder irgend etwas Auffälliges angezeigt wird. Aber die Darstellung in der Richtextbox wird eben bei einer neuen Nachricht im Hintergrund anders dargestellt als im Code vorgegeben. Das ist dem Programm wohl egal. Sowas hatte ich auch noch nie und kommt auf keine Fehlerlösung....help...

    sunshine schrieb:

    und somit beim Debuggen nicht auf einen Fehler läuft
    Das kannst Du nicht gut sehen, da beim Debuggen der GUI-Thread eben nicht durch läuft.
    Poste Dein bereinigtes Projekt zippe es ohne bin, obj und vs-Verzeichnisse und häng es an,
    erstell ersatzweise ein kleines Testprojekt, das den Effekt reproduziert.
    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!
    Kann ich gerne machen. Muss dazu aber ordentlich mein Programm "ausmisten" und auch Personelles herausnehmen. Allerdings hängt da ja eine Access-Datenbank dran. Diese kann ich ja nicht mitschicken. Reicht dann nur der gesamte Code, der diesen Fehler produziert? (sorry für die vielleicht etwas laienhafte Frage).

    Vllt kurz noch den Hinweis: Ich starte das Programm über Debug UND auch im Programm (über Build erstellt). Sind beide Chats nebeneinander auf dem Bildschirm zu sehen, läuft alles gut. Wird ein Chat in den Hintergrund gestellt und beim anderen Chat eine Notiz geschrieben, kommt diese bei anderen Chat der im Hintergrund war, wieder mit der falschen Formatierung an. Das Phänomen ist doch unglaublich oder?

    versuche es im TextChanged
    hier mit Regex

    VB.NET-Quellcode

    1. 'ref:
    2. Imports System.Text.RegularExpressions
    3. Private Sub RichTextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles RichTextBox1.TextChanged
    4. ColorWord(RichTextBox1, "Muster1", Color.Blue)
    5. ColorWord(RichTextBox1, "Muster2", Color.Purple)
    6. End Sub
    7. Private Sub ColorWord(ByVal rtb As RichTextBox, ByVal word As String, ByVal color As Color)
    8. Dim matchc As MatchCollection = Regex.Matches(rtb.Text.ToLower(), word.ToLower())
    9. For Each m As Match In matchc
    10. rtb.Select(m.Index, m.Length)
    11. rtb.SelectionColor = color
    12. rtb.Select(rtb.Text.Length, 0)
    13. rtb.SelectionColor = Drawing.Color.Black
    14. Next
    15. End Sub
    Hallo Kasi,

    danke für den Ansatz. Habe ich gerade ausprobiert. Allerdings nur mit dem Namen. Der stimmt, Datum/Uhrzeit und Nachricht sind dann aber wie oben beschrieben wieder falsch. Oder sollte ich das für Datum/Uhrzeit und Nachricht erweitern? Aber das sind ja stets anderer Textinhalte...
    also Datum und Uhrzeit besteht aus Zahlen 0-9 und punkt mit doppelpunkt

    versuche es so

    VB.NET-Quellcode

    1. Private Sub RichTextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles RichTextBox1.TextChanged
    2. ColorWord(RichTextBox1, "Muster1", Color.Blue)
    3. ColorWord(RichTextBox1, "Muster2", Color.Purple)
    4. 'für Datum mit Uhrzeit in Format = 05.09.2020 19:50:22
    5. ColorWord(RichTextBox1, "(\d{2}).(\d{2}).(\d{4}) (\d{2}):(\d{2}):(\d{2})", Color.Purple)
    6. End Sub


    natürlich die farbe wählen für Uhrzeit
    wenn mehrere Wörter die gleiche Farbe haben sollen dann mit 'Pipe' trennen
    so..

    VB.NET-Quellcode

    1. ColorWord(RichTextBox1, "Muster1|Wort2|Wort3", Color.Blue)

    Toller Ansatz - kannte ich noch nicht. Funktioniert, aber bei dem Chat im Hintergund leider weiterhin mit dem Darstellungsproblem. Es muss an der blöden RTB liegen. Gibt es da ggf. irgendwelche Einstellungen? Wieso wird die neue Nachricht im Chat immer anders dargestellt, wenn der Chat im Hintergrund läuft. Das stimmt doch etwas nicht...
    ICH WERD VERRÜCKT.....ich glaube, ich habe den Fehler nach gefühlten 100 Stunden gefunden. Ich habe aus letzter Verzweiflung einfach eine neue Richtextbox (RTB2) angelegt und dort die ganzen Chat-Daten incl. Formtierung reinlaufen lassen. Kein Fehler mehr! Das ist doch der Wahnsinn. Hat VB2010 irgendwann einmal einen Systemfehler für die RTB1 im Hintergrund produziert??? Gibt es sowas wirklich und kennt jemand so einen Fehler.....bin gerade völlig sprachlos!
    Hmm hmm - "Fehler gefunden" würde ich das nicht nennen.
    Aber ist ja schön, dasser weg ist.

    Ansonsten ist mir aufgegangen, dassich das eiglich sehr suspekt finde, wenn jemand behauptet, einen Chat geschrieben zu haben, und kann noch nichtmal son Simpel-Fehler fixen:

    sunshine schrieb:

    Läuft mit Rtb1.Select(Rtb1.TextLength-1,1) auf folgenden Fehler:

    InvalidArgument=Value mit dem Wert -1 ist für start ungültig.
    Parametername: start
    Musste der Kommentar jetzt wirklich sein?

    Ich bin in der Tat Hobbyprogrammierer und habe schon viele gute Sachen programmiert. Halt so, wie es notwendig war. Und wenn ich einen Befehl nicht brauche, lerne ich den eben auch nicht. So geht es vielen Hobbybastlern. Deinen Ansatz (Rtb1.TextLength-1,1) habe ich schon verstanden, aber eben nicht zu Ende gedacht, da ich wegen dem Fehler extrem genervt war. Der Chat übrigens ist der Renner in unserem Geschäft in Zeiten Corona...