Page 1 sur 1

Detection selection listview multiselection [Résolu]

Publié : jeu. 07/déc./2006 17:56
par Kwai chang caine
Bonjour à tous.

Je viens de m'appercevoir d'un truc horrible :lol:
Et seulement au bout d'un an et demi :oops:

Sur un listview quand on fait GetGadgetState on obtiens la ligne qui est selectionnée ou -1 si rien ne l'a été.....bien.

Maintenant si on met la listview multiselect, rien selectionné ça fait 0 et si on selectionne la premiere ligne ça fait 0 aussi.8O

Mes questions c'est:

1/ Pourquoi l'etat de départ change avec le multiselect ? 8O

Code : Tout sélectionner

If OpenWindow(1,216,150,178,208,"",#PB_Window_SystemMenu)

 If CreateGadgetList(WindowID(1))

  ListViewGadget(0,10,10,160,160,#PB_ListView_Multiselect)
  
  AddGadgetItem(0,-1,"Hello")
  Debug GetGadgetState(0)
    
  Repeat
   
   event = WaitWindowEvent()

   If event = #PB_Event_Gadget
    Debug GetGadgetState(0)
   EndIf
     
  Until event=#PB_Event_CloseWindow
 EndIf
EndIf
Bonne journée

Publié : jeu. 07/déc./2006 18:47
par Backup
ben oui c'est pas tres logique,
il te suffis de considerer l'element 0 comme element par defaut :D

Publié : jeu. 07/déc./2006 18:54
par Dr. Dri
y'a pas de "il suffit"
c'est un bug voila tout (j'ai pas vérifié mais bon...)

Dri

Publié : jeu. 07/déc./2006 19:15
par Backup
non seulement mais a priori aucune commande n'existe pour recuperer les multiples sélections !! 8O
ni même pour preselectionner !! :?

Code : Tout sélectionner

#gadget=0
#windows=1

If OpenWindow(#windows,216,150,178,208,"",#PB_Window_SystemMenu)
    
    If CreateGadgetList(WindowID(#windows)) 
        ListViewGadget(#gadget,10,10,160,160,#PB_ListView_Multiselect)
        
        AddGadgetItem(#gadget,-1,"Hello")
        AddGadgetItem(#gadget,-1,"bonjour")
        AddGadgetItem(#gadget,-1,"comment va")
         SetGadgetState(#gadget,2) 
        SetGadgetState(#gadget,1) 
        Repeat 
            
            event = WaitWindowEvent() 
            
            Select event 
                Case  #PB_Event_Gadget   
                
                        resultat$=""
                        selection=GetGadgetState(#gadget)
                        resultat$=resultat$+Str(selection)
                        Debug "les choix selectionnés sont:"+resultat$
                  
                  
                    
            EndSelect
        Until event=#PB_Event_CloseWindow
    EndIf
EndIf

Publié : ven. 08/déc./2006 9:55
par Dr. Dri
il faut boucler pour les multisélections, le gadgetstate indique la 1ere ligne sélectionnée

Dri

Publié : ven. 08/déc./2006 10:41
par Kwai chang caine
Je ne comprend pas comment tu fais dans ton code DOBRO pour savoir si quelque chose a été sélectionné dans le listview.
C'est un peu la le but que je recherchais.
Puisqu'en multiselection le pas sélectionné est egal au sélectionné premiere ligne comment faire la difference ????

En plus y'a un truc que je viens aussi de m'appercevoir, et qui m'a fait galerer dans ma fameuse comprehension des evenements.

Quand on clic sur une LISTVIEW mais en dehors des elements ecrits ou selectionnable, c'est a dire en dessous de la derniere ligne dans l'espace blanc, bah l'evenement gadget n'est pas récupéré 8O

On peut cliquer comme un malade partout et que dal 8O

Alors, ça m'a obligé à utiliser un code de FLYPE (je crois de mémoire) qui me permet de récuperer l'ID du gadget qui est survolé par la souris, enfin une galere quoi.... :?

Normalement quand on clic sur un gadget, on clic, que ce soit sur une ligne deja ecrite ou si il est vide.
Ne devrait on pas récuperer l'evenement quoi qu'il arrive ????

Je crois que Dr DRI a un peu raison sur ce coup la :wink:

Publié : ven. 08/déc./2006 13:12
par Dr. Dri

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 270, 170, "ListViewGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  ListViewGadget(0, 10, 10, 250, 120, #PB_ListView_Multiselect)
  For a = 1 To 12
    AddGadgetItem (0, -1, "Item " + Str(a) + " of the Listview") ; define listview content
  Next
  
  TextGadget(1, 10, 140, 250, 20, "Sélectionnés : ")
  
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget
      s.s = "Sélectionnés : "
      
      i = 0
      While i < CountGadgetItems(0)
        If GetGadgetItemState(0, i)
          s + Str(i+1) + " "
        EndIf
        i + 1
      Wend
      
      SetGadgetText(1, s)
    EndIf
    
  Until Event = #PB_Event_CloseWindow
EndIf
Dri

Publié : ven. 08/déc./2006 15:44
par Kwai chang caine
Merci docteur pour cette ordonnance.
Comme dab, tu ne t'embarasse pas de long discours :lol:

J'ai un peu complété ton code.
Comment corrigerais tu à nouveau le tiens/miens, pour qu'au premier clic de RAZ on ai bien aucun element selectionné.
Car dans celui la il faut 2 clic.

Code : Tout sélectionner

If OpenWindow(1, 0, 0, 270, 170, "ListViewGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(1)) 

 ListViewGadget(2, 10, 10, 250, 120, #PB_ListView_Multiselect) 
 TextGadget(1, 10, 140, 100, 20, "Sélectionnés : ") 
 ButtonGadget(3, 200, 140, 40, 20, "Raz")
 
 For a = 1 To 12 
  AddGadgetItem (2, -1, "Item " + Str(a) + " of the Listview") ; define listview content 
 Next 
    
 Repeat 

  Event = WaitWindowEvent() 
  EvenementGadget = EventGadget() 
  
  If Event = #PB_Event_Gadget 
 
   s.s = "Sélectionnés : " 
   i = 0 
 
   While i < CountGadgetItems(2) 
 
    If GetGadgetItemState(2, i) 
     s + Str(i+1) + " " 
     Delay(1)
    EndIf 
 
    i + 1 
 
   Wend 
      
   SetGadgetText(1, s) 
  
   If EvenementGadget = 3
    EvenementGadget = 0
    SetGadgetItemState(2, -1, 0) 
   EndIf
   
  EndIf 
    
 Until Event = #PB_Event_CloseWindow 
 
EndIf
Merci de votre aide 8)

Publié : ven. 08/déc./2006 15:55
par Dr. Dri
t'as juste mal placée la remise à zéro

Code : Tout sélectionner

If OpenWindow(1, 0, 0, 270, 170, "ListViewGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(1))

 ListViewGadget(2, 10, 10, 250, 120, #PB_ListView_Multiselect)
 TextGadget(1, 10, 140, 190, 20, "Sélectionnés : ")
 ButtonGadget(3, 210, 140, 40, 20, "Raz")
 
 For a = 1 To 12
  AddGadgetItem (2, -1, "Item " + Str(a) + " of the Listview") ; define listview content
 Next
   
 Repeat

  Event = WaitWindowEvent()
 
  If Event = #PB_Event_Gadget
  
    EvenementGadget = EventGadget()
   
     If EvenementGadget = 3
      EvenementGadget = 0
      SetGadgetItemState(2, -1, 0)
     EndIf
 
   s.s = "Sélectionnés : "
   i = 0
 
   While i < CountGadgetItems(2)
 
    If GetGadgetItemState(2, i)
     s + Str(i+1) + " "
     Delay(1)
    EndIf
 
    i + 1
 
   Wend
     
   SetGadgetText(1, s)
   
  EndIf
   
 Until Event = #PB_Event_CloseWindow
 
EndIf
Dri

Publié : ven. 08/déc./2006 16:23
par Kwai chang caine
Parfait 8)

Je te remercie beaucoup de ton aide, ainsi que celle de DOBRO bien sur.

Et pour le clic en dehors des lignes selectionnable, ya pas un moyen de le detecter en dehors de la methode du gadget survolé par la souris.

Tu trouve ça normal que #PB_Event_Gadget ne le detecte pas ??

Publié : ven. 08/déc./2006 18:44
par Dr. Dri
j'en sais franchement rien
c'est peut etre le comportement normal

Dri