Comme c'est le genre de chose que l'on aimerait trouver sans se prendre la tête, maintenant c'est fait.
C'est free, c'est du tout cuit. Rien ne vous empêche de faire mieux...
Code : Tout sélectionner
;===========================
; Comment gérer des gadgets dynamiques
; et récupérer le contenu des éditeurs, un peu comme l'IDE de PB
; PanelGadget() + EditorGadget()
;=--------------------------
; Codé avec PB V6.12 LTS
; by Jacobus le 13/09/2024
; Freely use comme tu veux, ça peut servir.
;=--------------------------
;J'ai passé l'après-midi la-dessus.
;après avoir testé avec des 'Dim' et des 'Structures'
;J'ai trouvé que cette solution était la plus simple
;Maintenant à chacun de voir ce qu'il en fait, en mieux ou pas.
;===========================
Enumeration
#WinDyn
#btnDebug
#btnClose
#btnNew
#btnList
#Panel
EndEnumeration
Global n = 0 ;(pas indispensable, juste un marqueur pour l'exemple)
Global NewList NewEditor() ; création d'une liste qui va recevoir les éditeurs en dynamique et avec laquelle on va pouvoir les gérer facilement
;-Fenêtre
If OpenWindow(#WinDyn,0,0, 400, 400,"Panel + Editor, mode dynamique", #PB_Window_SystemMenu |#PB_Window_ScreenCentered |#PB_Window_TitleBar)=0
End
EndIf
ButtonGadget(#btnDebug,5,5,100,25,"Contrôle") : GadgetToolTip(#btnDebug,"Récupère le texte de l'éditeur courant et l'affiche dans 'MainEditor'")
ButtonGadget(#btnClose,105,5,100,25,"Fermer") : GadgetToolTip(#btnClose,"Ferme l'onglet courant et supprime l'éditeur de la liste")
ButtonGadget(#btnNew,205,5,100,25,"Nouveau") : GadgetToolTip(#btnNew,"Ajoute un nouvel onglet et son éditeur")
ButtonGadget(#btnList,305,5,90,25,"Liste") : GadgetToolTip(#btnList,"Affiche la liste des n° d'éditeurs créés et disponibles dans la 'NewEditor()'")
PanelGadget(#Panel,0,35,400,150)
AddGadgetItem(#Panel, -1, "Onglet-"+Str(n)) ;Création premier onglet avec marqueur/numéroteur
NEditor = EditorGadget(#PB_Any,10,10,380,100,#PB_Editor_WordWrap) ;Création premier éditeur
AddElement(NewEditor()) : NewEditor() = NEditor : n+1 ;Ajout du nouveau gadget à la liste (n+1 ne sert qu'à la numérotation des onglets)
SetGadgetColor(NEditor, #PB_Gadget_BackColor, RGB(255, 250, 205)) ;Fond de couleur de l'éditeur
SetActiveGadget(NEditor) ;Activation de l'éditeur (focus)
CloseGadgetList()
;Editeur de contrôle
MainEditor = EditorGadget(#PB_Any,10,190,380,200,#PB_Editor_WordWrap)
;-Boucle d'évènements
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
Select EventGadget()
Case #btnDebug ;{
; juste une vérification mais peut être utilisé pour enregistrer le contenu de l'éditeur dans un fichier texte
panel = GetGadgetState(#Panel)
For i = 0 To ListSize(NewEditor())-1
If i = panel
*Element = SelectElement(NewEditor(), i)
;Ajoute les données dans l'éditeur de contrôle sous le panel
;pour vérifier que tout est bien récupéré du bon onglet et du bon éditeur
AddGadgetItem(MainEditor,-1,"Onglet n° : "+ Str(panel))
AddGadgetItem(MainEditor,-1,"Editeur n° : "+Str(NewEditor()))
AddGadgetItem(MainEditor,-1,"Texte = "+GetGadgetText(NewEditor()))
AddGadgetItem(MainEditor,-1,"----------------------------------------")
EndIf
Next
;}
Case #btnNew ;{
;(ajoute un nouvel onglet contenant un nouvel éditeur)
OpenGadgetList(#Panel)
AddGadgetItem (#Panel, -1, "Onglet-"+Str(n))
NEditor = EditorGadget(#PB_Any,10,10,380,100,#PB_Editor_WordWrap)
AddElement(NewEditor()) : NewEditor() = NEditor : n+1 ; Ajout du nouveau gadget à la liste (n+1 ne sert qu'à la numérotation des onglets)
SetGadgetColor(NEditor, #PB_Gadget_BackColor, RGB(255, 250, 205))
SetGadgetState(#Panel,GetGadgetState(#Panel)+1) ; on affiche le nouvel élément du panel
SetActiveGadget(NEditor) ;on active le nouvel éditeur
CloseGadgetList()
; Debug Str(NEditor)
; Debug "Il y a "+Str(ListSize(NewEditor()))+" éléments dans la liste"
; Debug "==========================="
;}
Case #btnClose ;{
;(ferme l'onglet actif et supprime l'éditeur de la liste sauf le premier ou '0')
panelitem = GetGadgetState(#Panel)
nbitems = CountGadgetItems(#Panel) : Debug Str(nbitems)
PreviousItem = GetGadgetState(#Panel)-1
If nbitems > 1 ; s'il y a plusieurs onglets ouverts
For i = 0 To ListSize(NewEditor())-1
If i = panelitem And panelitem <> 0
*Element = SelectElement(NewEditor(), i)
DeleteElement(NewEditor(), i) ; supprime l'éditeur correspondant de la liste
RemoveGadgetItem(#Panel, panelitem)
SetGadgetState(#Panel,PreviousItem) ;permet de sélectionner l'onglet juste avant celui qui a été supprimé
ElseIf i = panelitem And panelitem = 0 ; si l'onglet est le premier on le garde.
*Element = SelectElement(NewEditor(), i)
ClearGadgetItems(NewEditor()) ; nettoie l'éditeur du texte contenu mais le conserve
SetGadgetItemText(#Panel, panelitem, "<Nouveau>") ; renomme l'onglet
EndIf
Next
ElseIf nbitems = 1 ; s'il n'y a qu'un seul onglet ouvert on le garde
panelitem = GetGadgetState(#Panel)
For i = 0 To ListSize(NewEditor())-1
If i = panelitem And panelitem = 0
*Element = SelectElement(NewEditor(), i)
ClearGadgetItems(NewEditor())
SetGadgetItemText(#Panel, panelitem, "<Nouveau>")
EndIf
Next
EndIf
;}
Case #btnList ;{
;(juste pour voir les n° des EditorGadget() créés dans la liste...)
For i = 0 To ListSize(NewEditor())-1
SelectElement(NewEditor(), i)
Debug "Au PanelItem "+Str(i)+", l'éditeur est le n° "+Str(NewEditor())
Next
;}
EndSelect
EndIf
Until Event= #PB_Event_CloseWindow
End
;Si pour tester vous avez la flemme de taper du texte, utilisez 'Ctrl+c' pour copier un texte et 'Ctrl+v' pour le coller dans l'éditeur actif.