Page 1 sur 1

TreeGadget - Gérer la barre de défilement

Publié : mer. 14/déc./2005 21:58
par Progi1984
Voilà, j'ai deux trees (PS : je sais que je vous fait chier avec mes treesgadgets :D ).

L'un,le 1, est rempli, L'autre, le 2, vide.
Le un est rempli de manière à ce qu'il y ait une barre de défilement.

Maintenant, je remplis le 2 avec le 1.

Comment puis je placer la barre de défilement exactement à l'endriot où elle était sur l'autre ?

Publié : jeu. 15/déc./2005 10:09
par lionel_om
Ya pas un message pour ça ?
(j'ai pas Win32 là dc je peux pas t'aider...)

Publié : jeu. 15/déc./2005 10:40
par Progi1984
Je pense que c'est avec SetScrollInfo_() ou un truc dans ce genre, mais suis pas sur !

Publié : jeu. 15/déc./2005 11:47
par AWEAR
Il faut utiliser :

Code : Tout sélectionner

position = Getscrollpos_(hwnd, type); on récupère la positon de la barre de défilement
;hwnd est le handle du treegadget ou l'on récupère la positon de la barre de défilement
; type est soit #SB_HORZ pour une barre de défilement horizontale, soit #SB_VERT pour une barre de défilement verticale, ce qui je pense est le cas ici

Setscrollpos_(hwnd, type, position, 15); on positionne la barre de tache à la position voulue
;hwnd est le handle du treegadget à modifier
;type est soit #SB_HORZ, soit #SB_VERT
Voilà normalement c'est ça..
Mais le problème c'est que (chez moi en tout cas), ça modifie bien la barre de défilement, mais pas le treegadget :(

Publié : jeu. 15/déc./2005 20:31
par Progi1984
Pour un ListView, c'est comme ca :

Code : Tout sélectionner

Procedure.l GetListPos(Gadget.l)
  ProcedureReturn SendMessage_(GadgetID(Gadget), #LVM_GETTOPINDEX, 0, 0)
EndProcedure

Procedure.l SetListPos(Gadget.l, Position.l)
  Protected Pos.point
  SendMessage_(GadgetID(Gadget), #LVM_GETITEMPOSITION, Position - 1, Pos)
  SendMessage_(GadgetID(Gadget), #LVM_SCROLL, 0, Pos\y)
EndProcedure 

Publié : jeu. 15/déc./2005 20:39
par AWEAR
Mais lorsque tu place la barre de défilement sur le second tree gadget, est-ce que un élément est séléctionné sur le premier ?
Parce que sinon il suffit de faire :

Code : Tout sélectionner

 Setgadgetstate(#tree1, getgadgetstate(#tree2))
non ?

Publié : jeu. 15/déc./2005 20:46
par Progi1984
Non, ca marche pas complètement

si ton item choisi se trouve à moitié sur le premier, il te le ramène à la première ligne sur le second

Publié : jeu. 15/déc./2005 23:33
par nico
Je suis pas sûr de bien comprendre, tu veux que les deux s'alignent sur l'action de l'utilisateur?

Publié : ven. 16/déc./2005 0:56
par Progi1984
Non, l'un est aligné par action de l'utilisateur et le second doit se placer au meme endroit que l'action sur mon action.

Publié : ven. 16/déc./2005 14:48
par AWEAR
Bon ben voilà j'ai fait ce code (qui marche mais seulement dans ce cas là :?), si c'est comme ça que tu crée ton second treegadget, ou à peu près de la même façon, ben je pense que ça vaut le coup d'essayer, mais par contre, si tu veux changer de position plusieurs fois, ça ne marche pas..


OpenWindow (0, 0, 0, 500, 500, #PB_Window_SystemMenu | #PB_Window_ScreenCentered , "fenetre" ) ; ouvre la fenêtre
CreateGadgetList ( WindowID ()) ; crée une liste de gadget
z.l = TreeGadget (0, 50, 50, 150, 400) ; ajoute le premier treegadget
ButtonGadget (1, 0,0, 50, 50, "ok" ) ; ajoute un bouton pour créer le second treegadget
OpenLibrary (0, "user32.dll" ) ; j'ai que la démo alors on fait avec les moyens du bords
For x = 0 To 50
AddGadgetItem (0, - 1, Str (x)) ; ajoute les éléments au treegadget
Next
Repeat
event = WaitWindowEvent () ; attend un évenement
If event = #PB_Event_Gadget ; si c'est un évenement sur un gadget
If EventGadgetID () = 1 ; et que ce gadget est le bouton
CreateGadgetList ( WindowID ()) ; on crée une liste de gadget
y.l = TreeGadget (2, 300, 50, 150, 400) ; on ajoute le second treegadget
For x = 0 To 50
AddGadgetItem (2, -1, Str (x)) ; on le remplit
Next
pos.l = CallFunction (0, "GetScrollPos" , z, 1) ; on récupere la position sur le premier treegadget
CallFunction (0, "SetScrollPos" , y, 1, pos, 1) ; on l'applique sur le second treegadget
EndIf
EndIf
Until event = #PB_Event_CloseWindow ; quitte quand on clique sur la croix