coloration syntaxique

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

coloration syntaxique

Message 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 ?
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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 ;)
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

On pourra avoir un petit exemple une fois ton prog terminé ?

:wink:
Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Message 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)
Dernière modification par graph100 le ven. 25/août/2006 16:32, modifié 2 fois.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Le message, c'est pour cacher la sélection, le rectangle de sélection, pas le texte.

Dri
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Message 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
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Message 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
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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 ;)
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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
Image
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Message 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_()
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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.
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

je pense que çà va t'intéresser.
c'était pas facile mais voilà çà marche.

http://www.penguinbyte.com/apps/pbwebst ... _mysql.zip
Image
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Message par graph100 »

ok je vais regarder merci
Répondre