COLORATION SYNTAXIQUE PAR RICHETEXTEBOX ET API (TRÈS RAPIDE)

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 23 juin 2003 à 23:41
psykocrash Messages postés 240 Date d'inscription vendredi 14 juin 2002 Statut Membre Dernière intervention 17 mars 2009 - 16 déc. 2004 à 15:21
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/7591-coloration-syntaxique-par-richetextebox-et-api-tres-rapide

psykocrash Messages postés 240 Date d'inscription vendredi 14 juin 2002 Statut Membre Dernière intervention 17 mars 2009
16 déc. 2004 à 15:21
Bonjour,
Ton composant est très utile, mais j'aimerais avoir une petite précision. Moi je voudrais l'utiliser dans mes programmes pour interpréter des codes de couleur, comment je fais pour créer la liste ?
Par exemple si le texte est :
##code1##MON TEXTE##/code1##
MONTEXTE doit être colorié en rouge.
Dans le programme qui permet de créer des listes, est ce que je dois entrer :
##code1##*##/code1## pour la couleur rouge ?
(un peut comme pour le texte entre guillemets, mais avec plusieurs codes)

Sinon juste un problème avec Annuler qui met tout en vert, il suffit simplement de faire un .AllScan après pour résoudre le problème.

Bonne continuation :)
Psykocrash
maxpiton4D Messages postés 16 Date d'inscription jeudi 5 février 2004 Statut Membre Dernière intervention 31 mai 2006
10 nov. 2004 à 12:35
Salut

On pourrait pas faire en sorte que les numéros soient actualisés par un timer?
TheRedman Messages postés 24 Date d'inscription vendredi 22 août 2003 Statut Membre Dernière intervention 29 juin 2004
29 déc. 2003 à 15:46
Encore un autre petit truc: quand tu enlève le retour à la ligne automatique et que les ascenseurs apparaissent, le point d'insertion est collé à la marge de droite et donc on ne voit pas tès bien où on écrit. Tu devrais t'arranger pour qu'il soit plus ou moins au milieu de l'écran.

J'espère que j'ai été clair ...
TheRedman Messages postés 24 Date d'inscription vendredi 22 août 2003 Statut Membre Dernière intervention 29 juin 2004
27 déc. 2003 à 14:26
Pour le bug du presse papier :

- ouvre le bloc notes et tappe un truc dedant
- sélectionne le et fais COPIER
- change le fichier de mots

- fais COLLER. Il n'est plus là !

Evidemment c'est un détail
cs_NoMitsu Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 15 février 2011
23 déc. 2003 à 10:33
pour les bug tu fait bien de me les indiqués je pourrais le régler comme sa.

pour le bug du presse-papier je vois pas trop mais je vais m'y pencher plus tard.

Pour ce qui est de la coloration d'une zone c assez simple :
il faut (toujours dans la classe clsColoration et dans la fonction FindExpression) ajouter ses quelques lignes :

(il suffie de reprendre le principe de la coloration des string)

il faudra juste remplacer les variable pour pas qu'il y est de conflie

If ColorString = True Then 'Colorisation des String
Do
ComStr(0) = InStr(ComStr(0) + 1, Txt, Chr$(34))
ComStr(1) = InStr(ComStr(0) + 1, Txt, Chr$(34))

If ComStr(0) <> 0 And ComStr(1) <> 0 Then
Call ColorText(RTB, dLigne + ComStr(0) - 1, (ComStr(1) + 1) - ComStr(0), RTB.SelStart, CString, _
fFontSize, fBold, fFont, dColor, dFontSize, dBold, dFont)
ComStr(0) = ComStr(1)
Else
Exit Do
End If
Loop
End If

Puis tu modifie c'est deux lignes
Il fo remplacer Chr$(34) par seque tu veux

ComStr(0) = InStr(ComStr(0) + 1, Txt, Chr$(34))
ComStr(1) = InStr(ComStr(0) + 1, Txt, Chr$(34))

Exemple :
ComStr(0) = InStr(ComStr(0) + 1, Txt, "<!--")
ComStr(1) = InStr(ComStr(0) + 1, Txt, "-->")

voila
TheRedman Messages postés 24 Date d'inscription vendredi 22 août 2003 Statut Membre Dernière intervention 29 juin 2004
22 déc. 2003 à 16:46
Encore 1 bug
- quand on agrandi le compteur de lignes (ex 800), on ne voit plus la flèche de l'ascenseur. Je crois que tu oublie de redimensionner le RTB.

Si tu veux je te dirai à chaque fois ce qui ne va pas. En fait, je fais un prog avec ton contrôle donc je repère vite les bugs.
TheRedman Messages postés 24 Date d'inscription vendredi 22 août 2003 Statut Membre Dernière intervention 29 juin 2004
22 déc. 2003 à 11:54
Encore un truc : est-ce normal que le presse-papier se vide quand on recharge un fichier de vocabulaire ou qu'on change le contenu du RTB ?
TheRedman Messages postés 24 Date d'inscription vendredi 22 août 2003 Statut Membre Dernière intervention 29 juin 2004
22 déc. 2003 à 11:38
ET pour colorier une zone ? exemple <!-- blablabla --> mais de longueur indéterminée ?
TheRedman Messages postés 24 Date d'inscription vendredi 22 août 2003 Statut Membre Dernière intervention 29 juin 2004
22 déc. 2003 à 11:35
merci
cs_NoMitsu Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 15 février 2011
21 déc. 2003 à 22:31
Et bien dans la class clsColoration il faut ajouter dans la fonction FindExpression quelque ligne :
(il suffie de reprendre le principe des commentaire VB (voir dans la source)

If Commentaire = True Then 'Colorisation des Commentaires
ComVB = InStr(ComVB + 1, Txt, "'")

If ComVB <> 0 Then
Call ColorText(RTB, dLigne + ComVB - 1, Len(Txt) - ComVB + 1, RTB.SelStart, CComantaire, _
fFontSize, fBold, fFont, dColor, dFontSize, dBold, dFont)
End If
End If

Il suffie de modifier cette ligne ComVB InStr(ComVB + 1, Txt, "'") et de mettre a la place ComVB InStr(ComVB + 1, Txt, "//")

Et voila.

Pour ta question, il faut savoir que plus le texte est long plus il faut de tps pour le colorer et bien sur plus le fichier de voca est long et plus il faut de boucle pour analyser un mot c'est 2 facteur sont important. Mais dans la mise a jour que je viens de faire la coloration du texte au chargement et aussi rapide de la coloration du texte lors d'un copier coller.

voila sinon je suis entrain de preparer une nouvelle version qui corrige qq bug et ajoute qq fonction VIVE LES VACANCES je vais pouvoir l'ameliorer
TheRedman Messages postés 24 Date d'inscription vendredi 22 août 2003 Statut Membre Dernière intervention 29 juin 2004
21 déc. 2003 à 19:25
Encore une question :
Comment faire pour colorier la fin d'une ligne avec par exemple // à la place de '

Et qu'est-ce qui prend le plus de temps au chargement, un long fichier texte ou un long fichier de vocabulaire ?
TheRedman Messages postés 24 Date d'inscription vendredi 22 août 2003 Statut Membre Dernière intervention 29 juin 2004
22 nov. 2003 à 20:41
Merci beaucoup
cs_NoMitsu Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 15 février 2011
22 nov. 2003 à 16:09
Je suppose que tu parle d'une scroll bar horizontal. Et bien, il faut modifier le control et mettre dans le UserControl_Resize() ceci
RTB.RightMargin = Screen.Width * 2 (par exemple) et dans ce cas les retour a la ligne se feront seulement lorsque la chaîne de caractère et 2 fois plus grande que l'écran. (a toi de mettre la valeur que tu veux).

Sinon cette petite question m'a donner envie de compléter un peu mon Ocx alors je pence faire une petite mise a jour ce week-end. A surveiller donc.

A++ et bonne prog
TheRedman Messages postés 24 Date d'inscription vendredi 22 août 2003 Statut Membre Dernière intervention 29 juin 2004
22 nov. 2003 à 11:50
J'adore ton contrôle mais j'ai une question. Comment faire pour que ton contrôle ne renvoit pas à la ligne (donc qu'il mette un ascenseur). J'ai mis cette propriété dans le textbox et j'ai recompilé mais ça n'a pas marché.
cs_xlt Messages postés 15 Date d'inscription vendredi 11 juillet 2003 Statut Membre Dernière intervention 18 octobre 2004
16 sept. 2003 à 15:40
C'est cool je vais utiliser des parties de ton code pour mon editeur Vbscript!! Merciiiiiiiiiii 10/10
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
24 juin 2003 à 14:38
pour la numérotation je rejoints Renfield, tu devrais faire un Hook du controle (je pense ca pourrait aussi fonctionner pour la coloration).
va voir sur www.vbAccelerator.com il le fait dans l'un de ces exemples.
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
24 juin 2003 à 14:36
NoMitsu --> normalement le like est censé être plus rapide que le inStr mais va sur mon site, il y a un doc sur l'optimisation en VB.
http://www.vbMaf.fr.st (Téléchargement)
cs_NoMitsu Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 15 février 2011
24 juin 2003 à 14:24
Pour les numéros de ligne je suis au courant, et c'est malheureusement mon principal problème.
Comme je l'est dit plus haut c'est du au faite que dans une RTB on peu modifier la taille ou la police d'une sélection, ce n'est pas une modification globale comme dans une TextBox.
J'ai donc essayer de résoudre le problème en récupérant la police de chaque ligne qui sont visible. Mais deux autres problème on émerger : D'une par sa ralentissais considerablement de la coloration et d'autre par je suis incapable de récupérer dans une ligne la taille de la police lorsque dans cette même ligne il y en a 2 différentes (taille ou police).

Voilà comment (en gros) je mis suis pris :
1ère : je récupère par la fonction « txtInLigne » le texte de la ligne je le sélectionnais puis par la propriété de la rtb -> .SelFontSize je récupérais la taille de la police et .SelFontName pour la police. Je vous l'accorde la méthode n'est pas terrible et pas toujours fonctionnel mais c'est la seul que j'ai trouver pour palier plus ou moins au pb.

Renfield, j'ai jeté un coup d'oil sur tes sources vraiment très bien faite. J'ai essayer d'adapter le code de ReyTextBox sur une RTB mais sans succès il y a le même problème.
Si tu pouvais me dire se que signifie « hooker » ? merci

Sebmafate , je ne connaissais pas like c'est pour cette raison que je ne lais pas utiliser, peut tu me dire si elle est plus rapide que InStr.

Kirua, ce n'étais pas prévu car le but de cette ocx c'est de permettre à l'utilisateur de colorer seulement les mots qu'il désir de la façon la plus simple pour lui (d'ou l'éditeur). Mais c'est vrais pourquoi ne pas les proposer en option (comme les commentaire vb) dans les propriété.
Je vais mis mettre.

FrostByte, pas de prob je te tien au courent

Si quelqu'un a une idée pour le pb?
FrostByte Messages postés 138 Date d'inscription mercredi 4 avril 2001 Statut Membre Dernière intervention 28 janvier 2006
24 juin 2003 à 09:40
Dommage, pour l'alignement des chiffres, mais comme c'est ta premiere contribution, on t'en veut pas !!

Perso ton controle m'interesse fortement !! previens moi lorsque tu auras trouvé ton bug !!

Amicalement FrostByte
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
24 juin 2003 à 08:21
bah ça colore pas grand chose :-P C pas mal du tout je dirais, mais l'étape suivante c'est de colorer les nombres, faire la différence entre un entier, un float, un nombre octal (0...) hexadécimal (0x...) etc :-)
Colorer les chaînes
Sinon oui c rapide ^^ Bonne continuation !
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
24 juin 2003 à 07:07
a la place du Found = InStr(Found + 1, Txt, ListM(j).Mot) j'aurai mis
Found = txt like "*" & listM(J).Mot & "*"

mais bon c'est une question de goût... c'est du bon boulot.

Séb...
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 juin 2003 à 23:41
Les numeros de lignes font un peu ce qu'il veulent :)

va voir l'une de mes sources, qui colorie le code c++ , j'en ai une autre qui montre comment afficher les numeros de lignes, mais c'est au fin fond du controle, donc, amuse toi !!! tu devrai hooker le controle pour modifier les numeros de ligne au moment du scroll.....


c'est une chose qui me tient vraiment a coeur, la coloration syntaxique, et je tien a annoncer que je me remet au boulot la dessus (en plus de mes controles Xp et de mon explorateur, ca fait deja du monde !!!!)


sinon ca va, quelques bugs, mais ca fonctionne bien !!!!! 8/10