RichTextBox la coloration syntaxique
Je suis en train de travailler avec ce code. C'est pour la coloration syntaxique dans un RichTextBox
. Je recherche précisément à la fonction ProcessLine()
et OnTextChanged()
, que j'ai modifiée en tant que telle:
protected override void OnTextChanged(EventArgs e)
{
//Calculate stuff here.
m_nContentLength = this.TextLength;
int nCurrentSelectionStart = SelectionStart;
int nCurrentSelectionLength = SelectionLength;
m_bPaint = false;
//Find the start of the current line.
m_nLineStart = nCurrentSelectionStart;
while ((m_nLineStart > 0) && (Text[m_nLineStart - 1] != '\n'))
m_nLineStart--;
//Find the end of the current line.
m_nLineEnd = nCurrentSelectionStart;
while ((m_nLineEnd < Text.Length) && (Text[m_nLineEnd] != '\n'))
m_nLineEnd++;
//Calculate the length of the line.
m_nLineLength = m_nLineEnd - m_nLineStart;
//Get the current line.
m_strLine = Text.Substring(m_nLineStart, m_nLineLength);
//Process this line.
ProcessLine();
m_bPaint = true;
}
//Process a line.
private void ProcessLine()
{
//Save the position and make the whole line black
int nPosition = SelectionStart;
SelectionStart = m_nLineStart;
SelectionLength = m_nLineLength;
SelectionColor = Color.Black;
/*//Process the keywords
ProcessRegex(m_strKeywords, Settings.KeywordColor);
//Process numbers
if(Settings.EnableIntegers)
ProcessRegex("\\b(?:[0-9]*\\.)?[0-9]+\\b", Settings.IntegerColor);
//Process strings
if(Settings.EnableStrings)
ProcessRegex("\"[^\"\\\\\\r\\n]*(?:\\\\.[^\"\\\\\\r\\n]*)*\"", Settings.StringColor);
//Process comments
if(Settings.EnableComments && !string.IsNullOrEmpty(Settings.Comment))
ProcessRegex(Settings.Comment + ".*$", Settings.CommentColor);*/
SelectionStart = nPosition;
SelectionLength = 0;
SelectionColor = Color.Red;
m_nCurSelection = nPosition;
}
-
Ma première question est, quand je suis entrée dans la
ProcessLine()
dansOnTextChanged()
, aurai-je toujours avoir un caractère de saut de ligne à la fin dem_strLine
? Sera la plus petite valeur oum_strLine
être "\n" et le plus grand "tout#ofchars+\n"? -
Et tellement j'ai ce droit,
SelectionStart
est ma position du curseur siSelectionLength
est égale à zéro, et siSelectionLength
est supérieure à zéro mon signe est àSelectStart+SelectionLength
? -
Je suis en train de modifier ce code pour la couleur tout un tas de différents syntaxe des expressions, et j'ai l'intention d'aller à travers elle un caractère à la fois, pour chaque ligne. Comment cela pourrait-il juste lors du collage ou du chargement d'un fichier de 20k lignes?
- C'est un très de base de l'approche et de ne pas travailler avec les plus grands fragments de code. Il sera mort lente et avec beaucoup de scintillement et de bizarreries. Vous êtes beaucoup mieux de commencer avec une meilleure base de dehors-de-le-boîte de contrôle au format RTF!
- Pourrais-je être mieux d'essayer de Regex chaque ligne, comme ils ont essayé de faire ici?
- Aussi, Uniquement lors du chargement d'un fichier, je dois aller à travers chaque ligne. D'autre part lors de l'édition d'un fichier que j'ai n'aurez qu'à cocher une seule ligne à la fois, mais toujours le repeindre, mais uniquement dans la zone de texte que l'utilisateur peut voir dans le textarea. Sera-ce vraiment être aussi lente que tout le monde pense?
- Si vous voulez le faire sur votre propre Costin Boldisor est un billet de blog ici blogs.msdn.microsoft.com/cobold/2011/01/31/...
Vous devez vous connecter pour publier un commentaire.
Tout ce que je peux vous suggérer moment est l'utilisation de quelque chose de stable, de plus en plus puissants et de moins en moins enclins à faire des erreurs comme l'Étincelle pour .NET et le Code de Couleur. Ces contrôles sont libres et open source. Essayer:
ScintillaNET
ColorCode - la coloration syntaxique/Colorisation pour .NET
RichTextBox est extrêmement inefficace pour travailler avec un grand texte. Même si vous obtenez quelques bons mettant en évidence, les problèmes vont commencer à apparaître très bientôt.
Cela va à l'échelle de vraiment mal. Vous devez faire ce que DelegateX suggère si votre objectif est simplement une application qui fonctionne; si vous êtes dans cette pour en savoir plus, commencer par trouver des façons de réduire la quantité de travail qui est fait. À cette fin, voici quelques indications générales:
Soulignant uniquement du texte qui se trouve à l'intérieur de la fenêtre sera une amélioration massive qui n'ont pas des visuels des effets secondaires- c'est probablement aussi possible de diviser le texte en blocs (par fonction, méthode, classe, etc) et seulement de mettre en évidence des blocs visibles, même de l'occlusion des parties, afin d'éviter des problèmes où un décalage de la position de départ affecte le mettre en surbrillance. Si vous ne le faites pas, vous serez confronté à des situations où le premier rendu de la ligne est en cours d' si ou des parenthèses, d'un bloc, et vous avez un déséquilibre de l'arbre syntaxique comme un résultat.
Vous ne serez pas en mesure de gérer 20k lignes avec un contrôle RichTextBox, mais quelques milliers devrait être rapide.
Face au même problème et impossible de trouver "5 minutes prêt à aller" solution, j'ai développé mon propre RichTextBox extension pour mettre en surbrillance le format XML.
J'ai développé, c'est vraiment rapide à cause de la pression du temps et n'ai pas le temps d'révisé - alors n'hésitez pas à affiner.
Il suffit de copier & coller le code d'extension à utiliser avec votre RichTextBox ou copie de l'ensemble de la
le code de l'application, y compris synchrone & asynchrone, utilisation de la
Méthode D'Extension
Version fixe - avec la manipulation de JSON comme l'intérieur du texte et des meilleurs éléments de l'extraction