Hello,
Le gadget TreeGadget() permet de créer des sous-niveau lors de la création d'un élément (AddGadgetItem(#Gadget, Position, Texte$ [, ImageID [, Options]])) où Option = niveau par rapport à la branche supérieure.
Une fois l'abre créé, la fonction GetGadgetItemAttribute() utilisée avec l'attribut #PB_Tree_SubLevel: Renvoie le sous-niveau actuel de l'élément dans l'arbre.
Cependant, cette fonction n'a pas son équivalent (SetGadgetItemAttribute()) pour redéfinir le sous-niveau
Actuellement deux solutions (sans API)
- Supprimer l'élément puis le re-créer avec le nouveau niveau
- Redessiner tout l'arbre
Pourrait-on modifier SetGadgetItemAttribute() pour qu'il concerne aussi le TreeGadget ?
TreeGadget() redéfinir le sous-niveau ?
Re: TreeGadget() redéfinir le sous-niveau ?
Bonjour Marc56, je ne sais plus de qui est ce programme source, mais il est très bien, je pense que c'est un code que j'ai "francisé".
Code : Tout sélectionner
Procedure.L Arbre(Action.L, Arbre.L, Clef.L, Racine.S)
Reaction.L = 0
ClefFinale.L = CountGadgetItems(Arbre) - 1
If Action <= 5
JeunesseClef.L = GetGadgetItemAttribute(Arbre, Clef, #PB_Tree_SubLevel)
Select Action
Case 0: Clef = - 1: JeunesseClef = 0
Case 1
For i = Clef To 0 Step - 1
Jeunesse = GetGadgetItemAttribute(Arbre, i, #PB_Tree_SubLevel)
If Jeunesse < JeunesseClef: Clef = i: i = 0
ElseIf Jeunesse = 0: Clef = - 1: i = 0: EndIf
Next i
Case 2, 3, 5
ClefFinale = CountGadgetItems(Arbre)
For i = Clef + 1 To ClefFinale
Jeunesse = GetGadgetItemAttribute(Arbre, i, #PB_Tree_SubLevel)
If Action = 5: If Jeunesse <= JeunesseClef: Clef = i - 1: i = ClefFinale: EndIf
ElseIf Action = 2: If Jeunesse > JeunesseClef: Clef = i: EndIf
If Jeunesse <= JeunesseClef: i = ClefFinale: EndIf
Else: If Jeunesse => JeunesseClef: Clef = i: EndIf
If Jeunesse < JeunesseClef: i = ClefFinale: EndIf
EndIf
Next
If Action = 5: JeunesseClef + 1: EndIf
Case 4: JeunesseClef + 1
EndSelect
AddGadgetItem(Arbre, Clef + 1, Racine, 0, JeunesseClef)
If Action = 4 Or Action = 5: SetGadgetItemState(Arbre, Clef, #PB_Tree_Expanded): EndIf
Else
Select Action
Case 8
Reaction.L = CreateFile(#PB_Any, Racine)
If Reaction <> 0
For i = 0 To ClefFinale
WriteLong(Reaction, GetGadgetItemAttribute(Arbre, i, #PB_Tree_SubLevel) )
WriteStringN(Reaction, GetGadgetItemText(Arbre, i, - 1) )
Next
EndIf
Case 9: Reaction = ReadFile(#PB_Any, Racine)
If Reaction <> 0: i = 0
Repeat
Level.L = ReadLong(Reaction)
String.s = ReadString(Reaction)
AddGadgetItem(Arbre, i, String, 0, Level): i + 1
Until Eof(Reaction)
EndIf
EndSelect
If IsFile(Reaction): CloseFile(Reaction): EndIf
ProcedureReturn Reaction
EndIf
EndProcedure
Global DSt.S = ""
DSt + "GFFGFFG8F0GDF68F0GBF68F770G4F7G1F8FG070G3F77FFF8FG078G4F7F888FG07866G3F77FFFG078"
DSt + "G06G3FG378F4G06G2FG278FFF4G06G2FG178G0F4G06G2FG078G1F4G06G2FG17G1F466G5FG07G1F46"
DSt + "GFF4GFFGFFGFFGFFG6FGBCFG09CG9ECFG09GBCF99GEF99FFGB7F99GD7F99FFGB7F99GEF99FFGB9FG"
DSt + "19G9B9FGF9FF7GFF7FFGB7FFGE7FF7FFGB7FF7GFF7FFGB7FFGE7G1FGB7GFFG2FGB7FFGE7FF7FFGB7"
DSt + "FF7GFF7FFGB7FFGE7FF7FFGB7FF7GFF7FFGB9FG19G9B9FGF9F99GEF99FFGBCFG09CG9ECFG09GBCFF"
DSt + "7GFF7FFGB7FFGE7G1FGB7GFFG2FGB7FFGE7FF7FFGB7FF7GFF7FFGB7FFGE7FF7FFGB7FF7GFF7FFGB9"
DSt + "FG19G9B9FGF9F99GEF99FFGB7F99GD7F99FFGB7F99GEF99FFGBCFG09CG9ECFG09GBCGFFFFGB9G1F9"
DSt + "G9B9G1FGB9G1F99GEF99FFFGACFG19CG8ECFG19GACFF7GFF7FFFGA7FFGE7FF7FFFGA7FF7GFF7FFFG"
DSt + "A7FFGE7FF7FFFGA7FF7GFF7FFFGA7FFGE7G2FGA7GFFFFGB9G1F9G9B9G1FGB9G1F99GEF99FFFGA7F9"
DSt + "9GD7F99FFFGA7F99GEF99FFFGA7F99GD7F99FFFGA7F99GEF99FFFGA7F99GD7F99FFFGA7F99GEF99F"
DSt + "FFGACFG19CG8ECFG19GACGFFFFG20G57000FFG20G170007G00FG20G170007G00FG20G170007G00FG"
DSt + "20G170007G00FG20G170007G00FG20G57G00FGF0F000G9F000F000G1F000G1F000F000G0F07F70G0"
DSt + "F000F000G0F7FF70G0F000F000G2F70G1F000F000G2F0G2F000F000G9F000F000G2F0G2F000F000G"
DSt + "2F7G2F000F0FGB0F0FGF0GFFGFFGFFGFFG6F00GDF0FF0GFFF0F0GEF00GDF000G6F000GCF0EEEG50G"
DSt + "3F0G7E0G3F0G7E0G3F0G7E0G3F0G0EG80FFF0EEE0G7E0FFF0EE0G7E0G0F0E0G7E0G1F00G7E0G2FG9"
DSt + "0GFFG4F"
Procedure.L ValHex(a.s)
x = Asc(a): If x < 58: S = x - 48: Else: S = x - 55: EndIf: ProcedureReturn S
EndProcedure
Procedure RecupIco()
Ico.S = ""
For i = 1 To Len(DSt): A.S = Mid(DSt, i, 1)
If A = "G": N.S = Mid(DSt, i + 1, 1)
A = Mid(DSt, i + 2, 1): For j = 1 To 4 + ValHex(N): Ico + A: Next: i + 2
Else: Ico + A
EndIf
Next: Adr = 0
For ix = 0 To 7
CreateImage(ix, 20, 20): StartDrawing(ImageOutput(ix) )
For y = 0 To 19
For x = 0 To 19
Adr + 1: Pt = ValHex(Mid(Ico, Adr, 1))
If Pt & 8: coef = 255: Else: coef = 128: EndIf
R =((Pt & 4) >> 2) * coef: V =((Pt & 2) >> 1) * coef: B =((Pt & 1) ) * coef
C = RGB(R, V, B): If Pt = 7: C = RGB(192, 192, 192): EndIf
If Pt = 8: C = RGB(128, 128, 128): EndIf: Plot(x, y, C)
Next
Next
StopDrawing()
Next
EndProcedure
Procedure Enreg(Gadget)
Repeat
Repeat
Name.S = SaveFileRequester("Enregistrer sous", "", "Tout type de fichier|*.*;Base de données|*.BDD", 1)
If Name = "": Goto ExitEnreg: EndIf
If 0 Or FileSize(Name) = - 2: MessageRequester("Message", "Nom de fichier invalide !", 0): EndIf
Until FileSize(Name) <> - 2
If FileSize(Name) <> - 1
Mess = MessageRequester("Message", "Le fichier " + Name + " existe déjà ! Voulez-vous l'écraser ?", #PB_MessageRequester_YesNoCancel)
If Mess = #PB_MessageRequester_Cancel: Goto ExitEnreg: EndIf
EndIf
Until FileSize(Name) = - 1 Or Mess = #PB_MessageRequester_Yes
Arbre(8, Gadget, 0, Name)
ExitEnreg:
EndProcedure
Procedure Charge(Gadget)
Name.S = OpenFileRequester("Ouvrir", "", "Tout type de fichier|*.*;Base de données|*.BDD", 1)
If FileSize(Name) < 0
MessageRequester("Message", "Nom de fichier incorrect ou inexistant !", 0)
Else
Arbre(9, Gadget, 0, Name)
EndIf
EndProcedure
;************************************************************************
; PREPARATION MENU
;************************************************************************
; On récupère les icônes
;************************
RecupIco()
; On crée la fenêtre du menu
;****************************
OpenWindow(0, 10, 10, 28, 28 * 8, "x", #PB_Window_BorderLess)
StickyWindow(0, 1)
HideWindow(0, 1)
; On crée les boutons du menu
;******************************
For i = 0 To 7
ButtonImageGadget(i, 0, 28 * i, 28, 28, ImageID(i) )
Next i
; On rajoute un peu d'aide
;**************************
GadgetToolTip(0, "Détruire l'arbre")
GadgetToolTip(1, "Crée une clé 'soeur ainée'")
GadgetToolTip(2, "Crée une clé 'soeur cadette'")
GadgetToolTip(3, "Crée une clé 'soeur benjamine'")
GadgetToolTip(4, "Crée une clé 'enfant ainé'")
GadgetToolTip(5, "Crée une clé 'enfant benjamin'")
GadgetToolTip(6, "Enregistrer sous")
GadgetToolTip(7, "Ouvrir")
;************************************************************************
;************************************************************************
;************************************************************************
; PREPARATION FENETRE PRINCIPALE
;************************************************************************
; On crée la fenêtre
;********************
OpenWindow(1, 0, 0, 400, 450, "Arbre", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
; On crée le TreeGadget
;***********************
Global Gadget = TreeGadget(- 1, 0, 0, 400, 450, #PB_Tree_AlwaysShowSelection)
LoadFont(0, "Verdana", 16, #PB_Font_Italic)
SetGadgetFont(Gadget, FontID(0) )
; On crée un menu PopUp
;***********************
CreatePopupMenu(0)
MenuItem(0, "Renommer")
MenuItem(1, "Supprimer")
; Derniers préparatifs
;**********************
Arbre(0, Gadget, 0, "(vide)")
SetGadgetState(Gadget, 0)
ResizeWindow(0, WindowX(1) - 30, WindowY(1) + 30, #PB_Ignore, #PB_Ignore)
HideWindow(0, 0)
;************************************************************************
;************************************************************************
; On fait une boucle d'événements
;*********************************
Global Modified.L = 0
Repeat
Ev = WaitWindowEvent()
Selected = GetGadgetState(Gadget)
Select Ev
Case #WM_RBUTTONDOWN
DisplayPopupMenu(0, WindowID(1) )
Case #PB_Event_Gadget
Gadg = EventGadget()
Select Gadg
Case 0: Nouv = 0
Arbre(0, Gadget, 0, "(vide_" + Str(Nouv) + ")"): Modified = 1
Case 1, 2, 3, 4, 5
; If Selected <> -1
; OldSelected = Selected
Nouv + 1
Arbre(Gadg, Gadget, Selected, "(vide_" + Str(Nouv) + ")"): Modified = 1
; Else
; Selected = OldSelected
; EndIf
Case 6
Enreg(Gadget)
Case 7
Charge(Gadget)
EndSelect
Case #PB_Event_Menu
Select EventMenu()
Case 0
SetGadgetItemText(Gadget, Selected, InputRequester("Renommer", "Entrez le nouveau nom :", GetGadgetItemText(Gadget, Selected, - 1) ), - 1 )
Modified = 1
Case 1
If MessageRequester("Confirmer", "Voulez-vous réellement supprimer " + GetGadgetItemText(Gadget, Selected, - 1) + " ?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
RemoveGadgetItem(Gadget, Selected): Modified = 1
If CountGadgetItems(Gadget) = 0
Arbre(0, Gadget, 0, "(vide)")
EndIf
EndIf
EndSelect
Case #PB_Event_SizeWindow
ResizeGadget(Gadget, 0, 0, WindowWidth(1), WindowHeight(1) )
Case #PB_Event_MoveWindow
ResizeWindow(0, WindowX(1) - 30, WindowY(1) + 30, #PB_Ignore, #PB_Ignore)
Case #PB_Event_CloseWindow
If Modified
Mess = MessageRequester("Message", "Le document n'a pas été enregistré. Souhaitez-vous le faire maintenant ?", #PB_MessageRequester_YesNoCancel)
Select Mess
Case #PB_MessageRequester_Yes
Enreg(Gadget)
Case #PB_MessageRequester_No
Quit = 1
EndSelect
Else
Quit = 1
EndIf
EndSelect
Until Quit = 1
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Un homme doit être poli, mais il doit aussi être libre !
Re: TreeGadget() redéfinir le sous-niveau ?
bon j'etais aussi dessus
voici une modification d'un code de Olivier
le menu contextuel (bouton droit de la souris ) , permet de creer des enfants,des freres, et .... de renommer !
voici une modification d'un code de Olivier
le menu contextuel (bouton droit de la souris ) , permet de creer des enfants,des freres, et .... de renommer !
Code : Tout sélectionner
; code : Olivier
; Purebasic 4.10
#Gad_Tree = 0
#Menu_TreeEdit = 0
#ItemIns_Enfant = 0
#ItemIns_Frere = 1
#ItemSuppr = 2
#ItemProper = 3
If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0) )
TreeGadget(#Gad_Tree, 10, 10, 340, 160)
AddGadgetItem(#Gad_Tree, 0, "Root", 0, 0)
;Boucle principale
CreatePopupMenu(#Menu_TreeEdit)
OpenSubMenu("Ajouter")
MenuItem(#ItemIns_Enfant, "Enfant")
MenuItem(#ItemIns_Frere, "Frere")
CloseSubMenu()
MenuItem(#ItemSuppr, "Enlever")
MenuItem(#ItemProper, "Renommer")
Else
End
EndIf
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #WM_RBUTTONDOWN
DisplayPopupMenu(0,WindowID(0))
Case #PB_Event_Menu
Select EventMenu()
Case #ItemIns_Enfant
; On vérif qu'il y a une sélection /!\ Important : Merci Flype :)
If GetGadgetState(#Gad_Tree) <> -1
; On récup la sélection
item = GetGadgetState(#Gad_Tree)
; On récup alors le niveau de la sélection
ItemNiveau = GetGadgetItemAttribute(#Gad_Tree, item, #PB_Tree_SubLevel)
; On mémorise le total: à 2 fois ça servira
ExitFor = CountGadgetItems(#Gad_Tree)
; On va rechercher l'enfant cadet
For i = item + 1 To ExitFor
TestNiveau = GetGadgetItemAttribute(#Gad_Tree, i, #PB_Tree_SubLevel)
; Dès qu'on trouve un frère, un tonton ou autre...
If TestNiveau <= ItemNiveau
; On signale que le cadet était juste avant
item = i - 1
; Et on arrête de chercher
i = ExitFor
EndIf
Next i
; On rajoute le bébé!
AddGadgetItem(#Gad_Tree, item + 1, "Root"+ Str(n), 0, ItemNiveau + 1)
; Et on ouvre la famille
SetGadgetItemState(#Gad_Tree, item, #PB_Tree_Expanded)
n + 1 ; ça ça sert pas à grand chose, juste pour écrire "Root n"
EndIf
Case #ItemIns_Frere
; On vérif qu'il y a une sélection
If GetGadgetState(#Gad_Tree) <> -1
; On récup la sélection
item = GetGadgetState(#Gad_Tree)
; On récup alors le niveau de la sélection
ItemNiveau = GetGadgetItemAttribute(#Gad_Tree, item, #PB_Tree_SubLevel)
; On mémorise le total: à 2 fois ça servira
ExitFor = CountGadgetItems(#Gad_Tree)
; On va rechercher le dernier des descendants, neveux compris
For i = item + 1 To ExitFor
TestNiveau = GetGadgetItemAttribute(#Gad_Tree, i, #PB_Tree_SubLevel)
;Si c'est un frère, un fils, un neveu...
If TestNiveau => ItemNiveau
; On le mémorise au cas où ce soit le dernier
item = i
EndIf
;Si c'est un tonton ou autre parent germain, recherche achevée
If TestNiveau < ItemNiveau
i = ExitFor
EndIf
Next i
; On insère le nouveau frère cadet
AddGadgetItem(#Gad_Tree, item + 1, "Root"+Str(n), 0, ItemNiveau)
n + 1 ; ça ça sert pas à grand chose, juste pour écrire "Root n"
EndIf
Case #ItemSuppr
If GetGadgetState(#Gad_Tree) <> -1
; On récup la sélection
item = GetGadgetState(#Gad_Tree)
; On lui pete la gueule
RemoveGadgetItem(#Gad_Tree, item)
n + 1 ; ça ça sert pas à grand chose, juste pour écrire "Root n"
EndIf
Case #ItemProper
; by Zorro
If GetGadgetState(#Gad_Tree) <> -1
; On récup la sélection
item = GetGadgetState(#Gad_Tree)
debug item
ItemNiveau = GetGadgetItemAttribute(#Gad_Tree,item, #PB_Tree_SubLevel)
debug ItemNiveau
Resultat$ = GetGadgetItemText(#Gad_Tree,item )
nouveau_nom$=InputRequester("entrez un nom","entrez un nom","Toto")
SetGadgetItemText(#Gad_Tree, item, nouveau_nom$)
EndIf
EndSelect
EndSelect
ForEver
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Re: TreeGadget() redéfinir le sous-niveau ?
Bonjour à toi aussi Zorro, je crois bien que le code que j'ai envoyé est du même auteur.
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Un homme doit être poli, mais il doit aussi être libre !
Re: TreeGadget() redéfinir le sous-niveau ?
ben pour une fois qu'on lui rend homage, il va pas raler
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Re: TreeGadget() redéfinir le sous-niveau ?
Je remet ça up (2016) si jamais l'équipe cherche des petites finitions à faire au langage...
https://www.purebasic.fr/french/viewtop ... 97#p187597
Pourquoi GetGadgetItemAttribute() n'a-t-il pas son opposé ? SetGadgetItemAttribute()
Même si la fonction ne redessine pas directement l'arbre, ce serait bien de pouvoir changer la valeur (#PB_Tree_SubLevel) directement.
Car c'est quand même un peu bidouille de devoir supprimer puis recréer un élément dans un Tree quand on veut simplement changer le niveau horizontal. (#PB_Tree_SubLevel).
Dans mon applis (en cours: treenote2 SQL), je créé un nouvel éléments, copie l'itemdata (qui me sert d'ID SQL), change le niveau, insère la nouvelle branche et supprime l'ancienne.
Avec un SetGadgetItemAttribute(), il suffirait de changer #PB_Tree_SubLevel puis redessiner tout l'arbre.
https://www.purebasic.fr/french/viewtop ... 97#p187597
Pourquoi GetGadgetItemAttribute() n'a-t-il pas son opposé ? SetGadgetItemAttribute()
Même si la fonction ne redessine pas directement l'arbre, ce serait bien de pouvoir changer la valeur (#PB_Tree_SubLevel) directement.
Car c'est quand même un peu bidouille de devoir supprimer puis recréer un élément dans un Tree quand on veut simplement changer le niveau horizontal. (#PB_Tree_SubLevel).
Dans mon applis (en cours: treenote2 SQL), je créé un nouvel éléments, copie l'itemdata (qui me sert d'ID SQL), change le niveau, insère la nouvelle branche et supprime l'ancienne.
Avec un SetGadgetItemAttribute(), il suffirait de changer #PB_Tree_SubLevel puis redessiner tout l'arbre.
Re: TreeGadget() redéfinir le sous-niveau ?
Alors là, je te soutiens totalement. Je trouve ce gadget hyper mal fichu, même si fonctionnel. Je pense que Fred n'a pas le temps de rentrer dans son détail, il faudrait que quelqu'un qui aime les IU se penche là-dessus pour nous pondre quelque chose de plus pratique et de plus complet. Le plus gros souci, c'est le multiplateformes.