PanelGadget, onglet, gadgetList et tout le fourbi ...

Sujets variés concernant le développement en PureBasic
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

PanelGadget, onglet, gadgetList et tout le fourbi ...

Message 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
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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 
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message 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.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Et Fred répondit... :D
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Alleluia !!!! 8O
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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+
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message 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é.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message 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.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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.
Répondre