Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Simulation d'un objet TreeView | |
| | |
Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Simulation d'un objet TreeView Mer 5 Déc 2012 - 0:41 | |
| Je suis en train de réaliser un objet TreeView en Panoramic pur, sans recours à une DLL. Pour le moment, je peux: - créer un objet TreeView (prenant deux objets Panoramic) - créer la racine - ajouter une ligne "enfant" en spécifiant l'indexe de la ligne d'attachement D'autres fonctions suivront. En création, l'arborescence est dépliée. Les noeuds ayant des lignes enfant portent le préfixe [-] si le noeud est déplié, et [+] si le noeud est plié. Un clic sur une ligne la sélectionne. Si l'on clique sur une marque [-] ou [+], le programme reconnaît l'action demandée et affiche ce qu'il y a à faire (replier ou déplier), mais cette action reste encore à implémenter. C'est en cours. Donc, voici une première maquette: - Code:
-
' treeview.bas
label click
dim x%, n%, a%, b%, s$, i%, n1%, flag%, a1$, a2$, n2%, n3%, s1$ dim ldet%, nsect%, lorg%, sind%, nindex%, niveau1%, niveau2%, niveau3% dim chk% : chk% = 0 dim montrer% : montrer% = 0
width 0,800 CreateTreeViewObject(1,10,10,300,300) on_click 1,click CreateTreeViewRoot(TVO,"Racine") niveau1% = 1
AddTreeViewChildByIndex(TVO,niveau1%,"aaaa") niveau2% = AddTreeViewChildByIndex
AddTreeViewChildByIndex(TVO,niveau2%,"a1111111111") AddTreeViewChildByIndex(TVO,niveau2%,"a2222222222") AddTreeViewChildByIndex(TVO,niveau1%,"bbbb") AddTreeViewChildByIndex(TVO,niveau1%,"cccc") niveau2% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau2%,"11111111") AddTreeViewChildByIndex(TVO,niveau2%,"22222222") niveau3% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau3%,"2aaaaaaaaa") AddTreeViewChildByIndex(TVO,niveau3%,"2bbbbbbbbb") AddTreeViewChildByIndex(TVO,niveau2%,"33333333") AddTreeViewChildByIndex(TVO,niveau2%,"44444444") niveau3% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau3%,"4aaaaaaaaa") AddTreeViewChildByIndex(TVO,niveau3%,"4bbbbbbbbb") AddTreeViewChildByIndex(TVO,niveau1%,"dddd") niveau2% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau2%,"d11111111") AddTreeViewChildByIndex(TVO,niveau2%,"d22222222")
end
' positionnement des [+] ' niveau 1: 5...22 ==> 17 ' niveau 2: 37...54 ==> 17 ' niveau 3: 69...86 ==> 17 ' niveau n: a...b n=int((x-5+32)/32) a = (n-1)*32+5 b=a+17 click: x% = mouse_x_left_down(1) n% = int((x%-5+32)/32) a% = (n%-1)*32 + 5 b% = a% + 16 s$ = item_index$(1) CalculateLineLevel(s$) CalculateTreeViewLevelVector(item_index(1)) n1% = TVO_levels%(0) s$ = item_index$(1) ' message "click: ind="+str$(item_index(1))+" x="+str$(x%)+" a="+str$(a%)+" b="+str$(b%)+" n1="+str$(n1%)+" s$="+s$ flag% = 0 if n%=n1% if mid$(s$,(n%-1)*4+2,1)="+" then flag% = 1 if mid$(s$,(n%-1)*4+2,1)="-" then flag% = 2 end_if ' dump("0") select flag% ' on a sélectionné une ligne case 0: message "Ligne "+str$(item_index(1))+" niveau "+str$(n%) ' on veut déplier une ligne ayant des lignes enfant case 1: message "déplier ligne "+str$(item_index(1))+" niveau "+str$(n%) ' on veut replier une ligne pour escamoter ses enfants case 2: message "replier ligne "+str$(item_index(1))+" niveau "+str$(n%) end_select return
' determiner le niveau d'une ligne dans la section sub CalculateLineLevel(s$) dim_local i% i% = 1 while mid$(s$,i%,1)=" " i% = i% + 1 end_while if mid$(s$,i%,1)<>"[" then i% = i% - 4 i% = i% - 1 n1% = i%/4 + 1 end_sub
' déterminer le vecteur des niveaux imbriqués sub CalculateTreeViewLevelVector(ind%) TVO_levels%(0) = 0 i% = ind% CalculateLineLevel(s$)
while n1%>1 ldet% = 0 n2% = n1% if n2%>1 TVO_indexes%(TVO_levels%(0)+1) = i% while n1%>=n2% if n1%=n2% then ldet% = ldet% + 1 i% = i% - 1 s$ = item_read$(1,i%) CalculateLineLevel(s$) end_while TVO_levels%(0) = TVO_levels%(0) + 1 TVO_levels%(TVO_levels%(0)) = ldet% end_if end_while TVO_levels%(0) = TVO_levels%(0) + 1 TVO_levels%(TVO_levels%(0)) = 1 TVO_indexes%(TVO_levels%(0)) = 1 end_sub
sub CreateTreeViewObject(no%,t%,l%,w%,h%) if (object_exists(no%)+object_exists(no%+1))>0 message "TreeView - error 1" exit_sub end_if if variable("TVO")=0 then dim TVO if variable("TVO_levels%")=0 then dim TVO_levels%(50) if variable("TVO_indexes%")=0 then dim TVO_indexes%(50) if variable("TVO_sources%")=0 then dim TVO_sources%(50)
TVO = no% list TVO : top TVO,t% : left TVO,l% width TVO,w% : height TVO,h% font_name TVO,"Courier" if montrer%=0 dlist no%+1 else list TVO+1 : top TVO+1,t% : left TVO+1,l%+w%+10 width TVO+1,w% : height TVO+1,h% font_name TVO+1,"Courier" end_if end_sub
sub CreateTreeViewRoot(o,txt$) if count(o)>0 message "TreeView - error 2" exit_sub end_if item_add o," "+txt$ item_add o+1," "+txt$ end_sub
sub AddTreeViewChildByIndex(o,ind%,txt$) if variable("AddTreeViewChildByIndex")=0 then dim AddTreeViewChildByIndex dim_local a$, index%, n2% if ind%>count(o) message "TreeView - error 3" exit_sub end_if i% = ind% s$ = item_read$(o,i%) if chk%=1 then message "AddTreeViewChildByIndex 1: i%="+str$(i%)+" s$="+s$ CalculateLineLevel(s$) if chk%=1 then message "AddTreeViewChildByIndex 1: n1="+str$(n1%)+" s$=["+s$+"]" n2% = n1% CalculateTreeViewLevelVector(ind%) if chk%=1 then dump("1 "+str$(ind%)) FindTreeViewSource(o) if chk%=1 then dump("2 "+str$(ind%)) FindTreeViewEndLevel(o,n2%) if chk%=1 then dump("3 "+str$(ind%)) index% = TVO_indexes%(1) if chk%=1 then message "index%="+str$(index%) s$ = item_read$(o,index%) a$ = mid$(s$,(n2%-1)*4+1,3) CalculateLineLevel(s$) ' message "xxx: index="+str$(index%)+" a$="+a$+" s$="+s$+" txt$="+txt$
if a$="[+]" message "déplier" end_if if (a$=" ") or (a$="[-]") ' message "D: n2="+str$(n2%)+" index%="+str$(index%)+" s$="+s$+" a$="+a$+" "+txt$ if (a$=" ") and (n1%=n2%) s$ = item_read$(o+1,index%) item_delete o,index% s1$ = "" if n2%>1 then s1$ = string$((n2%-1)*4," ") item_insert o,index%,s1$+"[-] "+trim$(s$) end_if item_insert o,index%+1,string$(n2%*4," ")+" "+txt$ AddTreeViewChildByIndex = index%+1 index% = TVO_sources%(1) if a$=" " and (n1%=n2%) s$ = item_read$(o+1,index%) item_delete o+1,index% s1$ = "" if n2%>1 then s1$ = string$((n2%-1)*4," ") item_insert o+1,index%,s1$+"[-] "+trim$(s$) end_if item_insert o+1,index%+1,string$(n2%*4," ")+" "+txt$ end_if end_sub
sub AddTreeViewChildByVector(o,ind%)
end_sub
sub FindTreeViewSource(o) dim_local k%, n%, s$ sind% = 1 s$ = item_read$(o+1,sind%) CalculateLineLevel(s$) if chk%=1 then message "A1: sind="+str$(sind%)+" n1="+str$(n1%)+" "+s$+" "+str$(TVO_levels%(0)) for k%=TVO_levels%(0) to 1 step -1 n% = TVO_levels%(k%) if chk%=1 then message "A2: sind="+str$(sind%)+" k="+str$(k%)+" n="+str$(n%) while n%>1 sind% = sind% + 1 s$ = item_read$(o+1,sind%) CalculateLineLevel(s$) if chk%=1 then message "A3: sind="+str$(sind%)+" n="+str$(n%)+" k="+str$(k%)+" n1="+str$(n1%)+" "+s$+" "+str$(TVO_levels%(0)) if n1%=(TVO_levels%(0)+1-k%) then n% = n% - 1 end_while TVO_sources%(k%) = sind% sind% = sind% + 1 next k% if chk%=1 then message "A4: Source: sind="+str$(sind%)+" niveau="+str$(n1%)+" "+s$ end_sub
sub FindTreeViewEndLevel(o,nx%) dim_local s$, k%, l% k% = TVO_sources%(1) while k%<count(o+1) k% = k% + 1 l% = l% + 1 s$ = item_read$(o+1,k%) CalculateLineLevel(s$) if n1%<nx% ' message "A: k="+str$(k%)+" l="+str$(l%) TVO_sources%(1) = k% TVO_levels%(1) = TVO_levels%(1) + l% TVO_indexes%(1) = TVO_indexes%(1) + l% ' dump("A") exit_sub end_if end_while ' message "B: k="+str$(k%)+" l="+str$(l%) TVO_sources%(1) = k% TVO_levels%(1) = TVO_levels%(1) + l% TVO_indexes%(1) = TVO_indexes%(1) + l% ' dump("B") end_sub
sub dump(t$) message t$+": niveaux: "+str$(TVO_levels%(0))+","+str$(TVO_levels%(1))+","+str$(TVO_levels%(2))+","+str$(TVO_levels%(3)) message t$+": indices: "+str$(TVO_indexes%(0))+","+str$(TVO_indexes%(1))+","+str$(TVO_indexes%(2))+","+str$(TVO_indexes%(3)) message t$+": sources: "+str$(TVO_sources%(0))+","+str$(TVO_sources%(1))+","+str$(TVO_sources%(2))+","+str$(TVO_sources%(3)) end_sub
| |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 4:51 | |
| Interessant Klaus ! Lors du premier appel à AddTreeViewChildByIndex la valeur de retour est égale à 0 ce qui fait que lorsque tu cherches à insérer le 2em item, l'index étant nul (niveau2%=0), le programme s'arrête sur cette ligne: s$ = item_read$(o,i%) EDIT :J'ai trouvé : Lors du 1er passage, AddTreeViewChildByIndex n'est pas affecté... je ne sais pas si c'est un bug lié au forum (il n'aime pas les espaces) mais il manque un espace dans le test sur a$ (j'en ai 2 alors qu'il en faut 3) if (a$=" ") or (a$="[-]")Les préfixes n'apparaissent pas pour les même raisons... if a$=" " and (n1%=n2%) | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 7:18 | |
| Beau boulot ça pourra servir aussi bien pour la dbr que pour les arborescence de fichiers, etc ... Merci Klaus | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 8:25 | |
| Bonjour panoramiciens, @Jicehel, C'est sur que ça pourrait servir pour les arborescences de fichier, mais je pense que Klaus a fait ceci dans le but de faire son logiciel de généalogie comme il a dit il y a quelques temps déjà. Je pense qu'il veut avec un "+" déplier par exemple une branche d'un ancètre afin d'y voir toute sa descendance et y modifier des informations par simple click sur la personne sélectionnée. Enfin, je me trompe peut-être, ce n'est qu'une supposition. En tout cas, cette ébauche de programme, ouvre pas mal de possibilités! A+ | |
| | | Francis-mr
Nombre de messages : 186 Date d'inscription : 26/11/2012
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 9:11 | |
| Bonjour à tous,
Pardonnez ma jeunesse en Panoramic qui m'amène à poser cette question, mais ce projet de Klaus "Simulation d'un objet TreeView" est en pur Panoramic version 0.9.23 ? Car je n'arrive pas à le faire tourner.
Bonne journée | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 9:39 | |
| | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 9:55 | |
| Bonjour à tous ! - Francis-mr a écrit:
- Bonjour à tous,
Pardonnez ma jeunesse en Panoramic qui m'amène à poser cette question, mais ce projet de Klaus "Simulation d'un objet TreeView" est en pur Panoramic version 0.9.23 ? Car je n'arrive pas à le faire tourner. Bonne journée Je te conseille de faire une mise à jour en récupérant la dernière version (voir ici). C'est un fichier ZIP qui contient l'executable PANORAMIC.EXE que tu dois mettre à la place de celui que tu as actuellement. Pour l'instant le programme de Klaus n'est qu'une ébauche donc c'est normal que tu ne vois pas grand chose. Si le programme plante c'est que tu n'as pas rajouté les espaces comme je l'ai indiqué au dessus.... | |
| | | Francis-mr
Nombre de messages : 186 Date d'inscription : 26/11/2012
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 10:13 | |
| Merci Nardo, Avec cette version, même si ce programme est qu'une ébauche, ça marche mieux. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 10:17 | |
| @Klaus: il y a quelques temps j'avais déjà réfléchi la chose et j'avais pondu quelques trucs en vrac...malheureusement je n'ai jamais eu le temps pour poursuivre le développement.... Si ça peut t'inspirer : EDIT: tu peux rajouter par exemple dans l'attribut, un flag t'indiquant si le dossier est plié ou déplié...
Dernière édition par Nardo26 le Mer 5 Déc 2012 - 12:48, édité 2 fois (Raison : ortograffe) | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 11:37 | |
| Merci, Nardo. Effectivement, he me suis laissé piéger par le problème des espaces qui disparaissent lors du post sur le forum. J'ai remplacé les 3 espaces par une variable sp3$: - Code:
-
' treeview.bas
label click
dim x%, n%, a%, b%, s$, i%, n1%, flag%, a1$, a2$, n2%, n3%, s1$ dim ldet%, nsect%, lorg%, sind%, nindex%, niveau1%, niveau2%, niveau3% dim chk% : chk% = 0 dim montrer% : montrer% = 0
width 0,800 CreateTreeViewObject(1,10,10,300,300) on_click 1,click CreateTreeViewRoot(TVO,"Racine") niveau1% = 1
AddTreeViewChildByIndex(TVO,niveau1%,"aaaa") niveau2% = AddTreeViewChildByIndex
AddTreeViewChildByIndex(TVO,niveau2%,"a1111111111") AddTreeViewChildByIndex(TVO,niveau2%,"a2222222222") AddTreeViewChildByIndex(TVO,niveau1%,"bbbb") AddTreeViewChildByIndex(TVO,niveau1%,"cccc") niveau2% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau2%,"11111111") AddTreeViewChildByIndex(TVO,niveau2%,"22222222") niveau3% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau3%,"2aaaaaaaaa") AddTreeViewChildByIndex(TVO,niveau3%,"2bbbbbbbbb") AddTreeViewChildByIndex(TVO,niveau2%,"33333333") AddTreeViewChildByIndex(TVO,niveau2%,"44444444") niveau3% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau3%,"4aaaaaaaaa") AddTreeViewChildByIndex(TVO,niveau3%,"4bbbbbbbbb") AddTreeViewChildByIndex(TVO,niveau1%,"dddd") niveau2% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau2%,"d11111111") AddTreeViewChildByIndex(TVO,niveau2%,"d22222222")
end
' positionnement des [+] ' niveau 1: 5...22 ==> 17 ' niveau 2: 37...54 ==> 17 ' niveau 3: 69...86 ==> 17 ' niveau n: a...b n=int((x-5+32)/32) a = (n-1)*32+5 b=a+17 click: x% = mouse_x_left_down(1) n% = int((x%-5+32)/32) a% = (n%-1)*32 + 5 b% = a% + 16 s$ = item_index$(1) CalculateLineLevel(s$) CalculateTreeViewLevelVector(item_index(1)) n1% = TVO_levels%(0) s$ = item_index$(1) ' message "click: ind="+str$(item_index(1))+" x="+str$(x%)+" a="+str$(a%)+" b="+str$(b%)+" n1="+str$(n1%)+" s$="+s$ flag% = 0 if n%=n1% if mid$(s$,(n%-1)*4+2,1)="+" then flag% = 1 if mid$(s$,(n%-1)*4+2,1)="-" then flag% = 2 end_if ' dump("0") select flag% ' on a sélectionné une ligne case 0: message "Ligne "+str$(item_index(1))+" niveau "+str$(n%) ' on veut déplier une ligne ayant des lignes enfant case 1: message "déplier ligne "+str$(item_index(1))+" niveau "+str$(n%) ' on veut replier une ligne pour escamoter ses enfants case 2: message "replier ligne "+str$(item_index(1))+" niveau "+str$(n%) end_select return
' determiner le niveau d'une ligne dans la section sub CalculateLineLevel(s$) dim_local i% i% = 1 while mid$(s$,i%,1)=" " i% = i% + 1 end_while if mid$(s$,i%,1)<>"[" then i% = i% - 4 i% = i% - 1 n1% = i%/4 + 1 end_sub
' déterminer le vecteur des niveaux imbriqués sub CalculateTreeViewLevelVector(ind%) TVO_levels%(0) = 0 i% = ind% CalculateLineLevel(s$)
while n1%>1 ldet% = 0 n2% = n1% if n2%>1 TVO_indexes%(TVO_levels%(0)+1) = i% while n1%>=n2% if n1%=n2% then ldet% = ldet% + 1 i% = i% - 1 s$ = item_read$(1,i%) CalculateLineLevel(s$) end_while TVO_levels%(0) = TVO_levels%(0) + 1 TVO_levels%(TVO_levels%(0)) = ldet% end_if end_while TVO_levels%(0) = TVO_levels%(0) + 1 TVO_levels%(TVO_levels%(0)) = 1 TVO_indexes%(TVO_levels%(0)) = 1 end_sub
sub CreateTreeViewObject(no%,t%,l%,w%,h%) if (object_exists(no%)+object_exists(no%+1))>0 message "TreeView - error 1" exit_sub end_if if variable("TVO")=0 then dim TVO if variable("TVO_levels%")=0 then dim TVO_levels%(50) if variable("TVO_indexes%")=0 then dim TVO_indexes%(50) if variable("TVO_sources%")=0 then dim TVO_sources%(50)
TVO = no% list TVO : top TVO,t% : left TVO,l% width TVO,w% : height TVO,h% font_name TVO,"Courier" if montrer%=0 dlist no%+1 else list TVO+1 : top TVO+1,t% : left TVO+1,l%+w%+10 width TVO+1,w% : height TVO+1,h% font_name TVO+1,"Courier" end_if end_sub
sub CreateTreeViewRoot(o,txt$) if count(o)>0 message "TreeView - error 2" exit_sub end_if item_add o," "+txt$ item_add o+1," "+txt$ end_sub
sub AddTreeViewChildByIndex(o,ind%,txt$) if variable("AddTreeViewChildByIndex")=0 then dim AddTreeViewChildByIndex dim_local a$, index%, n2% if ind%>count(o) message "TreeView - error 3" exit_sub end_if i% = ind% s$ = item_read$(o,i%) if chk%=1 then message "AddTreeViewChildByIndex 1: i%="+str$(i%)+" s$="+s$ CalculateLineLevel(s$) if chk%=1 then message "AddTreeViewChildByIndex 1: n1="+str$(n1%)+" s$=["+s$+"]" n2% = n1% CalculateTreeViewLevelVector(ind%) if chk%=1 then dump("1 "+str$(ind%)) FindTreeViewSource(o) if chk%=1 then dump("2 "+str$(ind%)) FindTreeViewEndLevel(o,n2%) if chk%=1 then dump("3 "+str$(ind%)) index% = TVO_indexes%(1) if chk%=1 then message "index%="+str$(index%) s$ = item_read$(o,index%) a$ = mid$(s$,(n2%-1)*4+1,3) CalculateLineLevel(s$) ' message "xxx: index="+str$(index%)+" a$="+a$+" s$="+s$+" txt$="+txt$
if a$="[+]" message "déplier" end_if if (a$=" ") or (a$="[-]") ' message "D: n2="+str$(n2%)+" index%="+str$(index%)+" s$="+s$+" a$="+a$+" "+txt$ if (a$=" ") and (n1%=n2%) s$ = item_read$(o+1,index%) item_delete o,index% s1$ = "" if n2%>1 then s1$ = string$((n2%-1)*4," ") item_insert o,index%,s1$+"[-] "+trim$(s$) end_if item_insert o,index%+1,string$(n2%*4," ")+" "+txt$ AddTreeViewChildByIndex = index%+1 index% = TVO_sources%(1) if a$=" " and (n1%=n2%) s$ = item_read$(o+1,index%) item_delete o+1,index% s1$ = "" if n2%>1 then s1$ = string$((n2%-1)*4," ") item_insert o+1,index%,s1$+"[-] "+trim$(s$) end_if item_insert o+1,index%+1,string$(n2%*4," ")+" "+txt$ end_if end_sub
sub AddTreeViewChildByVector(o,ind%)
end_sub
sub FindTreeViewSource(o) dim_local k%, n%, s$ sind% = 1 s$ = item_read$(o+1,sind%) CalculateLineLevel(s$) if chk%=1 then message "A1: sind="+str$(sind%)+" n1="+str$(n1%)+" "+s$+" "+str$(TVO_levels%(0)) for k%=TVO_levels%(0) to 1 step -1 n% = TVO_levels%(k%) if chk%=1 then message "A2: sind="+str$(sind%)+" k="+str$(k%)+" n="+str$(n%) while n%>1 sind% = sind% + 1 s$ = item_read$(o+1,sind%) CalculateLineLevel(s$) if chk%=1 then message "A3: sind="+str$(sind%)+" n="+str$(n%)+" k="+str$(k%)+" n1="+str$(n1%)+" "+s$+" "+str$(TVO_levels%(0)) if n1%=(TVO_levels%(0)+1-k%) then n% = n% - 1 end_while TVO_sources%(k%) = sind% sind% = sind% + 1 next k% if chk%=1 then message "A4: Source: sind="+str$(sind%)+" niveau="+str$(n1%)+" "+s$ end_sub
sub FindTreeViewEndLevel(o,nx%) dim_local s$, k%, l% k% = TVO_sources%(1) while k%<count(o+1) k% = k% + 1 l% = l% + 1 s$ = item_read$(o+1,k%) CalculateLineLevel(s$) if n1%<nx% ' message "A: k="+str$(k%)+" l="+str$(l%) TVO_sources%(1) = k% TVO_levels%(1) = TVO_levels%(1) + l% TVO_indexes%(1) = TVO_indexes%(1) + l% ' dump("A") exit_sub end_if end_while ' message "B: k="+str$(k%)+" l="+str$(l%) TVO_sources%(1) = k% TVO_levels%(1) = TVO_levels%(1) + l% TVO_indexes%(1) = TVO_indexes%(1) + l% ' dump("B") end_sub
sub dump(t$) message t$+": niveaux: "+str$(TVO_levels%(0))+","+str$(TVO_levels%(1))+","+str$(TVO_levels%(2))+","+str$(TVO_levels%(3)) message t$+": indices: "+str$(TVO_indexes%(0))+","+str$(TVO_indexes%(1))+","+str$(TVO_indexes%(2))+","+str$(TVO_indexes%(3)) message t$+": sources: "+str$(TVO_sources%(0))+","+str$(TVO_sources%(1))+","+str$(TVO_sources%(2))+","+str$(TVO_sources%(3)) end_sub
Pour Francis-mr, je précise que la V0.23 n'est pas suffisante. Il faut avoir accès aux procédures et à la commande EXIT_SUB. Donc, je conseille fortement d'installer la dernière version instantanée V0.24i7 qui marche très bien. Elle est disponible ici.Mon objectif derrière ce développement ? Il n'y en a pas qu'un. effectivement, cela pourra servir pour le logiciel de généalogie (dans lequel j'ai résolu d'ailleurs le problème des mariages multiples, y compris de multiples remariages avec la même personne). Mais cela pourra servir aussi à faire un sélecteur de fichiers dans le style de celyi de l'explorateur, pour gérer des notes, morceaux de source etx, bref tout ce qu'on pourrait organiser en structure arborescente. Cela m'a manqué à plusieurs reprises, et j'ai décidé de prendrfe le problème à bras le corps. Et tout sera en Panoramic pur, sans l'aide d'une DLL, juste des procédures pour gérer les différentes fonctions/ | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 11:50 | |
| La dernière version de Klaus avec le sp3$.... - Code:
-
' treeview.bas dim sp3$:sp3$=STRING$(3," "): ' comme ça on est pas embeté... ;)
label click
dim x%, n%, a%, b%, s$, i%, n1%, flag%, a1$, a2$, n2%, n3%, s1$ dim ldet%, nsect%, lorg%, sind%, nindex%, niveau1%, niveau2%, niveau3% dim chk% : chk% = 0 dim montrer% : montrer% = 0
width 0,800 CreateTreeViewObject(1,10,10,300,300) on_click 1,click CreateTreeViewRoot(TVO,"Racine") niveau1% = 1
AddTreeViewChildByIndex(TVO,niveau1%,"aaaa") niveau2% = AddTreeViewChildByIndex
AddTreeViewChildByIndex(TVO,niveau2%,"a1111111111") AddTreeViewChildByIndex(TVO,niveau2%,"a2222222222") AddTreeViewChildByIndex(TVO,niveau1%,"bbbb") AddTreeViewChildByIndex(TVO,niveau1%,"cccc") niveau2% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau2%,"11111111") AddTreeViewChildByIndex(TVO,niveau2%,"22222222") niveau3% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau3%,"2aaaaaaaaa") AddTreeViewChildByIndex(TVO,niveau3%,"2bbbbbbbbb") AddTreeViewChildByIndex(TVO,niveau2%,"33333333") AddTreeViewChildByIndex(TVO,niveau2%,"44444444") niveau3% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau3%,"4aaaaaaaaa") AddTreeViewChildByIndex(TVO,niveau3%,"4bbbbbbbbb") AddTreeViewChildByIndex(TVO,niveau1%,"dddd") niveau2% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau2%,"d11111111") AddTreeViewChildByIndex(TVO,niveau2%,"d22222222")
end
' positionnement des [+] ' niveau 1: 5...22 ==> 17 ' niveau 2: 37...54 ==> 17 ' niveau 3: 69...86 ==> 17 ' niveau n: a...b n=int((x-5+32)/32) a = (n-1)*32+5 b=a+17 click: x% = mouse_x_left_down(1) n% = int((x%-5+32)/32) a% = (n%-1)*32 + 5 b% = a% + 16 s$ = item_index$(1) CalculateLineLevel(s$) CalculateTreeViewLevelVector(item_index(1)) n1% = TVO_levels%(0) s$ = item_index$(1) ' message "click: ind="+str$(item_index(1))+" x="+str$(x%)+" a="+str$(a%)+" b="+str$(b%)+" n1="+str$(n1%)+" s$="+s$ flag% = 0 if n%=n1% if mid$(s$,(n%-1)*4+2,1)="+" then flag% = 1 if mid$(s$,(n%-1)*4+2,1)="-" then flag% = 2 end_if
' dump("0") select flag% ' on a sélectionné une ligne case 0: message "Ligne "+str$(item_index(1))+" niveau "+str$(n%) ' on veut déplier une ligne ayant des lignes enfant case 1: message "déplier ligne "+str$(item_index(1))+" niveau "+str$(n%) ' on veut replier une ligne pour escamoter ses enfants case 2: message "replier ligne "+str$(item_index(1))+" niveau "+str$(n%) end_select
return
' determiner le niveau d'une ligne dans la section sub CalculateLineLevel(s$) dim_local i% i% = 1 while mid$(s$,i%,1)=" " i% = i% + 1 end_while if mid$(s$,i%,1)<>"[" then i% = i% - 4 i% = i% - 1 n1% = i%/4 + 1 end_sub
' déterminer le vecteur des niveaux imbriqués sub CalculateTreeViewLevelVector(ind%) TVO_levels%(0) = 0 i% = ind% CalculateLineLevel(s$)
while n1%>1 ldet% = 0 n2% = n1% if n2%>1 TVO_indexes%(TVO_levels%(0)+1) = i% while n1%>=n2% if n1%=n2% then ldet% = ldet% + 1 i% = i% - 1 s$ = item_read$(1,i%) CalculateLineLevel(s$) end_while TVO_levels%(0) = TVO_levels%(0) + 1 TVO_levels%(TVO_levels%(0)) = ldet% end_if end_while TVO_levels%(0) = TVO_levels%(0) + 1 TVO_levels%(TVO_levels%(0)) = 1 TVO_indexes%(TVO_levels%(0)) = 1 end_sub
sub CreateTreeViewObject(no%,t%,l%,w%,h%) if (object_exists(no%)+object_exists(no%+1))>0 message "TreeView - error 1" exit_sub end_if if variable("TVO")=0 then dim TVO if variable("TVO_levels%")=0 then dim TVO_levels%(50) if variable("TVO_indexes%")=0 then dim TVO_indexes%(50) if variable("TVO_sources%")=0 then dim TVO_sources%(50)
TVO = no% list TVO : top TVO,t% : left TVO,l% width TVO,w% : height TVO,h% font_name TVO,"Courier" if montrer%=0 dlist no%+1 else list TVO+1 : top TVO+1,t% : left TVO+1,l%+w%+10 width TVO+1,w% : height TVO+1,h% font_name TVO+1,"Courier" end_if end_sub
sub CreateTreeViewRoot(o,txt$) if count(o)>0 message "TreeView - error 2" exit_sub end_if item_add o," "+txt$ item_add o+1," "+txt$ end_sub
sub AddTreeViewChildByIndex(o,ind%,txt$) if variable("AddTreeViewChildByIndex")=0 then dim AddTreeViewChildByIndex dim_local a$, index%, n2% if ind%>count(o) message "TreeView - error 3" exit_sub end_if i% = ind% s$ = item_read$(o,i%) if chk%=1 then message "AddTreeViewChildByIndex 1: i%="+str$(i%)+" s$="+s$ CalculateLineLevel(s$) if chk%=1 then message "AddTreeViewChildByIndex 1: n1="+str$(n1%)+" s$=["+s$+"]" n2% = n1% CalculateTreeViewLevelVector(ind%) if chk%=1 then dump("1 "+str$(ind%)) FindTreeViewSource(o) if chk%=1 then dump("2 "+str$(ind%)) FindTreeViewEndLevel(o,n2%) if chk%=1 then dump("3 "+str$(ind%)) index% = TVO_indexes%(1) if chk%=1 then message "index%="+str$(index%) s$ = item_read$(o,index%) a$ = mid$(s$,(n2%-1)*4+1,3) CalculateLineLevel(s$) ' message "xxx: index="+str$(index%)+" a$="+a$+" s$="+s$+" txt$="+txt$
if a$="[+]" message "déplier" end_if if (a$=sp3$) or (a$="[-]") : ' modif Nardo ' message "D: n2="+str$(n2%)+" index%="+str$(index%)+" s$="+s$+" a$="+a$+" "+txt$ if (a$=sp3$) and (n1%=n2%): ' modif nardo s$ = item_read$(o+1,index%) item_delete o,index% s1$ = "" if n2%>1 then s1$ = string$((n2%-1)*4," ") item_insert o,index%,s1$+"[-] "+trim$(s$) end_if item_insert o,index%+1,string$(n2%*4," ")+" "+txt$ AddTreeViewChildByIndex = index%+1 index% = TVO_sources%(1) if a$=sp3$ and (n1%=n2%) : ' modif Nardo s$ = item_read$(o+1,index%) item_delete o+1,index% s1$ = "" if n2%>1 then s1$ = string$((n2%-1)*4," ") item_insert o+1,index%,s1$+"[-] "+trim$(s$) end_if item_insert o+1,index%+1,string$(n2%*4," ")+" "+txt$ end_if end_sub
sub AddTreeViewChildByVector(o,ind%)
end_sub
sub FindTreeViewSource(o) dim_local k%, n%, s$ sind% = 1 s$ = item_read$(o+1,sind%) CalculateLineLevel(s$) if chk%=1 then message "A1: sind="+str$(sind%)+" n1="+str$(n1%)+" "+s$+" "+str$(TVO_levels%(0)) for k%=TVO_levels%(0) to 1 step -1 n% = TVO_levels%(k%) if chk%=1 then message "A2: sind="+str$(sind%)+" k="+str$(k%)+" n="+str$(n%) while n%>1 sind% = sind% + 1 s$ = item_read$(o+1,sind%) CalculateLineLevel(s$) if chk%=1 then message "A3: sind="+str$(sind%)+" n="+str$(n%)+" k="+str$(k%)+" n1="+str$(n1%)+" "+s$+" "+str$(TVO_levels%(0)) if n1%=(TVO_levels%(0)+1-k%) then n% = n% - 1 end_while TVO_sources%(k%) = sind% sind% = sind% + 1 next k% if chk%=1 then message "A4: Source: sind="+str$(sind%)+" niveau="+str$(n1%)+" "+s$ end_sub
sub FindTreeViewEndLevel(o,nx%) dim_local s$, k%, l% k% = TVO_sources%(1) while k%<count(o+1) k% = k% + 1 l% = l% + 1 s$ = item_read$(o+1,k%) CalculateLineLevel(s$) if n1%<nx% ' message "A: k="+str$(k%)+" l="+str$(l%) TVO_sources%(1) = k% TVO_levels%(1) = TVO_levels%(1) + l% TVO_indexes%(1) = TVO_indexes%(1) + l% ' dump("A") exit_sub end_if end_while ' message "B: k="+str$(k%)+" l="+str$(l%) TVO_sources%(1) = k% TVO_levels%(1) = TVO_levels%(1) + l% TVO_indexes%(1) = TVO_indexes%(1) + l% ' dump("B") end_sub
sub dump(t$) message t$+": niveaux: "+str$(TVO_levels%(0))+","+str$(TVO_levels%(1))+","+str$(TVO_levels%(2))+","+str$(TVO_levels%(3)) message t$+": indices: "+str$(TVO_indexes%(0))+","+str$(TVO_indexes%(1))+","+str$(TVO_indexes%(2))+","+str$(TVO_indexes%(3)) message t$+": sources: "+str$(TVO_sources%(0))+","+str$(TVO_sources%(1))+","+str$(TVO_sources%(2))+","+str$(TVO_sources%(3)) end_sub | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 12:39 | |
| ?????
Je n'ai pas compris pourquoi tu as posté le source avec la même modif que la mienne... | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 12:44 | |
| Parce que dans la version que tu as mis, il n'y a pas de sp3$... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 12:54 | |
| Oups... Merci ! Voici la version actuelle. J'ai ajouté la fonction replier() qui permet de replier n'importe quel noeud. Je travaille maintenant sur la fonction deplier(). - Code:
-
' treeview.bas
label click
dim x%, n%, a%, b%, s$, i%, n1%, flag%, a1$, a2$, n2%, n3%, s1$ dim ldet%, nsect%, lorg%, sind%, nindex%, niveau1%, niveau2%, niveau3% dim chk% : chk% = 0 dim montrer% : montrer% = 0 dim sp3$ : sp3$ = string$(3," ")
width 0,800 CreateTreeViewObject(1,10,10,300,300) on_click 1,click CreateTreeViewRoot(TVO,"Racine") niveau1% = 1
AddTreeViewChildByIndex(TVO,niveau1%,"aaaa") niveau2% = AddTreeViewChildByIndex
AddTreeViewChildByIndex(TVO,niveau2%,"a1111111111") AddTreeViewChildByIndex(TVO,niveau2%,"a2222222222") AddTreeViewChildByIndex(TVO,niveau1%,"bbbb") AddTreeViewChildByIndex(TVO,niveau1%,"cccc") niveau2% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau2%,"11111111") AddTreeViewChildByIndex(TVO,niveau2%,"22222222") niveau3% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau3%,"2aaaaaaaaa") AddTreeViewChildByIndex(TVO,niveau3%,"2bbbbbbbbb") AddTreeViewChildByIndex(TVO,niveau2%,"33333333") AddTreeViewChildByIndex(TVO,niveau2%,"44444444") niveau3% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau3%,"4aaaaaaaaa") AddTreeViewChildByIndex(TVO,niveau3%,"4bbbbbbbbb") AddTreeViewChildByIndex(TVO,niveau1%,"dddd") niveau2% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau2%,"d11111111") AddTreeViewChildByIndex(TVO,niveau2%,"d22222222")
end
' positionnement des [+] ' niveau 1: 5...22 ==> 17 ' niveau 2: 37...54 ==> 17 ' niveau 3: 69...86 ==> 17 ' niveau n: a...b n=int((x-5+32)/32) a = (n-1)*32+5 b=a+17 click: x% = mouse_x_left_down(1) n% = int((x%-5+32)/32) a% = (n%-1)*32 + 5 b% = a% + 16 s$ = item_index$(1) CalculateLineLevel(s$) CalculateTreeViewLevelVector(item_index(1)) n1% = TVO_levels%(0) s$ = item_index$(1) ' message "click: ind="+str$(item_index(1))+" x="+str$(x%)+" a="+str$(a%)+" b="+str$(b%)+" n1="+str$(n1%)+" s$="+s$ flag% = 0 if n%=n1% if mid$(s$,(n%-1)*4+2,1)="+" then flag% = 1 if mid$(s$,(n%-1)*4+2,1)="-" then flag% = 2 end_if ' dump("0") select flag% ' on a sélectionné une ligne case 0 message "Ligne "+str$(item_index(1))+" niveau "+str$(n%) ' on veut déplier une ligne ayant des lignes enfant case 1 message "déplier ligne "+str$(item_index(1))+" niveau "+str$(n%) UnfoldTreeViewNode() ' on veut replier une ligne pour escamoter ses enfants case 2 ' message "replier ligne "+str$(item_index(1))+" niveau "+str$(n%) FoldTreeViewNode(1,item_index(1),n%) end_select return sub UnfoldTreeViewNode() end_sub
sub FoldTreeViewNode(o,lig%,niv%) dim_local s$, s1$, i% s$ = item_read$(o,lig%) s1$ = "" if n%>1 then s1$ = string$((niv%-1)*4," ") s$ = s1$ + "[+] "+mid$(s$,niv%*4+1,len(s$)) item_delete o,lig% item_insert o,lig%,s$ i% = lig% while i%<count(o) i% = i% + 1 s$ = item_read$(o,i%) CalculateLineLevel(s$) if n1%>niv% item_delete o,i% i% = i% - 1 else exit_sub end_if end_while
end_sub
' determiner le niveau d'une ligne dans la section sub CalculateLineLevel(s$) dim_local i% i% = 1 while mid$(s$,i%,1)=" " i% = i% + 1 end_while if mid$(s$,i%,1)<>"[" then i% = i% - 4 i% = i% - 1 n1% = i%/4 + 1 end_sub
' déterminer le vecteur des niveaux imbriqués sub CalculateTreeViewLevelVector(ind%) TVO_levels%(0) = 0 i% = ind% CalculateLineLevel(s$)
while n1%>1 ldet% = 0 n2% = n1% if n2%>1 TVO_indexes%(TVO_levels%(0)+1) = i% while n1%>=n2% if n1%=n2% then ldet% = ldet% + 1 i% = i% - 1 s$ = item_read$(1,i%) CalculateLineLevel(s$) end_while TVO_levels%(0) = TVO_levels%(0) + 1 TVO_levels%(TVO_levels%(0)) = ldet% end_if end_while TVO_levels%(0) = TVO_levels%(0) + 1 TVO_levels%(TVO_levels%(0)) = 1 TVO_indexes%(TVO_levels%(0)) = 1 end_sub
sub CreateTreeViewObject(no%,t%,l%,w%,h%) if (object_exists(no%)+object_exists(no%+1))>0 message "TreeView - error 1" exit_sub end_if if variable("TVO")=0 then dim TVO if variable("TVO_levels%")=0 then dim TVO_levels%(50) if variable("TVO_indexes%")=0 then dim TVO_indexes%(50) if variable("TVO_sources%")=0 then dim TVO_sources%(50)
TVO = no% list TVO : top TVO,t% : left TVO,l% width TVO,w% : height TVO,h% font_name TVO,"Courier" if montrer%=0 dlist no%+1 else list TVO+1 : top TVO+1,t% : left TVO+1,l%+w%+10 width TVO+1,w% : height TVO+1,h% font_name TVO+1,"Courier" end_if end_sub
sub CreateTreeViewRoot(o,txt$) if count(o)>0 message "TreeView - error 2" exit_sub end_if item_add o," "+txt$ item_add o+1," "+txt$ end_sub
sub AddTreeViewChildByIndex(o,ind%,txt$) if variable("AddTreeViewChildByIndex")=0 then dim AddTreeViewChildByIndex dim_local a$, index%, n2% if ind%>count(o) message "TreeView - error 3" exit_sub end_if i% = ind% s$ = item_read$(o,i%) if chk%=1 then message "AddTreeViewChildByIndex 1: i%="+str$(i%)+" s$="+s$ CalculateLineLevel(s$) if chk%=1 then message "AddTreeViewChildByIndex 1: n1="+str$(n1%)+" s$=["+s$+"]" n2% = n1% CalculateTreeViewLevelVector(ind%) if chk%=1 then dump("1 "+str$(ind%)) FindTreeViewSource(o) if chk%=1 then dump("2 "+str$(ind%)) FindTreeViewEndLevel(o,n2%) if chk%=1 then dump("3 "+str$(ind%)) index% = TVO_indexes%(1) if chk%=1 then message "index%="+str$(index%) s$ = item_read$(o,index%) a$ = mid$(s$,(n2%-1)*4+1,3) CalculateLineLevel(s$) ' message "xxx: index="+str$(index%)+" a$="+a$+" s$="+s$+" txt$="+txt$
if a$="[+]" message "déplier" end_if if (a$=sp3$) or (a$="[-]") ' message "D: n2="+str$(n2%)+" index%="+str$(index%)+" s$="+s$+" a$="+a$+" "+txt$ if (a$=sp3$) and (n1%=n2%) s$ = item_read$(o+1,index%) item_delete o,index% s1$ = "" if n2%>1 then s1$ = string$((n2%-1)*4," ") item_insert o,index%,s1$+"[-] "+trim$(s$) end_if item_insert o,index%+1,string$(n2%*4," ")+" "+txt$ AddTreeViewChildByIndex = index%+1 index% = TVO_sources%(1) if a$=sp3$ and (n1%=n2%) s$ = item_read$(o+1,index%) item_delete o+1,index% s1$ = "" if n2%>1 then s1$ = string$((n2%-1)*4," ") item_insert o+1,index%,s1$+"[-] "+trim$(s$) end_if item_insert o+1,index%+1,string$(n2%*4," ")+" "+txt$ end_if end_sub
sub AddTreeViewChildByVector(o,ind%)
end_sub
sub FindTreeViewSource(o) dim_local k%, n%, s$ sind% = 1 s$ = item_read$(o+1,sind%) CalculateLineLevel(s$) if chk%=1 then message "A1: sind="+str$(sind%)+" n1="+str$(n1%)+" "+s$+" "+str$(TVO_levels%(0)) for k%=TVO_levels%(0) to 1 step -1 n% = TVO_levels%(k%) if chk%=1 then message "A2: sind="+str$(sind%)+" k="+str$(k%)+" n="+str$(n%) while n%>1 sind% = sind% + 1 s$ = item_read$(o+1,sind%) CalculateLineLevel(s$) if chk%=1 then message "A3: sind="+str$(sind%)+" n="+str$(n%)+" k="+str$(k%)+" n1="+str$(n1%)+" "+s$+" "+str$(TVO_levels%(0)) if n1%=(TVO_levels%(0)+1-k%) then n% = n% - 1 end_while TVO_sources%(k%) = sind% sind% = sind% + 1 next k% if chk%=1 then message "A4: Source: sind="+str$(sind%)+" niveau="+str$(n1%)+" "+s$ end_sub
sub FindTreeViewEndLevel(o,nx%) dim_local s$, k%, l% k% = TVO_sources%(1) while k%<count(o+1) k% = k% + 1 l% = l% + 1 s$ = item_read$(o+1,k%) CalculateLineLevel(s$) if n1%<nx% ' message "A: k="+str$(k%)+" l="+str$(l%) TVO_sources%(1) = k% TVO_levels%(1) = TVO_levels%(1) + l% TVO_indexes%(1) = TVO_indexes%(1) + l% ' dump("A") exit_sub end_if end_while ' message "B: k="+str$(k%)+" l="+str$(l%) TVO_sources%(1) = k% TVO_levels%(1) = TVO_levels%(1) + l% TVO_indexes%(1) = TVO_indexes%(1) + l% ' dump("B") end_sub
sub dump(t$) message t$+": niveaux: "+str$(TVO_levels%(0))+","+str$(TVO_levels%(1))+","+str$(TVO_levels%(2))+","+str$(TVO_levels%(3)) message t$+": indices: "+str$(TVO_indexes%(0))+","+str$(TVO_indexes%(1))+","+str$(TVO_indexes%(2))+","+str$(TVO_indexes%(3)) message t$+": sources: "+str$(TVO_sources%(0))+","+str$(TVO_sources%(1))+","+str$(TVO_sources%(2))+","+str$(TVO_sources%(3)) end_sub
EDIT Et voici le même source, mais avec les procédures nommées correctement ! | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 13:07 | |
| ça marche ! C'est là qu'on se rend compte qu'il manque un: - Code:
-
ITEM_SELECT TVO,ITEM_INDEX(TVO) Pour maintenir le background bleu sur l'item que l'on vient de replier.... C'est faisable en passant par les GLIST... mais bonjour l'usine à gaz !!! | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 13:46 | |
| Bonjour Klaus.
Bonne idée, mais … J’ai toujours (le 1er code et aussi le 2ème) l’erreur ‘(52) Not correct string expression : Function call with negative or zero value .Line 154’. La correction faite par Nardo vingt-six marche correctement.
Je viens de tester ta nouvelle version : c’est OK !
CONTINUE ....
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 14:15 | |
| @Nardo: on peut le faire avec la fonction res% = dll_call2("SelectListBoxItem",hnd%,item%) de KGF.dll, ou SelectListBoxItem(hnd%,item%) del KGF_SUB.bas.
Mais je voulais rester en Panoramic pur. Donc, pour mon programme, au niveau fonctionnel, je décrète la règle: Toute modification d'une ligne désélectionne cette ligne.
Le dépliage progresse...
| |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 14:43 | |
| - Klaus a écrit:
- ...Mais je voulais rester en Panoramic pur....
J'ai bien compris le principe: rien que pour la beauté de la chose et le côté "formateur" (pas très français ce que je dis) pour les débutants cela vaut le coup ! C'est d'ailleurs pour cela que j'ai parlé des GLISTs... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 17:25 | |
| Je pourrais en effet remplace la LIST par une GLIST, lorsque tout fonctionnera. On verra. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 17:31 | |
| - Klaus a écrit:
- Je pourrais en effet remplace la LIST par une GLIST, lorsque tout fonctionnera. On verra.
Ca vaut pas le coup Klaus : La seule chose que cela va faire, c'est d'alourdir la chose pour rien...Perso je ne toucherai pas à l'organisation interne. (J'avais parlé de GLIST en rigolant par rapport à cette histoire de ITEM_SELECT mais j'ai rajouté derrière que cela serait une usine à gaz) | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 17:58 | |
| Effecctivement.
Je continue à "déplier"... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 21:53 | |
| Maintenant, on peut déplier un noeud replié: - Code:
-
' treeview.bas
label click
dim x%, n%, a%, b%, s$, i%, n1%, flag%, a1$, a2$, n2%, n3%, s1$ dim ldet%, nsect%, lorg%, sind%, nindex%, niveau1%, niveau2%, niveau3% dim chk% : chk% = 0 dim montrer% : montrer% = 1 dim sp3$ : sp3$ = string$(3," ")
width 0,800 CreateTreeViewObject(1,10,10,300,300) on_click 1,click CreateTreeViewRoot(TVO,"Racine") niveau1% = 1
AddTreeViewChildByIndex(TVO,niveau1%,"aaaa") niveau2% = AddTreeViewChildByIndex
AddTreeViewChildByIndex(TVO,niveau2%,"a1111111111") AddTreeViewChildByIndex(TVO,niveau2%,"a2222222222") AddTreeViewChildByIndex(TVO,niveau1%,"bbbb") AddTreeViewChildByIndex(TVO,niveau1%,"cccc") niveau2% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau2%,"11111111") AddTreeViewChildByIndex(TVO,niveau2%,"22222222") niveau3% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau3%,"2aaaaaaaaa") AddTreeViewChildByIndex(TVO,niveau3%,"2bbbbbbbbb") AddTreeViewChildByIndex(TVO,niveau2%,"33333333") AddTreeViewChildByIndex(TVO,niveau2%,"44444444") niveau3% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau3%,"4aaaaaaaaa") AddTreeViewChildByIndex(TVO,niveau3%,"4bbbbbbbbb") AddTreeViewChildByIndex(TVO,niveau1%,"dddd") niveau2% = AddTreeViewChildByIndex AddTreeViewChildByIndex(TVO,niveau2%,"d11111111") AddTreeViewChildByIndex(TVO,niveau2%,"d22222222")
end
' positionnement des [+] ' niveau 1: 5...22 ==> 17 ' niveau 2: 37...54 ==> 17 ' niveau 3: 69...86 ==> 17 ' niveau n: a...b n=int((x-5+32)/32) a = (n-1)*32+5 b=a+17 click: x% = mouse_x_left_down(1) n% = int((x%-5+32)/32) a% = (n%-1)*32 + 5 b% = a% + 16 s$ = item_index$(1) CalculateLineLevel(s$) CalculateTreeViewLevelVector(1,item_index(1),s$) n1% = TVO_levels%(0) s$ = item_index$(1) ' message "click: ind="+str$(item_index(1))+" x="+str$(x%)+" a="+str$(a%)+" b="+str$(b%)+" n1="+str$(n1%)+" s$="+s$ flag% = 0 if n%=n1% if mid$(s$,(n%-1)*4+2,1)="+" then flag% = 1 if mid$(s$,(n%-1)*4+2,1)="-" then flag% = 2 end_if ' dump("0") select flag% ' on a sélectionné une ligne case 0 message "Ligne "+str$(item_index(1))+" niveau "+str$(n%) ' on veut déplier une ligne ayant des lignes enfant case 1 ' message "déplier ligne "+str$(item_index(1))+" niveau "+str$(n%) UnfoldTreeViewNode(1,item_index(1),n%) ' on veut replier une ligne pour escamoter ses enfants case 2 ' message "replier ligne "+str$(item_index(1))+" niveau "+str$(n%) FoldTreeViewNode(1,item_index(1),n%) end_select return sub UnfoldTreeViewNode(o,lig%,niv%) dim_local s$, s1$, i1%, i2% s$ = item_read$(o,lig%) s1$ = "" if n%>1 then s1$ = string$((niv%-1)*4," ") s$ = s1$ + "[-] "+mid$(s$,niv%*4+1,len(s$)) item_delete o,lig% item_insert o,lig%,s$ CalculateLineLevel(s$) CalculateTreeViewLevelVector(o,lig%,s$) FindTreeViewSource(o) i1% = lig% i2% = TVO_sources%(1) while i2%<count(o+1) i2% = i2% + 1 s$ = item_read$(o+1,i2%) CalculateLineLevel(s$) if n1%>niv% i1% = i1% + 1 item_insert o,i1%,s$ else exit_sub end_if end_while end_sub
sub FoldTreeViewNode(o,lig%,niv%) dim_local s$, s1$, i% s$ = item_read$(o,lig%) s1$ = "" if n%>1 then s1$ = string$((niv%-1)*4," ") s$ = s1$ + "[+] "+mid$(s$,niv%*4+1,len(s$)) item_delete o,lig% item_insert o,lig%,s$ i% = lig% while i%<count(o) i% = i% + 1 s$ = item_read$(o,i%) CalculateLineLevel(s$) if n1%>niv% item_delete o,i% i% = i% - 1 else exit_sub end_if end_while
end_sub
' determiner le niveau d'une ligne dans la section sub CalculateLineLevel(s$) dim_local i% i% = 1 while mid$(s$,i%,1)=" " i% = i% + 1 end_while if mid$(s$,i%,1)<>"[" then i% = i% - 4 i% = i% - 1 n1% = i%/4 + 1 end_sub
' déterminer le vecteur des niveaux imbriqués sub CalculateTreeViewLevelVector(o,ind%,r$) dim_local s$ s$ = r$ TVO_levels%(0) = 0 i% = ind% CalculateLineLevel(s$)
while n1%>1 ldet% = 0 n2% = n1% if n2%>1 TVO_indexes%(TVO_levels%(0)+1) = i% while n1%>=n2% if n1%=n2% then ldet% = ldet% + 1 i% = i% - 1 s$ = item_read$(o,i%) CalculateLineLevel(s$) end_while TVO_levels%(0) = TVO_levels%(0) + 1 TVO_levels%(TVO_levels%(0)) = ldet% end_if end_while TVO_levels%(0) = TVO_levels%(0) + 1 TVO_levels%(TVO_levels%(0)) = 1 TVO_indexes%(TVO_levels%(0)) = 1 end_sub
sub CreateTreeViewObject(no%,t%,l%,w%,h%) if (object_exists(no%)+object_exists(no%+1))>0 message "TreeView - error 1" exit_sub end_if if variable("TVO")=0 then dim TVO if variable("TVO_levels%")=0 then dim TVO_levels%(50) if variable("TVO_indexes%")=0 then dim TVO_indexes%(50) if variable("TVO_sources%")=0 then dim TVO_sources%(50)
TVO = no% list TVO : top TVO,t% : left TVO,l% width TVO,w% : height TVO,h% font_name TVO,"Courier" if montrer%=0 dlist no%+1 else list TVO+1 : top TVO+1,t% : left TVO+1,l%+w%+10 width TVO+1,w% : height TVO+1,h% font_name TVO+1,"Courier" end_if end_sub
sub CreateTreeViewRoot(o,txt$) if count(o)>0 message "TreeView - error 2" exit_sub end_if item_add o," "+txt$ item_add o+1," "+txt$ end_sub
sub AddTreeViewChildByIndex(o,ind%,txt$) if variable("AddTreeViewChildByIndex")=0 then dim AddTreeViewChildByIndex dim_local a$, index%, n2% if ind%>count(o) message "TreeView - error 3" exit_sub end_if i% = ind% s$ = item_read$(o,i%) if chk%=1 then message "AddTreeViewChildByIndex 1: i%="+str$(i%)+" s$="+s$ CalculateLineLevel(s$) if chk%=1 then message "AddTreeViewChildByIndex 1: n1="+str$(n1%)+" s$=["+s$+"]" n2% = n1% CalculateTreeViewLevelVector(o,ind%,s$) if chk%=1 then dump("1 "+str$(ind%)) FindTreeViewSource(o) if chk%=1 then dump("2 "+str$(ind%)) FindTreeViewEndLevel(o,n2%) if chk%=1 then dump("3 "+str$(ind%)) index% = TVO_indexes%(1) if chk%=1 then message "index%="+str$(index%) s$ = item_read$(o,index%) a$ = mid$(s$,(n2%-1)*4+1,3) CalculateLineLevel(s$) ' message "xxx: index="+str$(index%)+" a$="+a$+" s$="+s$+" txt$="+txt$
if a$="[+]" message "déplier" end_if if (a$=sp3$) or (a$="[-]") ' message "D: n2="+str$(n2%)+" index%="+str$(index%)+" s$="+s$+" a$="+a$+" "+txt$ if (a$=sp3$) and (n1%=n2%) s$ = item_read$(o+1,index%) item_delete o,index% s1$ = "" if n2%>1 then s1$ = string$((n2%-1)*4," ") item_insert o,index%,s1$+"[-] "+trim$(s$) end_if item_insert o,index%+1,string$(n2%*4," ")+" "+txt$ AddTreeViewChildByIndex = index%+1 index% = TVO_sources%(1) if a$=sp3$ and (n1%=n2%) s$ = item_read$(o+1,index%) item_delete o+1,index% s1$ = "" if n2%>1 then s1$ = string$((n2%-1)*4," ") item_insert o+1,index%,s1$+"[-] "+trim$(s$) end_if item_insert o+1,index%+1,string$(n2%*4," ")+" "+txt$ end_if end_sub
sub AddTreeViewChildByVector(o,ind%)
end_sub
sub FindTreeViewSource(o) dim_local k%, n%, s$ sind% = 1 s$ = item_read$(o+1,sind%) CalculateLineLevel(s$) if chk%=1 then message "A1: sind="+str$(sind%)+" n1="+str$(n1%)+" "+s$+" "+str$(TVO_levels%(0)) for k%=TVO_levels%(0) to 1 step -1 n% = TVO_levels%(k%) if chk%=1 then message "A2: sind="+str$(sind%)+" k="+str$(k%)+" n="+str$(n%) while (n%>1) sind% = sind% + 1 if sind%>count(o+1) TVO_sources%(k%) = sind% exit_sub end_if s$ = item_read$(o+1,sind%) CalculateLineLevel(s$) if chk%=1 then message "A3: sind="+str$(sind%)+" n="+str$(n%)+" k="+str$(k%)+" n1="+str$(n1%)+" "+s$+" TVO_levels(0)="+str$(TVO_levels%(0)) if n1%=(TVO_levels%(0)+1-k%) then n% = n% - 1 end_while TVO_sources%(k%) = sind% sind% = sind% + 1 next k% if chk%=1 then message "A4: Source: sind="+str$(sind%)+" niveau="+str$(n1%)+" "+s$ end_sub
sub FindTreeViewEndLevel(o,nx%) dim_local s$, k%, l% k% = TVO_sources%(1) while k%<count(o+1) k% = k% + 1 l% = l% + 1 s$ = item_read$(o+1,k%) CalculateLineLevel(s$) if n1%<nx% ' message "A: k="+str$(k%)+" l="+str$(l%) TVO_sources%(1) = k% TVO_levels%(1) = TVO_levels%(1) + l% TVO_indexes%(1) = TVO_indexes%(1) + l% ' dump("A") exit_sub end_if end_while ' message "B: k="+str$(k%)+" l="+str$(l%) TVO_sources%(1) = k% TVO_levels%(1) = TVO_levels%(1) + l% TVO_indexes%(1) = TVO_indexes%(1) + l% ' dump("B") end_sub
sub dump(t$) message t$+": niveaux: "+str$(TVO_levels%(0))+","+str$(TVO_levels%(1))+","+str$(TVO_levels%(2))+","+str$(TVO_levels%(3)) message t$+": indices: "+str$(TVO_indexes%(0))+","+str$(TVO_indexes%(1))+","+str$(TVO_indexes%(2))+","+str$(TVO_indexes%(3)) message t$+": sources: "+str$(TVO_sources%(0))+","+str$(TVO_sources%(1))+","+str$(TVO_sources%(2))+","+str$(TVO_sources%(3)) end_sub
Etape suivante: pouvoir faire un ajout de ligne enfant à un noeud replié... | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 22:06 | |
| Je n'arrive pas bien à trouver la règle, mais en cliquant sur les objets et en pliant, dépliant différents niveau, le niveau d'un objet change ... Ce qui ne me parrait pas normal ou alors c'est qu'un truc m'échappe.
Sinon le pliage, dépliage fonctionne bien | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Simulation d'un objet TreeView Mer 5 Déc 2012 - 22:19 | |
| Je n'ai pas rencontré ce cas. si tu arrives à le reproduire, je suis preneur.
Sinon, en ligne 8, mets montrer%=0 pour voir juste la liste normale. La liste de droite est l'image interne, qui est toujours entièrement dépliée et qui sert de modèle pour réintégrer les lignes perdues par un pliage. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Simulation d'un objet TreeView Jeu 6 Déc 2012 - 7:14 | |
| Bonjour, - Jicehel a écrit:
- Je n'arrive pas bien à trouver la règle, mais en cliquant sur les objets et en pliant, dépliant différents niveau, le niveau d'un objet change ... Ce qui ne me parrait pas normal ou alors c'est qu'un truc m'échappe.
Sinon le pliage, dépliage fonctionne bien Je rencontre le même problème.... Par exemple : 1- lancement du prog 2- clic sur "bbbb" -> ligne 5 niveau 3 ok 3- clic directement sur "a11111111111" -> ligne 3 niveau 5 4- re-clic sur a111111111 -> ligne 3 niveau 4 A partir de là, si tu re-cliques sur cette ligne sans toucher à une autre, tu n'obtiens pas tout le temps le même résultat (je suis même arrivé à obtenir ligne 3 niveau 6 !)EDIT : En fait je viens de comprendre : quand tu cliques sur un item : le niveau affiché ne correspond pas au niveau de l'item mais à la zone où se trouve le pointeur de souris au moment du clic. Si par exemple tu sélectionnes a11111111 en cliquant le plus a gauche possible, tu va obtenir "ligne 3 niveau 0" et si tu cliques le plus à droite possible tu vas avoir "ligne 3 niveau 9" | |
| | | Contenu sponsorisé
| Sujet: Re: Simulation d'un objet TreeView | |
| |
| | | | Simulation d'un objet TreeView | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |