Après des tests supplémentaires, je me suis rendu compte que je me suis complètement planté dans ma première investigation.
Le code ci-dessous est chargé de la colorisation syntaxique du texte contenu dans l'EditorGadget. Il utilise un callback dans lequel j'intercepte la notification EN_CHANGE pour l'EditorGadget, ce qui permet de coloriser le texte au fur et à mesure de la frappe des caractères.
Ce code fonctionne à la perfection sauf dans un cas précis, si l'on modifie le texte de la ligne qui se trouve sous le curseur, le programme boucle sans fin (voir dans la procédure de callback, le HIGHLIGHTLINE(CurrentLine).
Code : Tout sélectionner
Procedure HighlightLine(Line)
Protected LineText.s, StartPos, Endpos, Left, Right
Protected Minuscule.s, inst$, Format.CHARFORMAT
LineText = UCase(GetGadgetItemText(#Editor_1, Line, 0))
StartPos = SendMessage_(GadgetID(#Editor_1), #EM_LINEINDEX, Line, 0)
Endpos = StartPos + Len(LineText)
Format\cbSize = SizeOf(CHARFORMAT)
Format\dwMask = #CFM_COLOR | #CFM_BOLD | #CFM_ITALIC
SendMessage_(GadgetID(#Editor_1), #EM_SETSEL, StartPos, Endpos)
Format\crTextColor = #COLOR_Text
Format\dwEffects = #EFFECTS_Text
SendMessage_(GadgetID(#Editor_1), #EM_SETCHARFORMAT, #SCF_SELECTION, @Format)
ForEach TagHTML()
For mode.b = 1 To 2
Left = StartPos
Repeat
If mode = 1
inst$ = TagHTML()\ouvrant
Else
If TagHTML()\fermant <> ""
inst$ = TagHTML()\fermant
EndIf
EndIf
Right = FindString(LineText, inst$, Left - StartPos + 1) + StartPos
If Right = StartPos
Left = Endpos
Else
Left = Right - 1
Right + Len(inst$) - 1
SendMessage_(GadgetID(#Editor_1), #EM_SETSEL, Left, Right)
Minuscule = LCase(inst$)
SendMessage_(GadgetID(#Editor_1), #EM_REPLACESEL, #True, @Minuscule)
SendMessage_(GadgetID(#Editor_1), #EM_SETSEL, Left, Right)
Left = Right
Format\crTextColor = COLOR_Symbol
Format\dwEffects = #EFFECTS_Symbol
SendMessage_(GadgetID(#Editor_1), #EM_SETCHARFORMAT, #SCF_SELECTION, @Format)
EndIf
Until Left = Endpos
Next mode
Next
EndProcedure
Procedure WindowCallback(hWnd, uMsg, wParam, lParam)
Protected ReturnValue, CurrentLine, CurrentStartPos
ReturnValue = #PB_ProcessPureBasicEvents
Select uMsg
Case #WM_COMMAND
If wParam >> 16 = #EN_CHANGE And lParam = GadgetID(#Editor_1)
SendMessage_(GadgetID(#Editor_1), #EM_GETSEL, @CurrentStartPos, @CurrentLine)
CurrentLine = SendMessage_(GadgetID(#Editor_1), #EM_LINEFROMCHAR, CurrentStartPos, 0)
SendMessage_(GadgetID(#Editor_1), #EM_HIDESELECTION, 1, 0)
;HighlightLine(CurrentLine) -----> Si active, le prog boucle
If GetAsyncKeyState_(#VK_return) & 1 = 1
HighlightLine(CurrentLine - 1)
EndIf
SendMessage_(GadgetID(#Editor_1), #EM_SETSEL, CurrentStartPos, CurrentStartPos)
SendMessage_(GadgetID(#Editor_1), #EM_HIDESELECTION, 0, 0)
EndIf
EndSelect
ProcedureReturn ReturnValue
EndProcedure
Ce code fonctionnait parfaitement en PB 3.92 et plus en PB 3.93
Quelqu'un verrait-il une raison à ce problème ?