begin process at 2012 02 09 03:42:11
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Texte

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

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


 Information sur la source

Note :
9,17 / 10 - par 6 personnes
9,17 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Texte Niveau :Initié Date de création :23/06/2003 Date de mise à jour :22/11/2003 23:58:00 Vu / téléchargé :7 556 / 1 197

Auteur : NoMitsu

Ecrire un message privé
Commentaire sur cette source (22)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Voici ma première contribution au réseau code source, j?espère qu?elle sera utile.
Il s?agit donc d?un ocx (l?un de mes premiers) qui permet de colorer des mots prédéfinis dans un fichier externe.

L?avantage de ce prog est la possibilité d?éditer facilement sa propre liste de mots à colorer( Grâce à un petit éditeur dont la source est aussi fournie ;)) de plus il est très rapide lors de la coloration 500 lignes de code colorées en 2 secondes (avec une lise de 100 mots, un athlon XP 1600+ et 512Mo de ram).

Il a comme base une RichTextBox (avec quelques options que j?ai rajouté) et fait appelle à quelques APIs.

Enfin au niveau des bugs connus, il y en a 1 lorsqu?il y a plusieurs tailles ou types de police différentes dans le texte la barre qui donne les numéros de lignes n?est plus en phase avec la réalité (vous comprendrez mieux après l?avoir vue).
Et un petit défaut aussi lorsqu?il y a déjà du texte lors du Form_Load et qu? on le colorie
ça met un peu plus de temps.

J?ai essayé de commenter la source au mieux, Voilà j?attends vos commentaires avec impatience ainsi que les améliorations que vous pouvez y apporter.

------------------------------------------------ ------------------------------------------

Voici  Une petite mise a jour de mon contrôle la v4.10 au programme quelque ajout de fonction, correction de quelque bug et la possibilité de changer le look du contrôle est plus simple.

En gros voici les changement :

Fonction Ajouter :
   -> Coloration des String
   -> Coloration des Long
   -> Ajout TpsColorisation


Fonction Améliorer :
   -> Coloration plus rapide lors d'un chargement de fichier
   -> Coloration plus rapide lors d'un chargement du programme
   -> Coloration plus rapide lors de l'utilisation de la fonction AllScan


Bug Enlever :
   -> Liste les ligne recalculer lors d'un Resize
   -> Plus de Décalage entre la liste des ligne et le texte lorsque l'on
      change la taille de la police


Divers :
   -> Possibilité de changer de Style de Bordure
   -> Possibilité de changer de Couleur les Bordures
   -> Possibilité de Changer la taille du conteur de ligne

je n?est malheureusement pas réussi a régler le problème de la barre des numéro de ligne

Voilà, j?espère que sa vas vous servir (si vous avez des question n?esiter pas) .

Source

  • voici un extrait du code :
  • Public Function FindExpression(hwnd As Long, RTB As RichTextBox, Commentaire As Boolean, _
  • fFontSize As Long, fBold As Long, fFont As String, _
  • dColor As Long, dFontSize As Long, dBold As Long, dFont As String, _
  • Optional AllScan As Boolean = False, Optional UcaseMot As Boolean = False) As String
  • On Error Resume Next
  • Dim Found As Long, NbrLC As Long, ComVB As Long
  • Dim i As Integer, j As Integer
  • Dim Txt As String
  • LockWindowUpdate hwnd 'Empêche toute action, permet d'accélérer la vitesse de coloration
  • RTB.Enabled = False 'idem
  • RTB.Locked = True 'idem
  • If AllScan = False Then 'on regarde si on colorie tout le texte ou non
  • NbrLC = ModifLigne(RTB) 'on récupère le nbr de lignes modifié
  • Else
  • NbrLC = RTB.GetLineFromChar(Len(RTB.Text)) 'Récupération du nbr total de ligne dans le texte
  • RTB.SelStart = Len(RTB.Text) 'On se place à la fin du texte
  • End If
  • For i = 0 To NbrLC 'NbrLC = Nbr de lignes à colorier
  • Txt = txtInLigne(RTB, i, dColor, dFontSize, dBold, dFont) 'Récupération du txt qui se trouve sur la ligne
  • Found = 0 'ini var
  • ComVB = 0 'ini var
  • For j = 0 To NbrM - 1 'NbrM = Nbr de mots dans le fichier chargé au démarrage
  • Do
  • If UcaseMot = False Then
  • 'On recherche dans le texte le mot (si on le trouve Found = début du mot)
  • 'Dans ce cas là on cherche un mot identique au mot de la liste (ex: mot = mot <> Mot...)
  • Found = InStr(Found + 1, Txt, ListM(j).Mot)
  • Else
  • 'On recherche dans le texte le mot (si on le trouve Found = début du mot)
  • 'Dans ce cas on cherche un mot à l'orthographe identique mais les différences typographiques
  • 'ne sont pas prises en compte (ex: mot = mOt = MoT...)
  • Found = InStr(Found + 1, UCase(Txt), UCase(ListM(j).Mot))
  • End If
  • If Found <> 0 Then
  • 'Si on trouve un mot qui est contenu dans la liste on le colore
  • Call ColorText(RTB, dLigne + Found - 1, Len(ListM(j).Mot), RTB.SelStart, ListM(j).Color, _
  • fFontSize, fBold, fFont, dColor, dFontSize, dBold, dFont)
  • Else
  • Exit Do 'une fois que l'on a cherché toutes les occurrences du mot dans txt on quitte la boucle
  • End If
  • Loop
  • Next j
  • If Commentaire = True Then
  • ComVB = InStr(ComVB + 1, Txt, "'")
  • If ComVB <> 0 Then
  • Call ColorText(RTB, dLigne + ComVB - 1, Len(Txt) - ComVB + 1, RTB.SelStart, &HC000&, _
  • fFontSize, fBold, fFont, dColor, dFontSize, dBold, dFont)
  • End If
  • End If
  • Next i
  • LockWindowUpdate 0 'Reactive les actions de la fenêtre
  • RTB.Enabled = True 'Reactive les actions de la RTB
  • RTB.Locked = False 'On déverrouille la RTB
  • RTB.SetFocus 'on redonne la main à la RTB
  • End Function
voici un extrait du code :

Public Function FindExpression(hwnd As Long, RTB As RichTextBox, Commentaire As Boolean, _
                fFontSize As Long, fBold As Long, fFont As String, _
                dColor As Long, dFontSize As Long, dBold As Long, dFont As String, _
                Optional AllScan As Boolean = False, Optional UcaseMot As Boolean = False) As String

On Error Resume Next
 Dim Found As Long, NbrLC As Long, ComVB As Long
 Dim i As Integer, j As Integer
 Dim Txt As String
    
    LockWindowUpdate hwnd 'Empêche toute action, permet d'accélérer la vitesse de coloration
    RTB.Enabled = False   'idem
    RTB.Locked = True     'idem
    
    If AllScan = False Then 'on regarde si on colorie tout le texte ou non
        NbrLC = ModifLigne(RTB) 'on récupère le nbr de lignes modifié
    Else
        NbrLC = RTB.GetLineFromChar(Len(RTB.Text))  'Récupération du nbr total de ligne dans le texte
        RTB.SelStart = Len(RTB.Text) 'On se place à la fin du texte
    End If
    
    For i = 0 To NbrLC 'NbrLC = Nbr de lignes à colorier
      Txt = txtInLigne(RTB, i, dColor, dFontSize, dBold, dFont) 'Récupération du txt qui se trouve sur la ligne
      Found = 0 'ini var
      ComVB = 0 'ini var
      
      For j = 0 To NbrM - 1 'NbrM = Nbr de mots dans le fichier chargé au démarrage
        Do
          If UcaseMot = False Then
            'On recherche dans le texte le mot (si on le trouve Found = début du mot)
              'Dans ce cas là on cherche un mot identique au mot de la liste (ex: mot = mot <> Mot...)
            Found = InStr(Found + 1, Txt, ListM(j).Mot)
          Else
            'On recherche dans le texte le mot (si on le trouve Found = début du mot)
              'Dans ce cas on cherche un mot à l'orthographe identique mais les différences typographiques
              'ne sont pas prises en compte (ex: mot = mOt = MoT...)
            Found = InStr(Found + 1, UCase(Txt), UCase(ListM(j).Mot))
          End If
          
          If Found <> 0 Then
            'Si on trouve un mot qui est contenu dans la liste on le colore
            Call ColorText(RTB, dLigne + Found - 1, Len(ListM(j).Mot), RTB.SelStart, ListM(j).Color, _
                           fFontSize, fBold, fFont, dColor, dFontSize, dBold, dFont)
          Else
            Exit Do 'une fois que l'on a cherché toutes les occurrences du mot dans txt on quitte la boucle
          End If
        Loop
      Next j
      
      If Commentaire = True Then
        ComVB = InStr(ComVB + 1, Txt, "'")
      
        If ComVB <> 0 Then
            Call ColorText(RTB, dLigne + ComVB - 1, Len(Txt) - ComVB + 1, RTB.SelStart, &HC000&, _
                           fFontSize, fBold, fFont, dColor, dFontSize, dBold, dFont)
        End If
      End If
    Next i
  
    LockWindowUpdate 0 'Reactive les actions de la fenêtre
    RTB.Enabled = True 'Reactive les actions de la RTB
    RTB.Locked = False 'On déverrouille la RTB
    RTB.SetFocus       'on redonne la main à la RTB
End Function

 Conclusion

Vous retrouverez dans le zip les sources de l'ocx, une source d'exemple et la souce de l'editeur de liste.
Vous pouvez retrouver le reste de mes création ici http://www.Prog-eXtra.fr.st/

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture MINWINDOW (GESTIONNAIRE DE FENETRE)
Source avec Zip Source avec une capture CLASSE JOUANT AVEC LA TRANSPARENCE ENTRE 2 CONTROLES ET UN D...
Source avec Zip Source avec une capture PATCHER EXPRESS (GÉNÉRATEUR DE PATCH)
Source avec Zip Source avec une capture CHANGER LE LOOK DE VOS APPLICATION FACILEMENT AVEC EASY SKIN

 Sources de la même categorie

Source avec Zip Source avec une capture MASQUE DE SAISIE NUMÉRIQUE par acive
Source avec Zip Source .NET (Dotnet) COMPTEUR DE NOMBRE DE MOTS DANS UN TEXTE par alpha5
Source avec Zip Source avec une capture HM - BLOCNOTE par hassenmajor
Source .NET (Dotnet) [VB.NET] CLASS DE COLORATION SYNTAXIQUE "ON THE FLY" par huzima
Source avec Zip Source avec une capture PERSONNALISEZ VOS BOÎTES DE MESSAGE (X)HTML par medjahedScript

Commentaires et avis

Commentaire de Renfield le 23/06/2003 23:41:48 administrateur CS

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

Commentaire de sebmafate le 24/06/2003 07:07:33 administrateur CS

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...

Commentaire de Kirua le 24/06/2003 08:21:43

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 !

Commentaire de FrostByte le 24/06/2003 09:40:43

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

Commentaire de NoMitsu le 24/06/2003 14:24:45

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 -&gt; .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?

Commentaire de sebmafate le 24/06/2003 14:36:49 administrateur CS

NoMitsu --&gt; 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)

Commentaire de sebmafate le 24/06/2003 14:38:40 administrateur CS

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.

Commentaire de xlt le 16/09/2003 15:40:35

C'est cool je vais utiliser des parties de ton code pour mon editeur Vbscript!! Merciiiiiiiiiii 10/10

Commentaire de TheRedman le 22/11/2003 11:50:51

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é.

Commentaire de NoMitsu le 22/11/2003 16:09:08

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

Commentaire de TheRedman le 22/11/2003 20:41:21

Merci beaucoup

Commentaire de TheRedman le 21/12/2003 19:25:31

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 ?

Commentaire de NoMitsu le 21/12/2003 22:31:40

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 &lt;&gt; 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

Commentaire de TheRedman le 22/12/2003 11:35:07

merci

Commentaire de TheRedman le 22/12/2003 11:38:13

ET pour colorier une zone ? exemple &lt;!-- blablabla --&gt; mais de longueur indéterminée ?

Commentaire de TheRedman le 22/12/2003 11:54:26

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 ?

Commentaire de TheRedman le 22/12/2003 16:46:21

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.

Commentaire de NoMitsu le 23/12/2003 10:33:51

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) &lt;&gt; 0 And ComStr(1) &lt;&gt; 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, "&lt;!--")
ComStr(1) = InStr(ComStr(0) + 1, Txt, "--&gt;")

voila

Commentaire de TheRedman le 27/12/2003 14:26:01

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

Commentaire de TheRedman le 29/12/2003 15:46:39

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 ...

Commentaire de maxpiton4D le 10/11/2004 12:35:56

Salut

On pourrait pas faire en sorte que les numéros soient actualisés par un timer?

Commentaire de psykocrash le 16/12/2004 15:21:36

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

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,168 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales