Page 1 sur 2

coloration syntaxique

Publié : mer. 12/avr./2006 18:45
par graph100
Bon je sais qu'il en existe plein mais je n'arrive pas a les faire fonctionner
donc j'ai fait ma lib de coloration syntaxique

Code : Tout sélectionner

ProcedureDLL ls_InitKeyword(file.s); initialise et charge la liste de mot clé de la forme: "nombre de mot cle" "motclé" "couleurmotcle" "motclé" "couleurmotcle"
  If OpenFile(0, file)
    nombre = Val(ReadString())
    If nombre = 0 : ProcedureReturn 0 : EndIf
    Dim color_fonction_liste.s(nombre, 2)
    color_fonction_liste(0, 0) = Str(nombre)
    For index = 1 To nombre
      color_fonction_liste(index, 1) = ReadString(); keyword
      color_fonction_liste(index, 2) = ReadString(); couleur
    Next
    CloseFile(0)
    ProcedureReturn 1
  EndIf
  ProcedureReturn 0
EndProcedure

ProcedureDLL.s ls_ReturnString(text.s, pos.l); retourne le caractere a la position specifie du text
  ProcedureReturn Right(Left(text, pos), 1)
EndProcedure

ProcedureDLL ls_FindDiffString(string.s, stringstofind.s, startposition); retourne la position du premier caractere trouver de stringstofind.s dans string
  position = 1000000000
  For pos = 1 To Len(stringstofind.s)
    cara = FindString(string, ls_ReturnString(stringstofind, pos), startposition)
    If cara < position And cara <> 0
      position = cara
    EndIf
  Next
  If position = 1000000000
    position = 0
  EndIf
  ProcedureReturn position
EndProcedure

ProcedureDLL ls_ColorationSyntaxique(gadget.l, progbarID.l, com.s, ColorCom, chaine.s, ColorChaine, operator.s, coloroperator, colorchiffre); effectue une coloration syntaxique "InitKeyword(file.s)" doit etre appeler avant
  HideGadget(gadget, 1)
  ProgressBarGadget(progbarID, GadgetX(gadget) + 10, GadgetHeight(gadget) / 2 - 5, GadgetWidth(gadget) - 20, 10, 0, 100, #PB_ProgressBar_Smooth)
  For index = 0 To CountGadgetItems(gadget)
    ligne.s = GetGadgetItemText(gadget, index, 0)
    Editor_ColorText(gadget, index, 1, index, Len(ligne) + 1, RGB(0, 0, 0))
    
    ;{ coloration des commentaires
    pos = 0
    poscom = 0
    While pos < Len(ligne) And pos <> -1
      poscommentaire = FindString(ligne, com, pos + 1)
      pos = poscommentaire
      If pos = 0 : pos = -1 : EndIf
      If poscommentaire
        chainecaractere = 0
        For indexbis = 1 To poscommentaire
          If ls_ReturnString(ligne, indexbis) = chaine : chainecaractere = chainecaractere + 1 : EndIf
        Next
        
        resultn.f = chainecaractere / 2
        
        If Fract(resultn.f) = 0
          Editor_ColorText(gadget, index, poscommentaire, index, Len(ligne) + 1, ColorCom)
          If poscom = 0 : poscom = poscommentaire : EndIf
        EndIf
      EndIf
    Wend
    If poscom = 0 : poscom = Len(ligne) + 1 : EndIf
    ;}
    
    ;{ coloration des chaines
    resultbis = CountString(ligne, chaine)
    Dim chaine_emplacement(1, 2)
    If resultbis
      Dim chaine_emplacement(resultbis, 2)
    EndIf
    For indexbis = 1 To Len(ligne) + 1
      poschainepre = FindString(ligne, chaine, indexbis)
      If poschainepre
        chainepasse = chainepasse + 1
        indexbis = poschainepre + 1
        poschaineder = FindString(ligne, chaine, indexbis)
        If poschaineder = 0
          poschaineder = Len(ligne) + 1
        Else
          indexbis = poschaineder + 1
        EndIf
        If poschainepre < poscom
          Editor_ColorText(gadget, index, poschainepre, index, poschaineder + 1, ColorChaine)
          chaine_emplacement(0, 0) = chaine_emplacement(0, 0) + 1
          chaine_emplacement(chaine_emplacement(0, 0), 1) = poschainepre
          chaine_emplacement(chaine_emplacement(0, 0), 2) = poschaineder
        EndIf
      EndIf
    Next
    ;}
    
    ;{ coloration des mots clé
    For indexbis = 1 To Val(color_fonction_liste(0, 0))
      pos = 0
      While pos < Len(ligne) + 1 And pos > -1
        pos = FindString(LCase(ligne), LCase(color_fonction_liste(indexbis, 1)), pos)
        autorise = 1
        If chaine_emplacement(0, 0)
          For indexprime = 1 To chaine_emplacement(0, 0)
            If pos > chaine_emplacement(indexprime, 1) And pos < chaine_emplacement(indexprime, 2)
              autorise = 0
            EndIf
          Next
        EndIf
        If pos
          cara1.s =ls_ReturnString(ligne, pos - 1)
          cara2.s =ls_ReturnString(ligne, pos + Len(color_fonction_liste(indexbis, 1)))
          If pos + Len(color_fonction_liste(indexbis, 1)) = Len(ligne) + 1 : cara2.s = "" : EndIf
          
          oui1 = 0
          oui2 = 0
          For indexprime = 0 To Len(operator + chaine + com)
            If cara1 =ls_ReturnString(operator + chaine + com, indexprime) : oui1 = 1 : EndIf
            If cara2 =ls_ReturnString(operator + chaine + com, indexprime) : oui2 = 1 : EndIf
          Next
          
          If autorise = 1 And oui1 = 1 And oui2 = 1 And pos < poscom
            Editor_ColorText(gadget, index, pos, index, pos + Len(color_fonction_liste(indexbis, 1)), Val(color_fonction_liste(indexbis, 2)))
          EndIf
          pos = pos + 1
        Else : pos = - 1
        EndIf
      Wend
    Next
    ;}
    
    ;{ coloration des chiffres
    pos = 0
    While pos < Len(ligne) + 1 And pos > -1
      pos = ls_FindDiffString(ligne, "0123456789", pos)
      If pos
        len = 1
        autorise = 1
        If chaine_emplacement(0, 0)
          For indexprime = 1 To chaine_emplacement(0, 0)
            If pos > chaine_emplacement(indexprime, 1) And pos < chaine_emplacement(indexprime, 2)
              autorise = 0
            EndIf
          Next
        EndIf
        
        Repeat
          If pos + len = ls_FindDiffString(ligne, "0123456789", pos + len)
            len = len + 1
          EndIf
        Until pos + len <> ls_FindDiffString(ligne, "0123456789", pos + len)
        
        cara1.s =ls_ReturnString(ligne, pos - 1)
        cara2.s =ls_ReturnString(ligne, pos + len)
        If pos + len = Len(ligne) + 1 : cara2.s = "" : EndIf
        
        oui1 = 0
        oui2 = 0
        For indexprime = 0 To Len(operator + chaine + com)
          If cara1 = ls_ReturnString(operator + chaine + com, indexprime) : oui1 = 1 : EndIf
          If cara2 = ls_ReturnString(operator + chaine + com, indexprime) : oui2 = 1 : EndIf
        Next
        
        If autorise = 1 And oui1 = 1 And oui2 = 1 And pos < poscom
          Editor_ColorText(gadget, index, pos, index, pos + len, colorchiffre)
        EndIf
        
        pos = pos + len
      Else : pos = -1
      EndIf
    Wend
    ;}
    
    ;{ coloration des operateurs
    pos = 0
    While pos < Len(ligne) + 1 And pos > -1
      pos = ls_FindDiffString(ligne, operator, pos)
      autorise = 1
      If chaine_emplacement(0, 0)
        For indexprime = 1 To chaine_emplacement(0, 0)
          If pos > chaine_emplacement(indexprime, 1) And pos < chaine_emplacement(indexprime, 2)
            autorise = 0
          EndIf
        Next
      EndIf
      If pos
        If autorise = 1 And pos < poscom
          Editor_ColorText(gadget, index, pos, index, pos + 1, coloroperator)
        EndIf
        pos = pos + 1
      Else : pos = - 1
      EndIf
    Wend
    ;}
    If CountGadgetItems(gadget)
      SetGadgetState(progbarID, (index * 100) / CountGadgetItems(gadget))
    EndIf
  Next
  FreeGadget(progbarID)
  HideGadget(gadget, 0)
EndProcedure

ProcedureDLL ls_ColorationSyntaxiqueLigne(gadget.l, index, com.s, ColorCom, chaine.s, ColorChaine, operator.s, coloroperator, colorchiffre);ingnore le parametre "progbarID.l" effectue une coloration syntaxique a l'index donné "InitKeyword(file.s)" doit etre appeler avant
    index = index - 1
    ligne.s = GetGadgetItemText(gadget, index, 0)
    Editor_ColorText(gadget, index, 1, index, Len(ligne) + 1, RGB(0, 0, 0))
    
    ;{ coloration des commentaires
    pos = 0
    poscom = 0
    While pos < Len(ligne) And pos <> -1
      poscommentaire = FindString(ligne, com, pos + 1)
      pos = poscommentaire
      If pos = 0 : pos = -1 : EndIf
      If poscommentaire
        chainecaractere = 0
        For indexbis = 1 To poscommentaire
          If ls_ReturnString(ligne, indexbis) = chaine : chainecaractere = chainecaractere + 1 : EndIf
        Next
        
        resultn.f = chainecaractere / 2
        
        If Fract(resultn.f) = 0
          Editor_ColorText(gadget, index, poscommentaire, index, Len(ligne) + 1, ColorCom)
          If poscom = 0 : poscom = poscommentaire : EndIf
        EndIf
      EndIf
    Wend
    If poscom = 0 : poscom = Len(ligne) + 1 : EndIf
    ;}
    
    ;{ coloration des chaines
    resultbis = CountString(ligne, chaine)
    Dim chaine_emplacement(1, 2)
    If resultbis
      Dim chaine_emplacement(resultbis, 2)
    EndIf
    For indexbis = 1 To Len(ligne) + 1
      poschainepre = FindString(ligne, chaine, indexbis)
      If poschainepre
        chainepasse = chainepasse + 1
        indexbis = poschainepre + 1
        poschaineder = FindString(ligne, chaine, indexbis)
        If poschaineder = 0
          poschaineder = Len(ligne) + 1
        Else
          indexbis = poschaineder + 1
        EndIf
        If poschainepre < poscom
          Editor_ColorText(gadget, index, poschainepre, index, poschaineder + 1, ColorChaine)
          chaine_emplacement(0, 0) = chaine_emplacement(0, 0) + 1
          chaine_emplacement(chaine_emplacement(0, 0), 1) = poschainepre
          chaine_emplacement(chaine_emplacement(0, 0), 2) = poschaineder
        EndIf
      EndIf
    Next
    ;}
    
    ;{ coloration des mots clé
    For indexbis = 1 To Val(color_fonction_liste(0, 0))
      pos = 0
      While pos < Len(ligne) + 1 And pos > -1
        pos = FindString(LCase(ligne), LCase(color_fonction_liste(indexbis, 1)), pos)
        autorise = 1
        If chaine_emplacement(0, 0)
          For indexprime = 1 To chaine_emplacement(0, 0)
            If pos > chaine_emplacement(indexprime, 1) And pos < chaine_emplacement(indexprime, 2)
              autorise = 0
            EndIf
          Next
        EndIf
        If pos
          cara1.s =ls_ReturnString(ligne, pos - 1)
          cara2.s =ls_ReturnString(ligne, pos + Len(color_fonction_liste(indexbis, 1)))
          If pos + Len(color_fonction_liste(indexbis, 1)) = Len(ligne) + 1 : cara2.s = "" : EndIf
          
          oui1 = 0
          oui2 = 0
          For indexprime = 0 To Len(operator + chaine + com)
            If cara1 =ls_ReturnString(operator + chaine + com, indexprime) : oui1 = 1 : EndIf
            If cara2 =ls_ReturnString(operator + chaine + com, indexprime) : oui2 = 1 : EndIf
          Next
          
          If autorise = 1 And oui1 = 1 And oui2 = 1 And pos < poscom
            Editor_ColorText(gadget, index, pos, index, pos + Len(color_fonction_liste(indexbis, 1)), Val(color_fonction_liste(indexbis, 2)))
          EndIf
          pos = pos + 1
        Else : pos = - 1
        EndIf
      Wend
    Next
    ;}
    
    ;{ coloration des chiffres
    pos = 0
    While pos < Len(ligne) + 1 And pos > -1
      pos = ls_FindDiffString(ligne, "0123456789", pos)
      If pos
        len = 1
        autorise = 1
        If chaine_emplacement(0, 0)
          For indexprime = 1 To chaine_emplacement(0, 0)
            If pos > chaine_emplacement(indexprime, 1) And pos < chaine_emplacement(indexprime, 2)
              autorise = 0
            EndIf
          Next
        EndIf
        
        Repeat
          If pos + len = ls_FindDiffString(ligne, "0123456789", pos + len)
            len = len + 1
          EndIf
        Until pos + len <> ls_FindDiffString(ligne, "0123456789", pos + len)
        
        cara1.s =ls_ReturnString(ligne, pos - 1)
        cara2.s =ls_ReturnString(ligne, pos + len)
        If pos + len = Len(ligne) + 1 : cara2.s = "" : EndIf
        
        oui1 = 0
        oui2 = 0
        For indexprime = 0 To Len(operator + chaine + com)
          If cara1 = ls_ReturnString(operator + chaine + com, indexprime) : oui1 = 1 : EndIf
          If cara2 = ls_ReturnString(operator + chaine + com, indexprime) : oui2 = 1 : EndIf
        Next
        
        If autorise = 1 And oui1 = 1 And oui2 = 1 And pos < poscom
          Editor_ColorText(gadget, index, pos, index, pos + len, colorchiffre)
        EndIf
        
        pos = pos + len
      Else : pos = -1
      EndIf
    Wend
    ;}
    
    ;{ coloration des operateurs
    pos = 0
    While pos < Len(ligne) + 1 And pos > -1
      pos = ls_FindDiffString(ligne, operator, pos)
      autorise = 1
      If chaine_emplacement(0, 0)
        For indexprime = 1 To chaine_emplacement(0, 0)
          If pos > chaine_emplacement(indexprime, 1) And pos < chaine_emplacement(indexprime, 2)
            autorise = 0
          EndIf
        Next
      EndIf
      If pos
        If autorise = 1 And pos < poscom
          Editor_ColorText(gadget, index, pos, index, pos + 1, coloroperator)
        EndIf
        pos = pos + 1
      Else : pos = - 1
      EndIf
    Wend
    ;}
EndProcedure
ca marche mais quand on utilise la coloration pour une seule ligne et que le texte de la ligne est plus grand que l éditor gadget on voit le deplacement du texte pour colorer toute la ligne
c possible d'eviter ca ?

Publié : mer. 12/avr./2006 19:38
par Dr. Dri
en envoyant un message pour cacher la sélection et en envoyant un autre pour la réafficher c'est faisable

c'est un message genre em_hidesel, cherche sur le forum ca a déjà été discutté.

Dri ;)

Publié : jeu. 13/avr./2006 9:20
par lionel_om
On pourra avoir un petit exemple une fois ton prog terminé ?

:wink:
Lio

Publié : jeu. 13/avr./2006 19:06
par graph100
@Dr. Dri
le texte est color meme si il est cache
ok je vais cherche

@lionel_om
Si tu veux mais il n'est pas commente et il fait 1200 ligne pour pas grand chose ^^
pour l'instant il n'i a que quelque fonctions qui sont supporté

(voir message plus bas)

Publié : jeu. 13/avr./2006 19:52
par Dr. Dri
Le message, c'est pour cacher la sélection, le rectangle de sélection, pas le texte.

Dri

Publié : ven. 14/avr./2006 9:43
par graph100
@Dr. Dri
c ce que je voulai dire dsl
j'ai chercher , mais pas trouver
je suppose qu'il faut utiliser l'api
c a dire tout ce que je ne comprend pas
--> ya pas d'aide la dessus

Publié : ven. 14/avr./2006 13:02
par Dr. Dri

Publié : sam. 15/avr./2006 9:23
par graph100
Ok merci

saurais tu par hasar s'il existe une aide sur les api du genre "SendMessage_(" ??

sinon que penser vous de l'editeur
toute remarque construtive est la bienvenu :D

Publié : sam. 15/avr./2006 10:42
par Chris
Il n'y a pas vraiment d'aide pour SendMessage_().

C'est toujours SendMessage_(Handle, Message, wParam, lParam)

Handle est l'identifiant système du gadget ou de la fenêtre. (GadgetId(xxx) ou WindowId(xxx))

Message, est spécifique à chaque gadget, et les paramètres varient selon le message.
Les paramètres peuvent être des valeurs qu'on passe, ou qu'on reçoit. Tout dépend du message.

Il faut avoir le SDK ou le fichier Win32.hlp pour avoir les précisions sur cette commande

Publié : sam. 15/avr./2006 10:55
par Dr. Dri
Avec le win32.hlp dans le répertoire help de ton dossier purebasic, tu as accès à l'aide des fonctions de l'api avec la touche F1 ^^

Ca fait pas très longtemps que je connais mais je peux te garantir que ca aide énormément, avant je faisais mes recherches sur le site du msdn donc je pouvais chercher que si j'avais le net...

Dri ;)

Publié : sam. 15/avr./2006 15:23
par Flype
j'avais fais çà ya longtemps (réadapté pour PB4)
c'est une façon de faire un peu particulière, si çà peut aider ou donner des idées...

Code : Tout sélectionner

;-------------------------------------------
;- Colorisation syntaxique (PB4.0)
;-------------------------------------------

Structure SYNTAXHIGHLIGHT
  keyword.s
  effect.l
  color.l
EndStructure

Global NewList syntax.SYNTAXHIGHLIGHT()

Procedure.b Syntax_Clear()
  
  ClearList(syntax())
  
EndProcedure
Procedure.b Syntax_Add(keyword.s, color.l, effect.l = #Null)
  
  If AddElement(syntax())
    syntax()\keyword = keyword
    syntax()\effect = effect
    syntax()\color = color
  EndIf
  
EndProcedure
Procedure.l Syntax_Apply(gID.l)
  
  hGadget = GadgetID(gID)
  
  format.CHARFORMAT
  format\cbSize = SizeOf(CHARFORMAT) 
  format\dwMask = #CFM_COLOR|#CFM_BOLD|#CFM_ITALIC|#CFM_UNDERLINE
  
  search.FINDTEXTEX
  search\chrg\cpMax = Len(GetGadgetText(gID))
  SendMessage_(hGadget, #EM_HIDESELECTION, #True, #Null)
  
  ForEach syntax()
    
    search\chrg\cpMin = 0
    search\lpstrText = @syntax()\keyword
    
    Repeat
      result = SendMessage_(hGadget, #EM_FINDTEXTEX, #FR_DOWN, @search);
      If result <> -1
        SendMessage_(hGadget, #EM_SETSEL, search\chrgText\cpMin, search\chrgText\cpMax)
        format\crTextColor = syntax()\color
        format\dwEffects   = syntax()\effect
        SendMessage_(hGadget, #EM_SETCHARFORMAT, #SCF_SELECTION|#SCF_WORD, @format)
        search\chrg\cpMin = search\chrgText\cpMax
      EndIf
    Until result = -1
    
  Next
  
  SendMessage_(hGadget, #EM_SETSEL, -1, 0)
  SendMessage_(hGadget, #EM_HIDESELECTION, #False, #Null)
  SendMessage_(hGadget, #EM_LINESCROLL, #Null, 20)
  
EndProcedure

;-------------------------------------------
;- EXAMPLE: Définition de la syntaxe SQL
;-------------------------------------------

Restore SQL_ALPHA    : Repeat : Read item$ : If item$ : Syntax_Add(item$, $0B95E0, #CFM_ITALIC) : EndIf : Until item$ = ""
Restore SQL_OP       : Repeat : Read item$ : If item$ : Syntax_Add(item$, $0000DD, #CFE_BOLD) : EndIf : Until item$ = ""
Restore SQL_MOT      : Repeat : Read item$ : If item$ : Syntax_Add(item$, $00AA00, #CFE_BOLD) : EndIf : Until item$ = ""
Restore SQL_FONCTION : Repeat : Read item$ : If item$ : Syntax_Add(item$, $AACC44, #CFM_BOLD) : EndIf : Until item$ = ""
Restore SQL_NUM      : Repeat : Read item$ : If item$ : Syntax_Add(item$, $FF0000) : EndIf : Until item$ = ""
Restore SQL_TABLE    : Repeat : Read item$ : If item$ : Syntax_Add(item$, $9B0E15, #CFE_UNDERLINE) : EndIf : Until item$ = ""
Restore SQL_CHAMP    : Repeat : Read item$ : If item$ : Syntax_Add(item$, $000000) : EndIf : Until item$ = ""

DataSection ; Syntaxe SQL
  SQL_FONCTION:
  Data.s "CONCAT","DATE_FORMAT",#NULL$
  SQL_NUM:
  Data.s "0","1","2","3","4","5","6","7","8","9",#NULL$
  SQL_OP:
  Data.s ".",",",";","!","(",")","<",">","=","LIKE","NOT","AND","OR",#NULL$
  SQL_MOT:
  Data.s "SELECT","DISTINCT","WHERE","FROM","JOIN","ON","ORDER BY","ASC","DESC","LIMIT",#NULL$
  SQL_ALPHA:
  Data.s "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",":","%","'",Chr(34),#NULL$
  SQL_TABLE:
  Data.s "session","droit",#NULL$
  SQL_CHAMP:
  Data.s "id","prenom","nom","motdepasse","inscription","description",#NULL$
EndDataSection

;-------------------------------------------
;- EXAMPLE: Test Colorisation syntaxique
;-------------------------------------------

If OpenWindow(0,0,0,640,480,"Colorisation Syntaxique",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  If CreateGadgetList(WindowID(0))
    
    EditorGadget(0,5,5,630,470)
    
    If LoadFont(0,"Arial",16,#PB_Font_HighQuality)
      SetGadgetFont(0,FontID(0))
    EndIf
    
    requete$ = "SELECT CONCAT(session.nom, ' ', session.nom), " + #LF$
    requete$ + "DATE_FORMAT('%d.%m.%Y %H:%i:%s', session.inscription), " + #LF$
    requete$ + "session.id, " + #LF$
    requete$ + "session.motdepasse, " + #LF$
    requete$ + "session.droit, " + #LF$
    requete$ + "droit.description " + #LF$ + #LF$
    requete$ + "FROM session " + #LF$
    requete$ + "JOIN droit ON droit.id = session.droit " + #LF$ + #LF$
    requete$ + "WHERE 1 " + #LF$
    requete$ + "AND session.prenom LIKE '%jean%' " + #LF$
    requete$ + "AND session.droit != 'invite' " + #LF$
    requete$ + "AND session.droit <> 'membre' " + #LF$ + #LF$
    requete$ + "ORDER BY session.id ASC " + #LF$
    requete$ + "LIMIT 0, 100;"
    
    SetGadgetText(0,requete$)
    Syntax_Apply(0)
    
  EndIf
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
    EndSelect
  ForEver
  
EndIf

Publié : ven. 21/avr./2006 14:44
par graph100
A.. ca marche bien mais si on modifie le texte ca ne marche pas
j'utilise deux fonctions : l'une pour colorer tout le texte : pour les long texte c assez pratique et l'autre pour colorer la ligne qui est en train d'etre modifier
donc j'ai essayer ca :

Code : Tout sélectionner

ProcedureDLL Editor_ColorTest(Gadget, ydeb, xdeb, yfin, xfin, Color) 
  ; Set the Text color for the Selection 
  ; in RGB format 
  format.CHARFORMAT 
  format\cbSize = SizeOf(CHARFORMAT) 
  format\dwMask = #CFM_COLOR 
  format\crTextColor = Color 
  
  sel.CHARRANGE 
  ; on récupere l'ancienne sélection 
  oldsel.CHARRANGE 
  SendMessage_(GadgetID(Gadget), #EM_GETSEL, @oldsel\cpMin, @oldsel\cpMax) 
  sel\cpMin = SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, ydeb, 0) + xdeb - 1 
  
  If yfin = -1 
    yfin = SendMessage_(GadgetID(Gadget), #EM_GETLINECOUNT, 0, 0)-1 
  EndIf 
  sel\cpMax =SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, yfin, 0) 
  
  If xfin = -1 
    sel\cpMax + SendMessage_(GadgetID(Gadget), #EM_LINELENGTH, sel\cpMax, 0) 
  Else 
    sel\cpMax + xfin - 1 
  EndIf 
  
;   ; on désactive la sélection 
;   SendMessage_(GadgetID(Gadget), #EM_HIDESELECTION, #True, #Null) 
;   
  
  ; on sélectionne le text qu'on veux colorer 
  SendMessage_(GadgetID(Gadget), #EM_SETSEL, sel\cpMin, sel\cpMax) 
  ; wParam attend le mode de formatage, et non la position 
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format) 
  
  
;   ; on replace le carret là ou il etait (ou selection si il y en avait une) 
;   SendMessage_(GadgetID(Gadget), #EM_SETSEL, oldsel\cpMin, oldsel\cpMax) 
;   ; on active la sélection 
;   SendMessage_(GadgetID(Gadget), #EM_HIDESELECTION, #False, #Null) 
EndProcedure 

ProcedureDLL ls_ColorationSyntaxiqueLigne(gadget.l, index, com.s, ColorCom, chaine.s, ColorChaine, operator.s, coloroperator, colorchiffre);ingnore le parametre "progbarID.l" effectue une coloration syntaxique a l'index donné "InitKeyword(file.s)" doit etre appeler avant
  index = index - 1
  ligne.s = GetGadgetItemText(gadget, index, 0)
  
  
  ydeb = index
  xdeb = 0
  
  yfin = index
  xfin = Len(ligne) + 1
  
  sel.CHARRANGE 
  ; on récupere l'ancienne sélection 
  oldsel.CHARRANGE 
  SendMessage_(GadgetID(Gadget), #EM_GETSEL, @oldsel\cpMin, @oldsel\cpMax) 
  sel\cpMin = SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, ydeb, 0) + xdeb - 1 
  
  If yfin = -1 
    yfin = SendMessage_(GadgetID(Gadget), #EM_GETLINECOUNT, 0, 0)-1 
  EndIf 
  sel\cpMax =SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, yfin, 0) 
  
  If xfin = -1 
    sel\cpMax + SendMessage_(GadgetID(Gadget), #EM_LINELENGTH, sel\cpMax, 0) 
  Else 
    sel\cpMax + xfin - 1 
  EndIf 
  
  ; on sélectionne le text qu'on veux colorer 
;  SendMessage_(GadgetID(Gadget), #EM_SETSEL, sel\cpMin, sel\cpMax) 
  ; on désactive la sélection 
  SendMessage_(GadgetID(Gadget), #EM_HIDESELECTION, #True, #Null) 
  
  
  
  Editor_ColorTest(gadget, index, 1, index, Len(ligne) + 1, RGB(0, 0, 0))
    
    ;{ coloration des commentaires
    pos = 0
    poscom = 0
    While pos < Len(ligne) And pos <> -1
      poscommentaire = FindString(ligne, com, pos + 1)
      pos = poscommentaire
      If pos = 0 : pos = -1 : EndIf
      If poscommentaire
        chainecaractere = 0
        For indexbis = 1 To poscommentaire
          If ls_ReturnString(ligne, indexbis) = chaine : chainecaractere = chainecaractere + 1 : EndIf
        Next
        
        resultn.f = chainecaractere / 2
        
        If Fract(resultn.f) = 0
          Editor_ColorTest(gadget, index, poscommentaire, index, Len(ligne) + 1, ColorCom)
          If poscom = 0 : poscom = poscommentaire : EndIf
        EndIf
      EndIf
    Wend
    If poscom = 0 : poscom = Len(ligne) + 1 : EndIf
    ;}
    
    ;{ coloration des chaines
    resultbis = CountString(ligne, chaine)
    Dim chaine_emplacement(1, 2)
    If resultbis
      Dim chaine_emplacement(resultbis, 2)
    EndIf
    For indexbis = 1 To Len(ligne) + 1
      poschainepre = FindString(ligne, chaine, indexbis)
      If poschainepre
        chainepasse = chainepasse + 1
        indexbis = poschainepre + 1
        poschaineder = FindString(ligne, chaine, indexbis)
        If poschaineder = 0
          poschaineder = Len(ligne) + 1
        Else
          indexbis = poschaineder + 1
        EndIf
        If poschainepre < poscom
          Editor_ColorTest(gadget, index, poschainepre, index, poschaineder + 1, ColorChaine)
          chaine_emplacement(0, 0) = chaine_emplacement(0, 0) + 1
          chaine_emplacement(chaine_emplacement(0, 0), 1) = poschainepre
          chaine_emplacement(chaine_emplacement(0, 0), 2) = poschaineder
        EndIf
      EndIf
    Next
    ;}
    
    ;{ coloration des mots clé
    For indexbis = 1 To Val(color_fonction_liste(0, 0))
      pos = 0
      While pos < Len(ligne) + 1 And pos > -1
        pos = FindString(LCase(ligne), LCase(color_fonction_liste(indexbis, 1)), pos)
        autorise = 1
        If chaine_emplacement(0, 0)
          For indexprime = 1 To chaine_emplacement(0, 0)
            If pos > chaine_emplacement(indexprime, 1) And pos < chaine_emplacement(indexprime, 2)
              autorise = 0
            EndIf
          Next
        EndIf
        If pos
          cara1.s =ls_ReturnString(ligne, pos - 1)
          cara2.s =ls_ReturnString(ligne, pos + Len(color_fonction_liste(indexbis, 1)))
          If pos + Len(color_fonction_liste(indexbis, 1)) = Len(ligne) + 1 : cara2.s = "" : EndIf
          
          oui1 = 0
          oui2 = 0
          For indexprime = 0 To Len(operator + chaine + com)
            If cara1 =ls_ReturnString(operator + chaine + com, indexprime) : oui1 = 1 : EndIf
            If cara2 =ls_ReturnString(operator + chaine + com, indexprime) : oui2 = 1 : EndIf
          Next
          
          If autorise = 1 And oui1 = 1 And oui2 = 1 And pos < poscom
            Editor_ColorTest(gadget, index, pos, index, pos + Len(color_fonction_liste(indexbis, 1)), Val(color_fonction_liste(indexbis, 2)))
          EndIf
          pos = pos + 1
        Else : pos = - 1
        EndIf
      Wend
    Next
    ;}
    
    ;{ coloration des chiffres
    pos = 0
    While pos < Len(ligne) + 1 And pos > -1
      pos = ls_FindDiffString(ligne, "0123456789", pos)
      If pos
        len = 1
        autorise = 1
        If chaine_emplacement(0, 0)
          For indexprime = 1 To chaine_emplacement(0, 0)
            If pos > chaine_emplacement(indexprime, 1) And pos < chaine_emplacement(indexprime, 2)
              autorise = 0
            EndIf
          Next
        EndIf
        
        Repeat
          If pos + len = ls_FindDiffString(ligne, "0123456789", pos + len)
            len = len + 1
          EndIf
        Until pos + len <> ls_FindDiffString(ligne, "0123456789", pos + len)
        
        cara1.s =ls_ReturnString(ligne, pos - 1)
        cara2.s =ls_ReturnString(ligne, pos + len)
        If pos + len = Len(ligne) + 1 : cara2.s = "" : EndIf
        
        oui1 = 0
        oui2 = 0
        For indexprime = 0 To Len(operator + chaine + com)
          If cara1 = ls_ReturnString(operator + chaine + com, indexprime) : oui1 = 1 : EndIf
          If cara2 = ls_ReturnString(operator + chaine + com, indexprime) : oui2 = 1 : EndIf
        Next
        
        If autorise = 1 And oui1 = 1 And oui2 = 1 And pos < poscom
          Editor_ColorTest(gadget, index, pos, index, pos + len, colorchiffre)
        EndIf
        
        pos = pos + len
      Else : pos = -1
      EndIf
    Wend
    ;}
    
    ;{ coloration des operateurs
    pos = 0
    While pos < Len(ligne) + 1 And pos > -1
      pos = ls_FindDiffString(ligne, operator, pos)
      autorise = 1
      If chaine_emplacement(0, 0)
        For indexprime = 1 To chaine_emplacement(0, 0)
          If pos > chaine_emplacement(indexprime, 1) And pos < chaine_emplacement(indexprime, 2)
            autorise = 0
          EndIf
        Next
      EndIf
      If pos
        If autorise = 1 And pos < poscom
          Editor_ColorTest(gadget, index, pos, index, pos + 1, coloroperator)
        EndIf
        pos = pos + 1
      Else : pos = - 1
      EndIf
    Wend
    ;}
  
  ; on replace le carret là ou il etait (ou selection si il y en avait une) 
  SendMessage_(GadgetID(Gadget), #EM_SETSEL, oldsel\cpMin, oldsel\cpMax) 
  ; on active la sélection 
  SendMessage_(GadgetID(Gadget), #EM_HIDESELECTION, #False, #Null) 
EndProcedure
mais ca ne marche pas

je ne sais plus trop quoi en penser
le principe : on ne cache plus la ligne pendant la coloration d'un mot mais pendant toute la coloration de la ligne
j'ai du me tromper avec SendMessage_()

Publié : ven. 21/avr./2006 15:24
par Flype
oui c'est pas si simple. j'ai un truc qui fonctionne chez moi. j'avais galéré aussi. il me semble qu'il faut placer un EM_SETMODIFY à False à la fin pour éviter qu'il arrete de recoloriser en boucle. je t'enverrai çà ici ce soir.

Publié : dim. 23/avr./2006 22:23
par Flype
je pense que çà va t'intéresser.
c'était pas facile mais voilà çà marche.

http://www.penguinbyte.com/apps/pbwebst ... _mysql.zip

Publié : mer. 26/avr./2006 12:34
par graph100
ok je vais regarder merci