Je suis en train de coder un simple éditeur de code pour un langage de script très simple que nous utilisons au travail. Mon code de coloration syntaxique fonctionne très bien si je le fais sur l'ensemble RichTextBox
(rtbMain
) mais quand j'essaye de le faire fonctionner sur cette ligne, donc je peux exécuter la fonction avec les changements rtbMain
, ça devient bizarre. Je n'arrive pas à comprendre pourquoi. Est-ce que j'y vais même de la bonne façon?Mise en surbrillance de la syntaxe VB.NET dans une zone de texte enrichi
rtbMain
est la zone de texte principale. frmColors.lbRegExps
est une liste de mots à mettre en évidence (plus tard, il aura des expressions régulières légèrement plus puissantes.) frmColor.lbHexColors
est une autre zone de liste avec les couleurs hexadécimales correspondantes 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 "ça devient bizarre"? – EndangeredMassa
Avez-vous déjà utilisé Notepad ++? Il est vraiment facile de créer une coloration syntaxique pour une langue définie par l'utilisateur et ainsi vous n'auriez même pas besoin d'écrire ceci. Bien sûr, vous pourriez avoir d'autres raisons, mais si vous créez simplement un éditeur autonome, c'est quelque chose à considérer. –
N'importe quel code peut devenir bizarre s'il est précédé de "Sur erreur Resume Suivant " .... = P. Mais sérieusement, que fait-il exactement quand il essaie d'analyser une seule ligne? –