Page 1 sur 1
PanelGadget, onglet, gadgetList et tout le fourbi ...
Publié : mar. 26/août/2008 19:42
par Anonyme2
Le titre est vague.
Bien que je pratique PB depuis 2000 ou 2001 (je ne me souviens plus), je ne sais pas vraiment si c'est possible.
Sur un panel, chaque onglet a ses propres gadget et on peut ajouter modifier avec OpenGadgetList et le numéro d'onglet.
Mais ce que je recherche, c'est de pouvoir faire migrer un gadget d'un onglet à l'autre sans le détruire car c'est pour afficher des listview ou listicon de quelques milliers d'éléments, je pense que c'est mieux que d'en avoir plusieurs identiques (limite la mémoire et l'affichage serait presque instantané).
J'ai essayé avec des Setparent_() GetParent_() et des Opengadgetlist, j'arrive à faire migrer une fois et c'est tout.
Vous avez une idée ?
Je ne met pas de code car c'est extrait de mon outil asm que je redéveloppe pour PB 4.20 et le code est très long et pas pratique à réduire.
A+
Denis
Publié : mar. 26/août/2008 23:10
par Progi1984
Essaie un de mes codes retrouvés sur le forum anglais :
Code : Tout sélectionner
If OpenWindow(0, 0, 0, 322, 220, "PanelGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
PanelGadget (0, 8, 50, 306, 130)
AddGadgetItem (0, -1, "Panel 1")
ButtonGadget(2, 10, 15, 80, 24,"Button 1")
ButtonGadget(3, 95, 15, 80, 24,"Button 2")
AddGadgetItem (0, -1,"Panel 2")
ButtonGadget(4, 10, 15, 80, 24,"Button 3")
CloseGadgetList()
ButtonGadget(1, 0,0,120,30,"Move gadget in panel!")
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case 1 ;Let's reorder the panels.
tci.TC_ITEM
tci\mask=#TCIF_PARAM
SendMessage_(GadgetID(0), #TCM_GETITEM, 0, tci)
hPanel0 = tci\lparam ;This holds the windows handle of the static control attached to tab 0.
SendMessage_(GadgetID(0), #TCM_GETITEM, 1, tci)
hPanel1 = tci\lparam ;This holds the windows handle of the static control attached to tab 1.
SetParent_(GadgetID(2), HPanel1)
SetParent_(GadgetID(4), HPanel0)
Default
If GadgetType(EventGadget()) = #PB_GadgetType_Button
Debug GetGadgetText(EventGadget())
EndIf
EndSelect
EndSelect
Until event = #PB_Event_CloseWindow
EndIf
Publié : mer. 27/août/2008 10:54
par Anonyme2
salut Progi1984
merci pour le code je vais tester. C'est presque la même chose que j'ai fait mais ça ne marchait pas.
Ma grande question est de savoir comment fonctionne la gadgetlist de l'onglet qui n'a plus le gadget en référence, et le gadget qui a migré, comment PB va gérer ça avec la gadgetlist correspondante ?
Surement une quetion à poser à Fred
A+
Denis
Publié : mer. 27/août/2008 15:37
par gnozal
Denis a écrit :Ma grande question est de savoir comment fonctionne la gadgetlist de l'onglet qui n'a plus le gadget en référence, et le gadget qui a migré, comment PB va gérer ça avec la gadgetlist correspondante ?
En effet, il est peut-être prudent de faire un SetGadgetState() après le swap pour "réinitialiser" l'onglet.
Publié : mer. 27/août/2008 15:57
par Anonyme2
Merci Gnozal pour ton aide.
J'ai posé la question à Fred et voilà sa réponse
"Ca marche en effet, et ca ne devrait pas poser de probleme. PB ne supporte pas ca nativement, le mieux c'est de recreer le gadget"
A+
Denis
Publié : mer. 27/août/2008 22:34
par Progi1984
Et Fred répondit...

Publié : jeu. 28/août/2008 8:39
par Kwai chang caine
Alleluia !!!! 
Publié : mer. 03/sept./2008 16:27
par Anonyme2
Après plusieurs essais, ça ne marche pas vraiment, je déplace bien une fois mais c'est tout, ensuite je n'arrive pas à replacer LaA listicon sur un onglet différent et ça plantouille un peu à l'affichage.
C'est pas grave, j'ai fais des doublons de mes listicon
A+
Publié : jeu. 04/sept./2008 8:10
par gnozal
Denis, j'utilise ce code dans PureFORM et çà fonctionne :
Code : Tout sélectionner
; Swap panels in form
tci0\mask = #TCIF_TEXT | #TCIF_IMAGE | #TCIF_PARAM
Buffer1$ = Space(256)
tci0\pszText = @Buffer1$
tci0\cchTextMax = 256
tci1\mask = #TCIF_TEXT | #TCIF_IMAGE | #TCIF_PARAM
Buffer2$ = Space(256)
tci1\pszText = @Buffer2$
tci1\cchTextMax = 256
; Get window handle of the static control attached to first tab
SendMessage_(GadgetID(PanelGadget), #TCM_GETITEM, FirstTab, @tci0)
hPanel0 = tci0\lParam
; Get window handle of the static control attached to second tab
SendMessage_(GadgetID(PanelGadget), #TCM_GETITEM, SecondTab, @tci1)
hPanel1 = tci1\lParam
; Switch the panels.
SendMessage_(GadgetID(PanelGadget), #TCM_SETITEM, FirstTab, @tci1)
SendMessage_(GadgetID(PanelGadget), #TCM_SETITEM, SecondTab, @tci0)
; Force a redraw.
Select GetGadgetState(PanelGadget)
Case FirstTab
ShowWindow_(hPanel0, #SW_HIDE)
GetClientRect_(hPanel0, @rc)
MapWindowPoints_(hPanel0, GadgetID(PanelGadget), rc, 2)
SetWindowPos_(hPanel1, 0, rc\left, rc\top, rc\right-rc\left, rc\bottom-rc\top, #SWP_NOZORDER | #SWP_SHOWWINDOW)
Case SecondTab
ShowWindow_(hPanel1, #SW_HIDE)
GetClientRect_(hPanel1, @rc)
MapWindowPoints_(hPanel1, GadgetID(PanelGadget), rc, 2)
SetWindowPos_(hPanel0, 0, rc\left, rc\top, rc\right-rc\left, rc\bottom-rc\top, #SWP_NOZORDER | #SWP_SHOWWINDOW)
EndSelect
SetGadgetState(PanelGadget, SecondTab)
Le code est juste copié de ma source et non exécutable directement, désolé.
Publié : jeu. 04/sept./2008 8:53
par Anonyme2
Merci Gnozal, je vais regarder ton code.
Je dois déplacer de nombreuses fois (en théorie sans limite) 2 listicon dans 3 onglets différents, aujourd'hui j'en ai créé 6 mais j'ai 20 M0 de RAM utilisé par mon code (ce ne sont pas ces 6 listicon qui consomment tout mais j'aimerais pouvoir n'en utiliser que 2).
Denis
Publié : jeu. 04/sept./2008 9:09
par gnozal
Hmmm..., après relecture de ton post, le code que j'ai posté plus haut ne correspond peut-être pas à ce que tu cherches ?
Le code permet d'échanger les contenus de 2 onglets, FirstTab et SecondTab.
Publié : jeu. 04/sept./2008 11:27
par Anonyme2
Je vais essayer d'adapter ça mais je pense que ça cause un souci quelque part car c'est pas très compliqué et ça ne marche pas.