j'ai pris connaissance de la variable d'environnement "PB_TOOL_Scintilla" à partir de laquelle on peut piloter l'editeur de PB
je suis parti bille en tête dans l'idée de me faire un petit outil permettant de proposer les constantes associées aux parametres de procedure
mais pinaise !! pas facile à apprivoiser le bestiau (scintilla), dès qu'y un truc qui lui plait pas, l'editeur plante
ci dessous mon programme de test:
son but est simplement de lire l'intstruction sur laquelle se trouve le curseur et de la remplacer par "bonjour"
pour me simplifier la tache (surtout du fait des plantages intempestifs), je me suis fait un mode test (definie à la 1er ligne)
si #test=1:
dans ce mode je crée un ScintillaGadget et je fais mes tests avec
la fonction est executer lorsque je clic sur le bouton test
sinon:
il faut creer un executable qui devra être definit comme outils personnalisé
la fonction est executer via un raccourcit clavier
(voir la doc PB)
probleme :
certaines fonction scintilla marche a partir du gadget (mode test) mais pas à partir de l'editeur
dans l'exemple ci dessous SCI_ADDTEXT entraine un plantage
sans doute un probleme d'encodage de caractere ou de pointeur/adresse mémoire
j'en appelle donc aux spécialistes de Scintilla
Code : Tout sélectionner
#test=1
CompilerIf #test
InitScintilla()
Declare test()
OpenWindow(0,0,0,800,600,"",#PB_Window_ScreenCentered):SetWindowColor(0,$aaaaaa)
ButtonGadget(1,10,5,80,20,"test"):BindGadgetEvent(1,@ test())
ScintillaGadget(0,10,30,780,560,0)
ScintillaSendMessage(0, #SCI_SETTEXT, 0, UTF8(~"azerty\n123456:789:0123\nqsdfg"))
Procedure Send(Message, *wParam = #Null, *lParam = #Null)
ProcedureReturn ScintillaSendMessage(0, Message, *wParam, *lParam)
EndProcedure
Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow
CompilerElse
Global PB_TOOL_Scintilla.i = Val(GetEnvironmentVariable("PB_TOOL_Scintilla")):If (PB_TOOL_Scintilla=0):End:EndIf
CompilerSelect (#PB_Compiler_OS)
CompilerCase (#PB_OS_Windows)
Procedure Send(Message, *wParam = #Null, *lParam = #Null)
ProcedureReturn SendMessage_(PB_TOOL_Scintilla, Message, *wParam, *lParam)
;Protected val:SendMessageTimeout_(PB_TOOL_Scintilla, Message, *wParam, *lParam, #SMTO_ABORTIFHUNG, 2000, @ val):ProcedureReturn val
EndProcedure
; pour les autres...
CompilerEndSelect
CompilerEndIf
Procedure test()
Protected p,pi,pf,l,c.a,txt.s
l=send(#SCI_GETLENGTH)
p=Send(#SCI_GETSELECTIONSTART) -1
pi=p
While pi>=0
c=send(#SCI_GETCHARAT, pi)
If c=10 Or c=13 Or c=58:Break:EndIf
txt=Chr(c)+txt
pi-1
Wend
pf=p+1
While pf<l
c=send(#SCI_GETCHARAT, pf)
If c=10 Or c=13 Or c=58:Break:EndIf
txt+Chr(c)
pf+1
Wend
MessageRequester("","txt: "+txt)
send(#SCI_DELETERANGE,pi+1,pf-pi-1)
txt="bonjour"
send(#SCI_ADDTEXT,Len(Txt), UTF8(txt))
EndProcedure
If ProgramParameter(0)="test":test():EndIf