outils personnalisés

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Guillot
Messages : 522
Inscription : jeu. 25/juin/2015 16:18

outils personnalisés

Message par Guillot »

suite a un récent post de falsam: IDE : Editor Helper
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