VB.NET la coloration syntaxique dans une Zone de Texte enrichi
Je suis le codage d'un simple éditeur de code très simple langage de script que nous utilisons au travail. Ma coloration syntaxique de code fonctionne très bien si je le fais sur l'ensemble de la RichTextBox
(rtbMain
) mais quand j'essaie de l'obtenir pour travailler sur cette ligne, donc je peux l'exécution de la fonction avec rtbMain
changements, c'est bizarre. Je n'arrive pas à comprendre pourquoi. Je suis même aller sur ce la bonne manière?
rtbMain
est la principale zone de texte.
frmColors.lbRegExps
est une liste de mots à mettre en évidence (plus tard il aura un peu plus puissant des expressions régulières.)
frmColor.lbHexColors
est une autre zone de liste avec les correspondants hex couleurs pour les mots.
Private Sub HighLight(ByVal All As Boolean)
Dim RegExp As System.Text.RegularExpressions.MatchCollection
Dim RegExpMatch As System.Text.RegularExpressions.Match
Dim FirstCharIndex As Integer = rtbMain.GetFirstCharIndexOfCurrentLine
Dim CurrentLine As Integer = rtbMain.GetLineFromCharIndex(FirstCharIndex)
Dim CurrentLineText As String = rtbMain.Lines(CurrentLine)
Dim CharsToCurrentLine As Integer = rtbMain.SelectionStart
Dim PassNumber As Integer = 0
LockWindowUpdate(Me.Handle.ToInt32) 'Let's lock the window so it doesn't scroll all crazy.
If All = True Then 'Highlight everything.
For Each pass In frmColors.lbRegExps.Items
RegExp = System.Text.RegularExpressions.Regex.Matches(LCase(rtbMain.Text), LCase(pass))
For Each RegExpMatch In RegExp
rtbMain.Select(RegExpMatch.Index, RegExpMatch.Length)
rtbMain.SelectionColor = ColorTranslator.FromHtml(frmColors.lbHexColors.Items(PassNumber))
Next
PassNumber += 1
Next
Else 'Highlight just that row.
For Each pass In FrmColors.lbRegExps.Items
RegExp = System.Text.RegularExpressions.Regex.Matches(LCase(CurrentLineText), LCase(pass))
For Each RegExpMatch In RegExp
rtbMain.Select(RegExpMatch.Index + (CharsToCurrentLine - RegExpMatch.Length), RegExpMatch.Length)
rtbMain.SelectionColor = Color.Blue
Next
Next
End If
rtbMain.Select(CharsToCurrentLine, 0) 'Reset colors and positon and then unlock drawing.
rtbMain.SelectionColor = Color.Black
LockWindowUpdate(0)
End Sub
- Que voulez-vous dire par "c'est bizarre"?
- Avez-vous déjà utilisé Notepad++? Il est vraiment facile de créer la coloration syntaxique pour une langue définie par l'utilisateur et donc, vous ne avez même pas besoin d'écrire cela. Bien sûr, vous pourriez avoir d'autres raisons, mais si vous êtes juste de création autonome de l'éditeur c'est quelque chose à considérer.
- Code pouvez obtenir bizarre si elle est précédée par "on Error Resume Next ".... =P. Mais sérieusement exactement ce qu'il fait quand il essaie juste d'analyser une seule ligne?
- en obtenant bizarre, je veux dire, il met en évidence apparemment aléatoire des trucs. J'ai enlevé que Sur bit d'erreur lol 😛 et maintenant nous utiliser notepad++ et textpad, les deux sont très bien, mais je cherche à ajouter plus de pouvoir qu'ils ont.
Vous devez vous connecter pour publier un commentaire.
Ok j'ai tout compris. J'ai été d'appeler la même sur rtbMain.TextChange penser que cela ne pourrait se déclenche si le texte a réellement changé. Nay Nay, il sera également déclencher si la mise en page est modifiée. donc, chaque fois qu'il a changé quelque chose alors qu'il était en train de faire de son premier passage et en mettant en évidence tout, il déclenche ensuite pour mettre en surbrillance la ligne. Ce serait le faire jusqu'à ce qu'il n'y avait rien à changer.
J'ai mis une variable booléenne pour la météo ou non, il est actuellement mise en évidence et a ajouté une condition à l'intérieur de la TextChange sous
P. S.
Je n'ai pas l'autonomie de l'apprenant de l'insigne de sorte que tout en haut des cotes serait la bienvenue 😛
Ce n'est pas vraiment répondre à votre question, mais si vous écrivez votre propre éditeur, vous feriez mieux d'utiliser certains open source existante de travail qui a été fait pendant .NET. Je le recommande:
Roger Alsing de SyntaxBox