Page 1 sur 1

ListIconGadget (Doublon en cliquant sur une ligne) [Résolu]

Publié : jeu. 08/janv./2009 20:30
par Geo Trouvpatou
Bonsoir à tous.

Comme écrit dans mon message, lorsque je teste mon code avec le débuggeur activé, j'ai un doublon d'information en cliquant sur une ligne du ListIconGadget.

Le but étant qu'en cliquant sur une ligne cela mette le nom dans le stringGadget.
Cela fonctionne très bien hormis ce petit problème.

Au début j'ai cru que c'était parce que j'avais 2 colonnes, j'en ai donc ajouté une 3ème, mais cela ne vient pas de ça.

Voici le code :

Code : Tout sélectionner

EnableExplicit

;{- Enumerations / DataSections
;{ Windows
Enumeration
    #Window_main
EndEnumeration
;}
;{ Gadgets
Enumeration
    #ListIcon
    #String
EndEnumeration
;}
Define.l Element, Event, EventWindow, EventGadget, EventType, EventMenu
Define Resultat$
;}
Procedure OpenWindow_Window_main()
    If OpenWindow(#Window_main, 100, 100, 362, 162, "Test", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
        ListIconGadget(#ListIcon, 8, 8, 344, 120, "Nom", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect)
        AddGadgetColumn(#ListIcon, 1, "Adresse", 200)
        ;AddGadgetColumn(#ListIcon, 2, "Bidon", 50) ; Test avec une 3ème colonne.
        StringGadget(#String, 8, 136, 344, 20, "")
        
        ; Sans image
        AddGadgetItem(#ListIcon, -1, "Toto" + Chr(10) + "24 rue truc")
        AddGadgetItem(#ListIcon, -1, "Pierre" + Chr(10) + "104 rue du général")
        AddGadgetItem(#ListIcon, -1, "Sylvain" + Chr(10) + "55 avenue bidule")
        AddGadgetItem(#ListIcon, -1, "Marcel" + Chr(10) + "12 chemin de la patte verte")
        
        ; Avec image
        ; If LoadImage(0, "directory32x32.bmp")     ; changez le chemin/fichier contenant votre image 32x32 pixel
        ; 
        ; AddGadgetItem(#ListIcon, -1, "Toto" + Chr(10) + "24 rue truc", ImageID(0))
        ; AddGadgetItem(#ListIcon, -1, "Pierre" + Chr(10) + "104 rue du général", ImageID(0))
        ; AddGadgetItem(#ListIcon, -1, "Sylvain" + Chr(10) + "55 avenue bidule", ImageID(0))
        ; AddGadgetItem(#ListIcon, -1, "Marcel" + Chr(10) + "12 chemin de la patte verte", ImageID(0))    
        ; 
        ; EndIf
        
    EndIf
EndProcedure

OpenWindow_Window_main()

;{- Event loop
Repeat
    Event = WaitWindowEvent()
    Select Event
            ; ///////////////////
        Case #PB_Event_Gadget
            EventGadget = EventGadget()
            EventType = EventType()
            
            If EventGadget = #ListIcon
                
                ; Permet de savoir sur quelle ligne on a cliqué (commence à 0)
                Element = GetGadgetState(#ListIcon)
                Debug Element   ;;;;;;;;;;;;;;;;; Ici il y a le fameux doublon d'information.   
                ;Debug GetGadgetState(#ListIcon)
                
                ; On affiche le texte de la 1ère colonne cliquée, 
                ; sauf si on clique sur une ligne vide.
                If Element <> -1
                    Resultat$ = GetGadgetItemText(#ListIcon, Element)
                    Debug Resultat$
                    
                    ; On envoi le résultat dans le string Gadget.
                    SetGadgetText(#String, Resultat$)
                   
                Else
                    ; Si on clique sur une ligne vide, on vide le champ du string Gadget
                    SetGadgetText(#String, "") 
                EndIf
                
                ;ElseIf EventGadget = #String
            EndIf
            
            ; ////////////////////////
        Case #PB_Event_CloseWindow
            EventWindow = EventWindow()
            If EventWindow = #Window_main
                CloseWindow(#Window_main)
                Break
            EndIf
    EndSelect
ForEver
;
;}
Bye.

PS : est-ce que c'est propre ma façon de faire avec le Define Resultat$ ?

Publié : ven. 09/janv./2009 10:54
par kwandjeen
Solution barbare, moi je bidouille :)

Code : Tout sélectionner

Define memo_select = -2

;dans la boucle principale je rajoute une condition

            If EventGadget = #ListIcon And memo_select<>GetGadgetState(#ListIcon) ;ici je verifie que l'on ai changé de sélection
               
                ; Permet de savoir sur quelle ligne on a cliqué (commence à 0)
                Element = GetGadgetState(#ListIcon)
                Debug Element   ;;;;;;;;;;;;;;;;; Ici il y a le fameux doublon d'information.   
                ;Debug GetGadgetState(#ListIcon)
               
                ; On affiche le texte de la 1ère colonne cliquée,
                ; sauf si on clique sur une ligne vide.
                If Element <> -1
                    Resultat$ = GetGadgetItemText(#ListIcon, Element)
                    Debug Resultat$
                   
                    ; On envoi le résultat dans le string Gadget.
                    SetGadgetText(#String, Resultat$)
                   
                Else
                    ; Si on clique sur une ligne vide, on vide le champ du string Gadget
                    SetGadgetText(#String, "")
                EndIf
               memo_select = GetGadgetState(#ListIcon)
                ;ElseIf EventGadget = #String
            EndIf
Ce n'est pas très cathodique ^^ mais le tout est que ça marche. Une grosse tête qui pourrait nous donner un tuyau ? :)

Publié : ven. 09/janv./2009 11:40
par Geo Trouvpatou
Salut.

En essayant ton truc kwandjeen, ça me tracassait quand même, parce que voulant faire un petit client FTP, il fallait aussi que les double-clics passent.

Inconvénient de ton système, c'est que si je clique sur Toto et qu'ensuite je veuille faire un double-clic sur Toto pour entrer dans le dossier cela ne pouvait pas fonctionner.

Alors en cherchant (un peu mieux) dans la doc j'ai carrément trouvé MA solution.
A croire que la doc a été écrite spécialement pour mon cas de figure.
Il fallait chercher à "EventType()" il y a un exemple avec un "ListIconGadget"

Au moins cela gèrera les simple/double clics Gauche et Droit.

En tout cas merci de t'être penché sur mon problème.
Mais je ne sais pas ce qu'aurait donné du code de barbare et de petit goret :lol:

Ceci dit il faut quand même que je teste le truc.
Si cela fonctionne je mettrait la solution.

Bye.

Publié : ven. 09/janv./2009 11:41
par Le Soldat Inconnu
comme ça :)

Code : Tout sélectionner

EnableExplicit 

;{- Enumerations / DataSections 
;{ Windows 
Enumeration 
  #Window_main 
EndEnumeration 
;} 
;{ Gadgets 
Enumeration 
  #ListIcon 
  #String 
EndEnumeration 
;} 
Define.l Element, Event, EventWindow, EventGadget, EventType, EventMenu 
Define Resultat$ 
;} 
Procedure OpenWindow_Window_main() 
  If OpenWindow(#Window_main, 100, 100, 362, 162, "Test", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar) 
    ListIconGadget(#ListIcon, 8, 8, 344, 120, "Nom", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect) 
    AddGadgetColumn(#ListIcon, 1, "Adresse", 200) 
    ;AddGadgetColumn(#ListIcon, 2, "Bidon", 50) ; Test avec une 3ème colonne. 
    StringGadget(#String, 8, 136, 344, 20, "") 
    
    ; Sans image 
    AddGadgetItem(#ListIcon, -1, "Toto" + Chr(10) + "24 rue truc") 
    AddGadgetItem(#ListIcon, -1, "Pierre" + Chr(10) + "104 rue du général") 
    AddGadgetItem(#ListIcon, -1, "Sylvain" + Chr(10) + "55 avenue bidule") 
    AddGadgetItem(#ListIcon, -1, "Marcel" + Chr(10) + "12 chemin de la patte verte") 
    
    ; Avec image 
    ; If LoadImage(0, "directory32x32.bmp")     ; changez le chemin/fichier contenant votre image 32x32 pixel 
    ; 
    ; AddGadgetItem(#ListIcon, -1, "Toto" + Chr(10) + "24 rue truc", ImageID(0)) 
    ; AddGadgetItem(#ListIcon, -1, "Pierre" + Chr(10) + "104 rue du général", ImageID(0)) 
    ; AddGadgetItem(#ListIcon, -1, "Sylvain" + Chr(10) + "55 avenue bidule", ImageID(0)) 
    ; AddGadgetItem(#ListIcon, -1, "Marcel" + Chr(10) + "12 chemin de la patte verte", ImageID(0))    
    ; 
    ; EndIf 
    
  EndIf 
EndProcedure 

OpenWindow_Window_main() 

;{- Event loop 
Repeat 
  Event = WaitWindowEvent() 
  Select Event 
      ; /////////////////// 
    Case #PB_Event_Gadget 
      Select EventGadget()
        Case #ListIcon 
          Select EventType()
            Case #PB_EventType_Change;, #PB_EventType_LeftClick
              ; Permet de savoir sur quelle ligne on a cliqué (commence à 0) 
              Element = GetGadgetState(#ListIcon) 
              Debug Element   ;;;;;;;;;;;;;;;;; Ici il y a le fameux doublon d'information.    
              ;Debug GetGadgetState(#ListIcon) 
              
              ; On affiche le texte de la 1ère colonne cliquée, 
              ; sauf si on clique sur une ligne vide. 
              If Element <> -1 
                Resultat$ = GetGadgetItemText(#ListIcon, Element) 
                Debug Resultat$ 
                
                ; On envoi le résultat dans le string Gadget. 
                SetGadgetText(#String, Resultat$) 
                
              Else 
                ; Si on clique sur une ligne vide, on vide le champ du string Gadget 
                SetGadgetText(#String, "") 
              EndIf 
          EndSelect
          
      EndSelect 
      
      ; //////////////////////// 
    Case #PB_Event_CloseWindow 
      EventWindow = EventWindow() 
      If EventWindow = #Window_main 
        CloseWindow(#Window_main) 
        Break 
      EndIf 
  EndSelect 
ForEver 
; 
;}

Publié : ven. 09/janv./2009 11:50
par Geo Trouvpatou
Salut Soldat Inconnu.

Arrrgghhhh!!!! damned nos posts se sont croisés.
Bon je suis content d'avoir trouvé la solution à mon problème dans la doc.

Mais pas trop content de t'avoir fait perdre un peu de ton temps Soldat.

Malgré tout, ton code m'épargnera de me prendre un peu la tête.

Merci à toi.

Bye.