2009-10-14 7 views
1

Même si je sais que l'objectif ci-dessus est plutôt difficile à atteindre, je sais que cela peut être fait.Syntaxe efficace, sans scintillement, plus haute pour vb.net qui fonctionne aussi bien que celle de l'IDE

Que celui que je fait le fait:

Il compare chaque mot à un mot de la liste, si son match, il sélectionnera physiquement le texte et changer la couleur, et enfin il retournera le carat la position où il était quand il a mis en évidence.

Problèmes avec ceci:

  • . Clignotantes Ça scintille toujours. J'ai réussi à réduire le scintillement en faisant dormir le thread pendant 50 millisecondes, mais je ne pouvais pas m'en débarrasser complètement (cela ne ralentissait pas non plus la frappe). Maintenant, une autre chose que j'ai essayée était d'utiliser un second RichTextBox pour que la surbrillance se produise, mais cela ne faisait aucune différence évidente.

  • Défilement. Il fera défiler le RichTextBox si la quantité de texte est assez grande pour provoquer l'affichage des barres de défilement.

  • Suppression de texte. Si vous supprimez une partie d'un mot qui a été surligné, il conservera le formatage des couleurs même si le mot est maintenant modifié. Il sélectionne aussi physiquement le mot entier, ce qui me déconcerte sans cesse.

  • Fermeture de la fenêtre. Étant donné que le sous-programme de mise en évidence est appelé chaque fois que l'événement TextChanged de RichTextBox est appelé, il est apparemment déclenché lorsque la fenêtre se ferme? Cependant, étant donné que la fenêtre se ferme, cela ralentit tout le processus. Par conséquent, avec un fichier plus volumineux, il peut s'écouler entre 5 et 10 secondes avant que chaque mot clé ne soit mis en surbrillance.

Comment puis-je résoudre chacun de ces problèmes? Je ne veux pas utiliser le composant de quelqu'un d'autre, je veux spécifiquement utiliser le mien.

Merci pour l'aide, j'ai passé plusieurs heures à ce sujet et jusqu'à présent, je suis satisfait des résultats.

Quelques idées que j'ai eu:

  • modifier physiquement le RTF au lieu d'utiliser un construit en méthode pour changer la couleur du texte, ce serait de se débarrasser de toutes mes questions. En supposant qu'un mot-clé était "The" (par exemple), quel serait le rtf pour le rendre bleu?

  • Ne pas utiliser la coloration syntaxique (dernier recours ici)

Mon objectif final: Un surligneur de syntaxe pour une RichTextBox qui fonctionne aussi bien que celui de Visual Studio.

EDIT: Y a-t-il un autre composant qui serait mieux pour cela qu'un RichTextBox?

Répondre

1

I Je ne sais pas si vous êtes dans Windows.Forms ou WPF ici, mais si c'est Windows.Forms, j'ai écrit un billet de blog à propos de ce problème il y a quelques années, et il peut s'appliquer pour vous. Je l'ai fait pour un programme de discussion et cela a bien fonctionné pour moi. Blog post is here.

+0

Winforms, merci! Ill consulter votre publication. – Cyclone

1

Je viens de voir this page qui traite de l'utilisation de RichTextBox pour la coloration syntaxique mais en C#. La chose, cependant, est que le second post parle du scintillement que vous avez, je ne suis pas sûr si leur solution vous aiderait. Et il semble qu'ils re-vérifient les points saillants chaque fois que le texte change, ce qui devrait résoudre votre problème où le mot reste en surbrillance même s'il a été modifié.

Il y a aussi un article très complet sur CodeProject concernant Real Time Syntax Highlighting with Visual Basic qui vaut vraiment la peine d'être lu.

En ce qui concerne les composants, this question couvre cela. Désolé, si je vous ai mal compris.

+0

Saw, mais je ne pourrais pas obtenir le correctif pour les moments forts de travail. – Cyclone

+0

Comme dans, ils n'ont eu aucun effet? Ou ils pourraient générer des erreurs et ne pas compiler? –

+0

Pas d'effet visible :( – Cyclone

0

Vous voudrez peut-être jeter un oeil sur le code source de Sharp Develop, leur éditeur est entièrement fonctionnel et met en évidence sans scintillement.

Aussi, si vous pouvez vous procurer un exemplaire de leur livre intitulé « Dissection une application C# - A l'intérieur sharpdevelop », qui a quelques chapitres consacrés à l'éditeur - structures de données, mettant en lumière, ui

+0

Trop de code à parcourir pour trouver ce dont j'ai besoin, mais merci quand même! – Cyclone

0

Scintilla, c'est gratuit et open source. Il supporte beaucoup de langues et est facile à utiliser. C'est un module de surlignage de syntaxe en temps réel pour Visual Studio et qui nécessite peu ou pas de code pour fonctionner, il dispose également de 600 outils pour faire un pré-IDE, c'est un bon ajout et complètement modifiable.

0

Si richtextbox n'a pas de focus, il ne scintille pas. Je l'ai résolu en enlevant temporaire mise au point et la mise à nouveau si elle se concentrait avant

Dim lWasIFocused As Boolean = Me.Focused 
' Removes flicker when i am not focused 
Parent.Focus() 

' enter your code here 

If lWasIFocused Then Me.Focus(
Questions connexes