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... :D

Publié : jeu. 28/août/2008 8:39
par Kwai chang caine
Alleluia !!!! 8O

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.