Hallo liebe Community,
Heute belästige ich euch mit einem/mehreren Problemen mit der FastColoredTextBox. Für diese habe ich ein eigenes kleines Verwaltungssystem geschrieben, welches eigentlich auch schon ziemlich gut funktioniert. Hier die Klassen, welche ich erstellt habe:
Highlighter
FoldingMarker
Und so hatte ich vor, es umzusetzen:
TIBASICCodeEditor
Nun treten bei diesem Code ein paar Probleme auf:
Hoffe, ihr könnt mir bei meinen Problemen helfen, vielen Dank für alle Antworten im Voraus :).
PS: Bitte entschuldigt den schlechten Codingstil bei den Klassen, die waren nur sozusagen ein Prototyp ;).
Heute belästige ich euch mit einem/mehreren Problemen mit der FastColoredTextBox. Für diese habe ich ein eigenes kleines Verwaltungssystem geschrieben, welches eigentlich auch schon ziemlich gut funktioniert. Hier die Klassen, welche ich erstellt habe:
VB.NET-Quellcode
- Imports System.Text.RegularExpressions
- Imports FastColoredTextBoxNS
- Public Class Highlighter
- ''' <summary>
- ''' Erstellt einen neuen Highlighter
- ''' </summary>
- Public Sub New()
- Me.TextStyle = New TextStyle(New SolidBrush(Me.Color), New SolidBrush(Me.BackgroundColor), Me.FontStyle)
- End Sub
- ''' <summary>
- ''' Erstellt einen neuen Highlighter
- ''' </summary>
- ''' <param name="regexpattern">Der RegexPattern nach dem gesucht werden soll</param>
- ''' <param name="regexoptions">Die zu verwendenden RegexOptions</param>
- ''' <param name="color">Die neue Farbe des gematchten Texts</param>
- ''' <param name="backgroundcolor">Die neue Hintergrundfarbe des gematchten Texts</param>
- ''' <param name="fontstyle">Die Schrifteigenschaften des gematchten Texts</param>
- Public Sub New(regexpattern As String, regexoptions As RegexOptions, color As Color, backgroundcolor As Color, fontstyle As FontStyle)
- Me.RegexPattern = regexpattern
- Me.RegexOptions = regexoptions
- Me.Color = color
- Me.BackgroundColor = backgroundcolor
- Me.FontStyle = fontstyle
- Me.TextStyle = New TextStyle(New SolidBrush(Me.Color), New SolidBrush(Me.BackgroundColor), Me.FontStyle)
- End Sub
- ''' <summary>
- ''' Erstellt einen neuen Highlighter
- ''' </summary>
- ''' <param name="name">Der Name des Highlighters</param>
- ''' <param name="regexpattern">Der RegexPattern nach dem gesucht werden soll</param>
- ''' <param name="regexoptions">Die zu verwendenden RegexOptions</param>
- ''' <param name="color">Die neue Farbe des gematchten Texts</param>
- ''' <param name="backgroundcolor">Die neue Hintergrundfarbe des gematchten Texts</param>
- ''' <param name="fontstyle">Die Schrifteigenschaften des gematchten Texts</param>
- Public Sub New(name As String, regexpattern As String, regexoptions As RegexOptions, color As Color, backgroundcolor As Color, fontstyle As FontStyle)
- Me.Name = name
- Me.RegexPattern = regexpattern
- Me.RegexOptions = regexoptions
- Me.Color = color
- Me.BackgroundColor = backgroundcolor
- Me.FontStyle = fontstyle
- Me.TextStyle = New TextStyle(New SolidBrush(Me.Color), New SolidBrush(Me.BackgroundColor), Me.FontStyle)
- End Sub
- ''' <summary>
- ''' Erstellt einen neuen Highlighter
- ''' </summary>
- ''' <param name="name">Der Name des Highlighters</param>
- ''' <param name="keywordstomatch">Die KeyWords, welche gematcht werden sollen</param>
- ''' <param name="regexoptions">Die zu verwendenden RegexOptions</param>
- ''' <param name="color">Die neue Farbe des gematchten Texts</param>
- ''' <param name="backgroundcolor">Die neue Hintergrundfarbe des gematchten Texts</param>
- ''' <param name="fontstyle">Die Schrifteigenschaften des gematchten Texts</param>
- Public Sub New(name As String, keywordstomatch As IEnumerable(Of String), regexoptions As RegexOptions, color As Color, backgroundcolor As Color, fontstyle As FontStyle)
- Me.Name = name
- Me.RegexPattern = String.Join("|", keywordstomatch)
- Me.RegexOptions = regexoptions
- Me.Color = color
- Me.BackgroundColor = backgroundcolor
- Me.FontStyle = fontstyle
- Me.TextStyle = New TextStyle(New SolidBrush(Me.Color), New SolidBrush(Me.BackgroundColor), Me.FontStyle)
- End Sub
- ''' <summary>
- ''' Erstellt einen neuen Highlighter
- ''' </summary>
- ''' <param name="keywordstomatch">Die KeyWords, welche gematcht werden sollen</param>
- ''' <param name="regexoptions">Die zu verwendenden RegexOptions</param>
- ''' <param name="color">Die neue Farbe des gematchten Texts</param>
- ''' <param name="backgroundcolor">Die neue Hintergrundfarbe des gematchten Texts</param>
- ''' <param name="fontstyle">Die Schrifteigenschaften des gematchten Texts</param>
- Public Sub New(keywordstomatch As IEnumerable(Of String), regexoptions As RegexOptions, color As Color, backgroundcolor As Color, fontstyle As FontStyle)
- Me.RegexPattern = String.Join("|", keywordstomatch)
- Me.RegexOptions = regexoptions
- Me.Color = color
- Me.BackgroundColor = backgroundcolor
- Me.FontStyle = fontstyle
- Me.TextStyle = New TextStyle(New SolidBrush(Me.Color), New SolidBrush(Me.BackgroundColor), Me.FontStyle)
- End Sub
- ''' <summary>
- ''' Der Name des Highlighters
- ''' </summary>
- Public Property Name As String = "Highlighter"
- ''' <summary>
- ''' Der RegexPattern nach dem gesucht werden soll
- ''' </summary>
- Public Property RegexPattern As String = "."
- ''' <summary>
- ''' Die zu verwendenden RegexOptions
- ''' </summary>
- Public Property RegexOptions As RegexOptions = RegexOptions.None
- ''' <summary>
- ''' Die neue Farbe des gematchten Texts
- ''' </summary>
- Public Property Color As Color = Color.Black
- ''' <summary>
- ''' Die neue Hintergrundfarbe des gematchten Texts
- ''' </summary>
- Public Property BackgroundColor As Color = Color.Transparent
- ''' <summary>
- ''' Die Schrifteigenschaften des gematchten Texts
- ''' </summary>
- Public Property FontStyle As FontStyle = Drawing.FontStyle.Regular
- ''' <summary>
- ''' Führt die ClearStyle-Methode für eine Range aus
- ''' </summary>
- Public Sub ClearStyle(range As FastColoredTextBoxNS.Range)
- range.ClearStyle(New TextStyle(New SolidBrush(Me.Color), New SolidBrush(Me.BackgroundColor), Me.FontStyle))
- End Sub
- ''' <summary>
- ''' Der TextStyle, welcher angewendet wird
- ''' </summary>
- Private Property TextStyle As TextStyle
- ''' <summary>
- ''' Führt die SetStyle-Methode für eine Range aus
- ''' </summary>
- Public Sub SetStyle(ByRef range As FastColoredTextBoxNS.Range)
- range.SetStyle(Me.TextStyle, Me.RegexPattern, Me.RegexOptions)
- End Sub
- End Class
- ''' <summary>
- ''' Eine Auflistung mehrerer Highlighters
- ''' </summary>
- ''' <remarks></remarks>
- Public Class HighlighterCollection
- Inherits List(Of Highlighter)
- ''' <summary>
- ''' Erstellt eine neue HighlighterCollection
- ''' </summary>
- Public Sub New()
- Me.Capacity = 16
- End Sub
- ''' <summary>
- ''' Erstellt eine neue HighlighterCollection
- ''' </summary>
- ''' <param name="standardhighlighter">Der Name des StandardHighlighters</param>
- ''' <remarks></remarks>
- Public Sub New(standardhighlighter As String)
- Me.Capacity = 16
- Me.StandardHighlighter = standardhighlighter
- End Sub
- ''' <summary>
- ''' Der Name des StandardHighlighters, er wird für die Methode ClearStyle verwendet
- ''' </summary>
- Public Property StandardHighlighter As String = ""
- ''' <summary>
- ''' Sucht einen Highlighter nach seinem Namen und gibt den ersten Fund zurück
- ''' </summary>
- ''' <param name="name">Der Name des zu suchenden Highlighters</param>
- Public Function GetByName(name As String) As Highlighter
- For Each Highlighter As Highlighter In Me
- If Highlighter.Name = name Then Return Highlighter
- Next
- Throw New KeyNotFoundException("Es konnte kein übereinstimmender Highlighter gefunden werden")
- End Function
- ''' <summary>
- ''' Setzt alle verfügbaren Styles für die angegebene Range
- ''' </summary>
- ''' <param name="range">Der Bereich, auf den die Styles angewendet werden sollen</param>
- Public Sub SetStyle(range As FastColoredTextBoxNS.Range)
- For Each Highlighter As Highlighter In Me
- If Highlighter.Name <> Me.StandardHighlighter Then Highlighter.SetStyle(range)
- Next
- End Sub
- ''' <summary>
- ''' Setzt den Standardstyle für die angegebene Range
- ''' </summary>
- ''' <param name="range">Der Bereich, auf den der Style angewendet werden soll</param>
- Public Sub ClearStyle(range As FastColoredTextBoxNS.Range)
- Me.GetByName(StandardHighlighter).ClearStyle(range)
- End Sub
- ''' <summary>
- ''' Kombiniert die Funktion der Methoden <see cref="ClearStyle">ClearStyle</see> und <see cref="SetStyle">SetStyle</see>
- ''' </summary>
- ''' <param name="range">Der Bereich, auf den die Styles angewendet werden sollen</param>
- Public Sub Apply(range As FastColoredTextBoxNS.Range)
- Me.GetByName(StandardHighlighter).ClearStyle(range)
- For Each Highlighter As Highlighter In Me
- If Highlighter.Name <> Me.StandardHighlighter Then Highlighter.SetStyle(range)
- Next
- End Sub
- End Class
VB.NET-Quellcode
- Imports System.Text.RegularExpressions
- Imports FastColoredTextBoxNS
- Public Class FoldingMarker
- ''' <summary>
- ''' Erstellt einen neuen FoldingMarker
- ''' </summary>
- ''' <param name="startmarker">Der Startmarker</param>
- ''' <param name="endmarker">Der Endmarker</param>
- Public Sub New(startmarker As String, endmarker As String)
- Me.StartMarker = startmarker
- Me.EndMarker = endmarker
- End Sub
- ''' <summary>
- ''' Erstellt einen neuen FoldingMarker
- ''' </summary>
- ''' <param name="name">Der Name des FoldingMarkers</param>
- ''' <param name="startmarker">Der Startmarker</param>
- ''' <param name="endmarker">Der Endmarker</param>
- Public Sub New(name As String, startmarker As String, endmarker As String)
- Me.Name = name
- Me.StartMarker = startmarker
- Me.EndMarker = endmarker
- End Sub
- ''' <summary>
- ''' Der Name des FoldingMarkers
- ''' </summary>
- Public Property Name As String = "FoldingMarker"
- ''' <summary>
- ''' Der Startmarker
- ''' </summary>
- Public Property StartMarker As String = ""
- ''' <summary>
- ''' Der Endmarker
- ''' </summary>
- Public Property EndMarker As String = ""
- ''' <summary>
- ''' Wendet den FoldingMarker auf die angegebene Range an
- ''' </summary>
- ''' <param name="range">Der Bereich, auf den der FoldingMarker angewendet werden soll</param>
- ''' <remarks></remarks>
- Public Sub Apply(range As FastColoredTextBoxNS.Range)
- range.SetFoldingMarkers(Me.StartMarker, Me.EndMarker)
- End Sub
- End Class
- ''' <summary>
- ''' Eine Auflistung mehrerer FoldingMarkers
- ''' </summary>
- ''' <remarks></remarks>
- Public Class FoldingMarkerCollection
- Inherits List(Of FoldingMarker)
- ''' <summary>
- ''' Erstellt eine neue FoldingMarkerCollection
- ''' </summary>
- Public Sub New()
- 'Me.Capacity = 16
- End Sub
- ''' <summary>
- ''' Sucht einen FoldingMarker nach seinem Namen und gibt den ersten Fund zurück
- ''' </summary>
- ''' <param name="name">Der Name des zu suchenden FoldingMarkers</param>
- Public Function GetByName(name As String) As FoldingMarker
- For Each FoldingMarker As FoldingMarker In Me
- If FoldingMarker.Name = name Then Return FoldingMarker
- Next
- Throw New KeyNotFoundException("Es konnte kein übereinstimmender FoldingMarker gefunden werden")
- End Function
- ''' <summary>
- ''' Wendet alle FoldingMarkers auf die angegebene Range an
- ''' </summary>
- ''' <param name="range">Der Bereich, auf den die Styles angewendet werden sollen</param>
- Public Sub Apply(range As FastColoredTextBoxNS.Range)
- For Each FoldingMarker As FoldingMarker In Me
- FoldingMarker.Apply(range)
- Next
- End Sub
- End Class
Und so hatte ich vor, es umzusetzen:
VB.NET-Quellcode
- Imports FastColoredTextBoxNS
- Imports System.Text.RegularExpressions
- Public Class TIBASICCodeEditor
- Inherits FastColoredTextBox
- Public Sub New()
- Me.HighlightingRangeType = FastColoredTextBoxNS.HighlightingRangeType.AllTextRange
- Me.CommentPrefix = "'"
- End Sub
- Private Highlighters As New HighlighterCollection("Standard") From { _
- New Highlighter("Kommentar", "'.*$", RegexOptions.None, Color.Green, Color.Transparent, FontStyle.Regular), _
- New Highlighter("Strings", "\"".*\""", RegexOptions.None, Color.Firebrick, Color.Transparent, FontStyle.Regular), _
- New Highlighter("Blaue KeyWords", {"Input", "For", "If", "End", "While", "Repeat", "Input", "Prompt", "Disp", "Then", "Pause", "Lbl", "Goto", "IS>", "DS<", "Menu", "Output", "getKey"}, RegexOptions.None, Color.Blue, Color.Transparent, FontStyle.Regular), _
- New Highlighter("Hellblaue KeyWords", {"Str[0-9]", "Pic[0-9]", "GDB[0-9]", "Y[0-9]", "L[1-6]"}, RegexOptions.None, Color.DodgerBlue, Color.Transparent, FontStyle.Regular), _
- New Highlighter("Zahlen", "[0-9]*", RegexOptions.None, Color.Orange, Color.Transparent, FontStyle.Regular), _
- New Highlighter("Standard", ".*", RegexOptions.Multiline Or RegexOptions.Singleline, Color.Black, Color.Transparent, FontStyle.Regular) _
- } 'Die Anwendung erfolgt von unten nach oben
- Private FoldingMarkers As New FoldingMarkerCollection From { _
- New FoldingMarker("If", "End"), _
- New FoldingMarker("For(.*)", "End"), _
- New FoldingMarker("While", "End"), _
- New FoldingMarker("Repeat", "End") _
- }
- Private Sub FastColoredTextBox_TextChanged(sender As Object, e As FastColoredTextBoxNS.TextChangedEventArgs) Handles Me.TextChanged
- Highlighters.Apply(e.ChangedRange) 'Alle Highlighter anwenden
- FoldingMarkers.Apply(e.ChangedRange) 'Alle FoldingMarker anwenden
- End Sub
- End Class
Nun treten bei diesem Code ein paar Probleme auf:
- Die Markierungen, bei denen sich die Codeabschnitte zusammenfalten lassen sollten, funktionieren nicht richtig (falsche Zuordnung)
- Beim Einfügen von Codeausschnitten funktioniert die Formatierung nicht richtig
- Kommentare werden, wenn der Apostroph (
'
) gelöscht wird, zumindest von der Formatierung her nicht entfernt
Hoffe, ihr könnt mir bei meinen Problemen helfen, vielen Dank für alle Antworten im Voraus :).
PS: Bitte entschuldigt den schlechten Codingstil bei den Klassen, die waren nur sozusagen ein Prototyp ;).
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nafets3646“ ()