Page 1 sur 1

ListView multiselection [Résolu]

Publié : mer. 29/nov./2006 19:25
par Kwai chang caine
Bonjour à tous.

Je viens de m'apercevoir d'un truc de ouf......

Dans une listview, si je fais une selection de la premiere ligne, mon compteur compte bien 1, jusqu'a la pas de bleme.

Mais quand je fais un clic sur la premiere ligne pour la selectionner, le compteur compte un, et que je tiens le shift pour cliquer sur la troisieme ligne afin que les 3 soit sélectionnées, et ben le compteur ne compte que 2 8O

Donc, il compte les clics et non pas les cases cochées, alors que l'instruction est bien GetGadgetItemState(3, ii) 8O

Ou ai-je encore gaffé ? :oops:

Code : Tout sélectionner

OpenWindow(1, 216, 20, 520, 450, "Fenetre",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered | #PB_Window_WindowCentered )
CreateGadgetList(WindowID(1))
ListViewGadget(3, 10, 30, 150, 400, #PB_ListView_Multiselect)
 
For i = 1 To 3 
 AddGadgetItem(3, -1, "a")       
Next
   
Repeat  
 
 Evenement = WaitWindowEvent () 
 
 If Evenement = #WM_LBUTTONDOWN
  ;                    Detection selection multiple
 
  For ii = 0 To CountGadgetItems(3) 
  
   If GetGadgetItemState(3, ii) = 1 
    ComptageSelection + 1
    Debug ComptageSelection
   EndIf
  
   If ComptageSelection > 1 
    SelectionMultiple = 1
    Break 
   Else
    SelectionMultiple = 0 
   EndIf
   
  Next   
  
 EndIf 

Until Evenement = #PB_Event_CloseWindow
Merci et bonne soirée

Publié : mer. 29/nov./2006 20:04
par Flype
salut kwai,

Il y a plein de trucs qui vont pas dans ton code :)

Déjà il est préférable d'utiliser #PB_Event_xxxx à #WM_xxxx.
tant que tu peux t'en passer, hésite pas à utilise les commandes de purebasic.

Ensuite attention avec GetGadgetState()/GetGadgetItemState()
State peut revêtir plusieurs valeurs.
En effet elle peut etre #PB_ListIcon_Selected ET #PB_ListIcon_Checked.
Il vaut donc mieux utiliser le symbole '&' plutôt que '=', encore moins 'And'.

Et puis, j'aime bien encapsuler systématiquement dans une procédure quand il s'agit de bout de code réutilisable. Donc j'ai fais une petite procédure pratique : CountSelectedGadgetItems(gadget.l)

je peux te proposer une petite correction rapide si tu veux :

Code : Tout sélectionner

Procedure.l CountSelectedGadgetItems(gadget.l)
  
  Protected item.l, nSelected.l, nItems.l = CountGadgetItems(gadget) 
  
  For item = 0 To nItems - 1 
    If GetGadgetItemState(gadget, item) & #PB_ListIcon_Selected 
      nSelected + 1 
    EndIf 
  Next 
  
  ProcedureReturn nSelected 
  
EndProcedure

OpenWindow(1, 216, 20, 520, 450, "Fenetre",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered | #PB_Window_WindowCentered )
CreateGadgetList(WindowID(1))
ListViewGadget(3, 10, 30, 150, 400, #PB_ListView_Multiselect)
 
For i = 1 To 3
  AddGadgetItem(3, -1, "a")       
Next

Repeat 
  
  evenement = WaitWindowEvent()
  
  Select evenement
    
    Case #PB_Event_Gadget
      
      If EventGadget() = 3
          
        If EventType() = #PB_EventType_LeftClick
          
          ComptageSelection = CountSelectedGadgetItems(3)
          
          If ComptageSelection > 1
            SelectionMultiple = #True
          Else
            SelectionMultiple = #False
          EndIf
          
          Debug "=============" 
          Debug "SelectionMultiple = " + Str(SelectionMultiple) 
          Debug "ComptageSelection = " + Str(ComptageSelection) 
          
        EndIf
          
      EndIf
      
  EndSelect
  
Until evenement = #PB_Event_CloseWindow

Publié : mer. 29/nov./2006 22:27
par Kwai chang caine
Bonjour FLYPE

Comme dab c'est parfait et exactement ce que je voulais :10: (Il va vraiment falloir qu'il créé un émoticone superieur a 10/10 pour toi) :wink:

Quand je vois tes codes et la tronche des miens, j'hésite à arreter de programmer :oops: La route est vraiment encore tres longue.......
Je sais même pas si elle se rallonge pas au fur et à mesure que je marche :lol:

J'ai honte :oops: , je ne savais meme pas que l'on pouvais mettre un "&" 8O
Je viens d'essayer, apparement ça ne marche que pour les constantes et dans ce genre d'utilisation. Par exemple on ne peut pas ecrire

Code : Tout sélectionner

a&1
debug a
Et tu va rire j'avais meme pas vu que j'avais mis un #WM_.
Tu va encore plus rire, j'avais meme pas vu la difference. :oops: donc qu'il y avait des PB et WM.
C'est affligeant :oops:

Mais à quoi correspondent ces lettres VK, WM etc ... 8O ?????

Alors la, j'ai encore bien fait de poser la question, j'etais encore pas pres de trouver tout seul :lol:

Au fait pendant que je te tiens :lol: tu n'a pas répondu a mes 2 dernieres questions du POST :

http://purebasic.hmt-forum.com/viewtopi ... 8704#58704

J'espere que je t'ai pas gonflé avec mes canons qui tirent partout. :lol:

Encore merci pour tout.
Les mots n'ont que peu de poid devant toutes les aides que tu m'apporte. 8)

Excelente soirée à toi.

Publié : mer. 29/nov./2006 23:10
par Flype
J'espere que je t'ai pas gonflé avec mes canons qui tirent partout.

>> heu non c'était meme plutot rigolo. mais je passe vite à autre chose. c'est un de mes défaut. mais tout viens a point à qui sait attendre :D

Mais à quoi correspondent ces lettres VK, WM etc

>> ce sont des constantes Windows (API Win32) - pas purebasic.
>> donc pas compatibles avec toutes les plateformes - juste avec windows.
>> les constantes #PB_xxxx t'assure que ca fonctionnera aussi sous MacOS ou Linux (bon à savoir si par hasard un jour tu devais t'y mettre) et puis au moins tu as la doc sous la main - tandis que les constantes windows ne sont pas forcément abordables et bien comprises pour les débutants.
>> enfin le tout c'est d'avoir les bons outils pour bien se documenter...


ton code 'a&1' fonctionne mais encore faut savoir à quoi çà correspond.

je te conseille d'aller voir la doc F1 -> Rubrique Variables, Types et Opérateurs ->Opérateurs (Tableau)
voici un petit bout de code qui montre à quoi - dans la pratique - ca pourrait te servir :

Code : Tout sélectionner

#FLAG_CHECKED  = $1
#FLAG_SELECTED = $2
#FLAG_OPTION1  = $4
#FLAG_OPTION2  = $8
#FLAG_OPTION3  = $10

variable = #FLAG_CHECKED | #FLAG_OPTION2 | #FLAG_OPTION1

If variable & #FLAG_CHECKED
  Debug "Coché"
EndIf

If variable & #FLAG_SELECTED
  Debug "Sélectionné"
EndIf

If variable & #FLAG_OPTION1
  Debug "Option 1"
EndIf

If variable & #FLAG_OPTION2
  Debug "Option 2"
EndIf

If variable & #FLAG_OPTION3
  Debug "Option 3"
EndIf

Quand je vois tes codes et la tronche des miens, j'hésite à arreter de programmer Embarassed La route est vraiment encore tres longue.......

>> la route vers quoi, kwai ? tout dépends de ce qu'on à faire.
>> et puis si t'es assidu et motivé ca vient vite, t'inquiètes.

Publié : mer. 29/nov./2006 23:41
par Kwai chang caine
La route pour t'arriver a la cheville pardi :lol:

En tout cas, je ne lasserais jamais de te remercier de ta gentillesse. 8)

Pour que mon neurone travaille demain matin au boulot, et que je puisse appliquer le super code corrigé que tu m'a donné sur les listview, je vais me coucher.

Si tu peux a l'occase en terminer avec mes canons, ça fait partie du meme programme que j'essaye de faire au boulot. :wink:

Bonne nuit et au plaisir de te relire

Publié : mer. 29/nov./2006 23:46
par Backup
Kwai chang caine a écrit :ça fait partie du meme programme que j'essaye de faire au boulot. :wink:
vous avez des ordinateurs au Temple maintenant ? 8O

Publié : mer. 29/nov./2006 23:52
par Flype
toujours le mot pour rire dobro :D

Publié : mer. 29/nov./2006 23:55
par Kwai chang caine
Non c'est des bouliers :lol:

Mais j'ai bricolé des boules qui en se choquant entre elles créent un champ magnetique, qui sous l'impulsion fait varier l'intensité du mouvement, ce qui apour but de recreer le transistor, dans lequels (je te passe les details, je programme Purebasic et ensuite ............. :lol: :lol:

Bonne nuit a toi aussi DOBRO