Page 1 sur 1

[resolu] ListIconGadget et CheckBox....

Publié : jeu. 01/juil./2010 21:46
par Ar-S
Me revoilà en mode gronoob :mrgreen:
Malgré l'aide, je bloque sur cette saleté de ListIconGadget.

2 Questions concernant le code

Code : Tout sélectionner

;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
  #ListIcon_0
EndEnumeration

Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 450, 200, 450, 277, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    If CreateGadgetList(WindowID(#Window_0))
      ListIconGadget(#ListIcon_0, 10, 10, 425, 260, "Gadget_0", 100, #PB_ListIcon_CheckBoxes|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
      For i =1 to 8
        AddGadgetItem(#ListIcon_0,-1,str(i))
      next  
      
      SendMessage_(GadgetID(#ListIcon_0), #LVM_SETCOLUMNWIDTH, 0, #LVSCW_AUTOSIZE_USEHEADER)
    EndIf
  EndIf
EndProcedure

OpenWindow_Window_0()

Repeat
  Select WaitWindowEvent()
      ; ///////////////////
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #ListIcon_0
          debug GetGadgetState(#ListIcon_0)
          
          if GetGadgetItemState(#ListIcon_0,GetGadgetState(#ListIcon_0)) & #PB_ListIcon_Checked
            MessageRequester(" ","coche") ;
          EndIf
      EndSelect
      ; ////////////////////////
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #Window_0
          CloseWindow(#Window_0)
          Break
      EndSelect
  EndSelect
Forever
;
;}

1- Pourquoi le debug affiche 2 fois le gadgetstate lorsqu'on ecrit debug GetGadgetState(#ListIcon_0)
2 - Comment fait on pour qu'en simplement cochant la checkbox on chope le numéro du gadget (sans sélectionner la ligne auparavant)

Re: ListIconGadget et CheckBox....

Publié : jeu. 01/juil./2010 22:05
par boddhi
Salut !

Quand tu cliques sur un gadget, tu génères plusieurs types d'évènements... Down, Up, Change,...
Tu dois donc sélectionner le type par :

Code : Tout sélectionner

Case #ListIcon_0
  If EventType()=#PB_EventType_LeftClick  
    debug GetGadgetState(#ListIcon_0)
         
    If GetGadgetItemState(#ListIcon_0,GetGadgetState(#ListIcon_0)) & #PB_ListIcon_Checked
      MessageRequester(" ","coche") ;
    EndIf
  Endif
Pour la 2e question, pardon, j'ai pas bien compris ce que tu voulais récupérer...
Est-ce que "& #PB_ListIcon_Checked|#PB_ListIcon_Selected" correspondrait à ce que tu cherches ???

Re: ListIconGadget et CheckBox....

Publié : jeu. 01/juil./2010 23:10
par Ar-S
Merci boddhi, honte à moi pour l'EventType()

Par contre ce que je veux c'est détecter quelle ligne est sélectionnée lorsque je coche une checkbox sans avoir auparavant sélectionné la ligne.
En gros si je clique directement sur la checkbox 3, que le debug m'affiche 3

Re: ListIconGadget et CheckBox....

Publié : jeu. 01/juil./2010 23:40
par boddhi
Merci boddhi, honte à moi pour l'EventType()
Il est tard et il fait très très chaud.... :lol: :lol:

Bon sinon, j'ai enfin compris ce que tu voulais pour le point 2 (Il fait vraiment très très chaud :D )
Le problème, c'est que quand on coche la checkbox, GetGadgetState() retourne -1, donc comme si on cliquait dans le vide...
Il faut peut-être passer par les API....

Je vais chercher...

Re: ListIconGadget et CheckBox....

Publié : ven. 02/juil./2010 0:11
par Ar-S
C'est une fonction qu'il serait intéressante d'ajouter à la TODO list.
Je vais attendre un peu de voir si fred croise ce post sinon j'en parlerai sur le fofo uk
Si tu trouves une solution coté api je suis preneur bien entendu.
Merci de ton aide. (c'est vrai qu'il fait chaud, même à cette heure tardive.) :wink:

Re: ListIconGadget et CheckBox....

Publié : ven. 02/juil./2010 1:27
par boddhi
J'ai rien trouvé... Chez nos amis anglais non plus :(

Une solution, entre-autres peut-être (et pas top top, je sais), consisterait à créer un tableau contenant l'état de chaque checkbox et, à chaque nouvel évènement sur la ListIcon, le comparer avec le nouvel état de chaque checkbox et déterminer ainsi quelle(s) ligne(s) a(ont) été cochée(s)... C'est du barbare :( mais, bon, ça a le mérite de marcher... :)

Code : Tout sélectionner

;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
EndEnumeration
Enumeration
  #ListIcon_0
EndEnumeration

Global Dim EtatCoches.b(0)

Procedure.s Fc_ComparaisonEtatCoches()
  ; Note : ; => Le retour peut bien sûr être un nombre mais utiliser une chaîne permet d'avoir plusieurs valeurs dans un unique retour qu'on peut travailler ensuite avec un CountString()
  ; Tout dépend après du contexte dans lequel tu utilises cette fonction
  ; A toi de voir....

  Define.i NbLignes,Compteur
  Define.s Chaine
  NbLignes=CountGadgetItems(#ListIcon_0)-1
  For Compteur=0 To NbLignes
    If GetGadgetItemState(#ListIcon_0,Compteur)&#PB_ListIcon_Checked
      If EtatCoches(Compteur)=0
        EtatCoches(Compteur)=#PB_ListIcon_Checked
        If Chaine<>"":Chaine+" ":EndIf
        Chaine+GetGadgetItemText(#ListIcon_0,Compteur)
      EndIf
    Else
      If EtatCoches(Compteur)=#PB_ListIcon_Checked
        EtatCoches(Compteur)=0
      EndIf
    EndIf
  Next
  ProcedureReturn Chaine 
EndProcedure

Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 450, 200, 450, 277, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    If CreateGadgetList(WindowID(#Window_0))
      ListIconGadget(#ListIcon_0, 10, 10, 425, 260, "Gadget_0", 100, #PB_ListIcon_CheckBoxes|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
      Redim EtatCoches(8)
      For i =1 To 8
        AddGadgetItem(#ListIcon_0,-1,Str(i))
      Next
      SendMessage_(GadgetID(#ListIcon_0), #LVM_SETCOLUMNWIDTH, 0, #LVSCW_AUTOSIZE_USEHEADER)
    EndIf
  EndIf
EndProcedure

OpenWindow_Window_0()

Repeat
  Select WaitWindowEvent()
      ; ///////////////////
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #ListIcon_0
          If EventType()=#PB_EventType_LeftClick
            Chaine.s=Fc_ComparaisonEtatCoches()
            If Chaine<>""
              Debug "La(les) ligne(s) "+Chaine+" a(ont) été cochée(s)"
            EndIf
          EndIf
      EndSelect
      ; ////////////////////////
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #Window_0
          CloseWindow(#Window_0)
          Break
      EndSelect
  EndSelect
ForEver
;
;}
Il faut juste penser, si ton code prévoit l'ajout ou la suppression de lignes dans la ListIcon, à gérer en conséquence le tableau.
Et pourquoi ne pas, si chaque ligne est une valeur unique, utiliser une Map...

PS : Au fait, pourquoi inclure les constantes des fenêtres et des gadgets dans la même Enumeration ??? La valeur des unes est indépendante des autres et peuvent être identiques...

Re: ListIconGadget et CheckBox....

Publié : ven. 02/juil./2010 7:25
par Le Soldat Inconnu
j'ai un truc dans genre, pour les treegadget, afin de savoir si un item est plié ou déplié car ca donne le même souci, PB ne renvoie pas la ligne

Code : Tout sélectionner

Procedure.l TreeGadget_Callback(hwnd, uMsg, wParam, lParam)
	Protected *pnmtv.NM_TREEVIEW
	Select uMsg
		Case #WM_NOTIFY
			*pnmtv = lParam
			Select *pnmtv\hdr\code
				Case #TVN_ITEMEXPANDED
					TreeGadget_Item = *pnmtv\itemNew\lParam
					Select *pnmtv\action
						Case 1
							If GetGadgetItemState(#Panneau_Arbre, TreeGadget_Item) & #PB_Tree_Collapsed
								TreeGadget_ItemExpanded = 1
							EndIf
						Case 2
							If GetGadgetItemState(#Panneau_Arbre, TreeGadget_Item) & #PB_Tree_Expanded
								TreeGadget_ItemExpanded = 2
							EndIf
					EndSelect
					
			EndSelect
	EndSelect
	
	ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
c'est un callback sur le gadget

donc il faut adapter pour une listicon, on doit pouvoir trouver un truc similaire

Re: ListIconGadget et CheckBox....

Publié : sam. 03/juil./2010 7:10
par boddhi
J'ai retrouvé dans mes sources un code que j'avais créé pour un ComboBox et qui fonctionne également avec un ListIcon :

Code : Tout sélectionner

Procedure.l Fc_WindowCallback(ArgGadget.l,ArgMsg.l,ArgWParam.l,ArgLParam.l) ; Gestion CallBack de le fenêtre principale
  Define.l Resultat
  Define.NMHDR *NMH
  Define.NM_LISTVIEW *NMLV
  Define.LV_ITEM *LVI
   Resultat=#PB_ProcessPureBasicEvents
   Select ArgMsg
     Case #WM_NOTIFY
       *nmh=ArgLParam
       If *nmh\hwndFrom=GadgetID(#ListIcon_0)
         Select *nmh\code
           Case #LVN_ITEMCHANGING
             *NMLV.NM_LISTVIEW=ArgLParam
             If *NMLV\uChanged=#LVIF_STATE
               ; ---- Ancien Statut
               Debug *NMLV\uOldState
               Debug *NMLV\iItem
               Select *NMLV\uOldState
                 ;Case #CB_Enabled_NoCheck:Debug "Ancien état : NoCheck"
                 ;Case #CB_Enabled_Check:Debug "Ancien état : Check"
                 Default:Resultat=#False
               EndSelect
               ; ---- Nouveau Statut
               Debug *NMLV\uNewState
               Debug *NMLV\iItem
               Select *NMLV\uNewState
                 ;Case #CB_Enabled_NoCheck:Debug "Nouvel état : NoCheck"
                 ;Case #CB_Enabled_Check:Debug "Nouvel état : Check"
               EndSelect
             EndIf
         EndSelect
       EndIf
   EndSelect
   ProcedureReturn Resultat
EndProcedure

Re: ListIconGadget et CheckBox....

Publié : sam. 03/juil./2010 9:55
par Ar-S
Yop yop, merci à tous.
j'ai eu une solution efficace de srod sur le fofo us. (même technique que toi boddhi)
Je vous la poste aussi.

Code : Tout sélectionner

Enumeration
  #Window_0
  #ListIcon_0
EndEnumeration

Procedure.i callback(hWnd, uMsg, wParam, lParam)
  Protected *nmlv.NM_LISTVIEW
  Select uMsg
    Case #WM_NOTIFY
      *nmlv = lParam
      If *nmlv\hdr\code = #LVN_ITEMCHANGED And *nmlv\hdr\hwndFrom = GadgetID(#ListIcon_0)
        If *nmlv\uOldState & #LVIS_STATEIMAGEMASK <> 0 And *nmlv\uNewState & #LVIS_STATEIMAGEMASK
          If (*nmlv\uNewState & #LVIS_STATEIMAGEMASK)>>12 = 1
            Debug "Item " + Str(*nmlv\iItem) + " unchecked!"
          Else
            Debug "Item " + Str(*nmlv\iItem) + " checked!"
          EndIf
        EndIf
      EndIf
  EndSelect
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 450, 200, 450, 277, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    If CreateGadgetList(WindowID(#Window_0))
      ListIconGadget(#ListIcon_0, 10, 10, 425, 260, "Gadget_0", 100, #PB_ListIcon_CheckBoxes|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
      For i =0 To 8
        AddGadgetItem(#ListIcon_0,-1,Str(i))
      Next 
      SendMessage_(GadgetID(#ListIcon_0), #LVM_SETCOLUMNWIDTH, 0, #LVSCW_AUTOSIZE_USEHEADER)
    EndIf
  EndIf
EndProcedure

OpenWindow_Window_0()

SetWindowCallback(@callback())

Repeat
  Select WaitWindowEvent()
  Case #PB_Event_CloseWindow
    Select EventWindow()
      Case #Window_0
        CloseWindow(#Window_0)
      Break
    EndSelect
  EndSelect
ForEver

Re: [resolu] ListIconGadget et CheckBox....

Publié : sam. 03/juil./2010 21:59
par boddhi
Content d'avoir pu t'aider :D et merci du partage... Je ne connaissais pas l'usage de LVIS_STATEIMAGEMASK