PanelGadget() + EditorGadget() mode Dynamique

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

PanelGadget() + EditorGadget() mode Dynamique

Message par Jacobus »

Bonjour tout le monde, je vous mets ça là si à tout hasard vous en avez l'utilité.
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. 
Salut les codeurs.
Dernière modification par Jacobus le sam. 14/sept./2024 17:18, modifié 2 fois.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: PanelGadget() + EditorGadget() mode Dynamique

Message par Jacobus »

J'ai apporté une modification au code (fonction du bouton #btnClose) en raison d'un plantage lors de la fermeture des onglets. En effet, si on fermait le premier (l'élément 0), l'éditeur attribué n'était plus initialisé. Avec la modification en fermant le premier onglet celui-ci est conservé et réinitialisé en <nouveau> ce qui supprime tout plantage. L'occasion d'utiliser PB v6.12LTS. Voilà c'est mieux :)
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: PanelGadget() + EditorGadget() mode Dynamique

Message par Micoute »

Merci Jacobus, c'est merveilleusement fait.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: PanelGadget() + EditorGadget() mode Dynamique

Message par Kwai chang caine »

Jolie fonction et surement utile à l'avenir
Marche bien ici, merci pour le partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre