Fehler bei Syntax highlighting in einer RichTextBox

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

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

    Fehler bei Syntax highlighting in einer RichTextBox

    Guten Abend,
    Ich versuche ein Syntax Hilighting zu programmieren.
    Hab den Code auch gefunden... Aber der will nicht so es sein soll ||

    *Vor ab, rtb_code ist eine RitchTextBox

    VB.NET-Quellcode

    1. ​Private Sub rtb_code_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles rtb_code.KeyDown
    2. If e.KeyCode = Keys.Space Then
    3. Dim selectionlenght As Integer = rtb_code.SelectionLength
    4. Dim selectionstart As Integer = rtb_code.SelectionStart
    5. Dim letter As String = String.Empty
    6. Do Until letter = " " Or rtb_code.SelectionStart = 0
    7. rtb_code.SelectionStart -= 1
    8. rtb_code.SelectionLength += 1
    9. letter = rtb_code.Text.Substring(rtb_code.SelectionStart, 1)
    10. Loop
    11. If rtb_code.SelectedText = "@echo" Or rtb_code.SelectedText = " @echo" Then
    12. rtb_code.SelectionColor = Color.Blue
    13. Else
    14. End If
    15. rtb_code.SelectionStart = selectionstart
    16. rtb_code.SelectionLength = 0
    17. 'rtb_code.SelectionColor = Color.Black
    18. End If
    19. End Sub


    Das Problem ist dabei, das nur der Text farbig sein soll der auch da drin steht, also in dem Fall nur @echo und der Rest normal sein soll, also schwarz


    Danke im voraus ! :rolleyes:
    @DerTuner Was genau soll bei welchem Text und welcher Selektion passieren?
    Setz nen Haltepunkt rein und debugge den Code durch: Debuggen, Fehler finden und beseitigen
    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!
    Zeile#6 und #9 widersprechen sich schonmal. Du suchst nach einem doppelten Leerzeichen (Z#6) in einem "einzeichigen" Abschnitt (Z#9, Substring mit Länge 1). Mach in Z#6 ein " " draus und der Effekt kommt schon mal. Ich vermute mal, dass Du es selber basteln willst und nicht z.B. auf die FastColoredTextBox zurückgreifen willst, richtig?
    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.

    VaporiZed schrieb:

    Mach in Z#6 ein " " draus und der Effekt kommt schon mal

    Du meinnst?

    VB.NET-Quellcode

    1. Do Until letter = " " Or rtb_code.SelectionStart = " "


    VaporiZed schrieb:

    Ich vermute mal, dass Du es selber basteln willst und nicht z.B. auf die FastColoredTextBox zurückgreifen willst, richtig?

    Jap
    Habe es damit versucht und es funktioniert auch bei mir:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub MarkSyntax(ByVal Strng As String, ByVal rtb As RichTextBox, ByVal Colr As Color)
    2. On Error Resume Next
    3. If Not rtb.SelectionLength <> 0 Then
    4. Dim i As Integer = rtb.SelectionStart
    5. Dim found As Boolean = True
    6. Dim index As Integer = 0
    7. Do
    8. index = rtb.Text.IndexOf(Strng, index)
    9. If (index >= 0) Then
    10. rtb.SelectionStart = index
    11. rtb.SelectionLength = Strng.Length
    12. rtb.SelectionColor = Colr
    13. index += 4
    14. Else
    15. found = False
    16. End If
    17. Loop While found = True
    18. rtb.SelectionStart = i
    19. rtb.SelectionLength = 0
    20. rtb.SelectionColor = Color.Black
    21. End If
    22. End Sub
    23. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    24. MarkSyntax("@echo", RichTextBox1, Color.Green)
    25. End Sub


    EDIT: Danke @RodFromGermany ein Teil des Codes habe ich von einem alten Post von dir.
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down
    Kann sich jemand ( @DerTuner ) erbarmen und dem Thead nen vernünftigen Titel geben? :)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Der Code Funktioniert doch an sich korrekt. Nur eben nicht so wie du es erwartet hast bzw. so wie du es gerne hättest.

    Die benennung des Titels ist wichtig, damit andere die evtl. auch ein Problem beim syntax highlighting in einer RichTextBox haben, hier hilfe finden. Würdest du beim Googlen einen Link öffnen der „warum funktioniert der Code nicht richtig“ heißt? Also überleg dir ne treffenden Titel und benenne diesen Thread so.


    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    DerTuner schrieb:

    Du meinnst
    was anderes:

    VB.NET-Quellcode

    1. Do Until letter = " " OrElse rtb_code.SelectionStart = 0
    2. rtb_code.SelectionStart -= 1
    3. rtb_code.SelectionLength += 1
    4. letter = rtb_code.Text.Substring(rtb_code.SelectionStart, 1)
    5. Loop

    Zeile#1 bei mir: letter = " " <- eine Suche nach einem Leerzeichen. Du such(te)st bei Dir aber nach 2 Leerzeichen. Und das geht mit Deinem Restcode nicht.

    DerTuner schrieb:

    rtb_code.SelectionStart = " "
    das wäre aber ganz schon Option Strict Off. Du arbeitest doch aber bestimmt mit Option Strict On, richtig?
    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.

    DerTuner schrieb:

    Oki :)
    dann syntax highlighting in einer RichTextBox ?
    Du sollst dein (eigentliches) Problem kurz und treffend formulieren und als Titel verwenden. Wenn das also dein Problem ist wäre das ja nen ganz guter Titel...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    DerTuner schrieb:

    Ich versuche ein Syntax Hilighting zu programmieren.
    Kannste vergessen.
    Syntax-Highlighting ist eine extremst anspruchsvolle Aufgabe. Da gehts zB darum, Kommentar-Zeichen zu erkennen, und Kommentarzeichen innerhalb von Kommentaren, aber auch innerhalb von Strings, und auch andersrum: Strings innerhalb von Kommentaren richtig erkennen, weil die sind da ja keine Strings, sondern halt auskommentiert.
    Und viele Sprachen kennen auch mehrzeilige Kommentare, sodass wenn an einer bestimmten Stelle ein Komment-Zeichen gesetzt wird, das ganze Dokument neu zu highlighten ist.

    Und nebenbei ist Richtextbox zu langsam dafür - es sei denn du hackst sie mittels PinInvoke - allein das ist schon sehr anspruchsvoll. Andernfalls kannste nicht flüssig schreiben, weil die RTB mittm highlighten nicht hinterherkommt.

    Vorschlag: Hol dir die "FastColoredTextbox" von CodeProject und arbeite dich da ein. Deren Highlighting kann beliebige Sprachen, hat nur wenige Bugs, und die Performance ist super.
    Ist immer noch schwierig genug, mit dem Teil klarzukommen.
    @DerTuner Diese Frage hast Du noch nicht beantwortet:

    RodFromGermany schrieb:

    Was genau soll bei welchem Text und welcher Selektion passieren?
    Bitte etwas detaillierter als mur "Syntax Hilighting".
    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!
    @ErfinderDesRades: Deinen Vorschlag mit der FastColoredTextBox hatte ich zwar schon in Post#3 gegeben, aber der TE wollte trotzdem nicht. Vielleicht fehlten aber einfach nur die passenden Argumente.
    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.

    DerTuner schrieb:

    Account bei CodeProject
    ist absolut vertrauenswürdig, problem- und werbefrei.
    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!