listview decouverte

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Patix
Messages : 102
Inscription : ven. 19/nov./2004 14:17

listview decouverte

Message par Patix »

Bonjour

je voudrais afficher le nom du fichier choisi quand je clique dans le gadget listview.
Je ne comprends pas pourquoi ça ne marche pas !

Code : Tout sélectionner

; ------------------------------------------------------------
 Fichiers Listing Excel

; ------------------------------------------------------------
;
Enumeration   
#WindowWidth  = 450
#WindowHeight = 305
EndEnumeration

Procedure Liste_dossier()
         If ExamineDirectory(0, GetGadgetText(0), "*.xls*")

          While NextDirectoryEntry(0)

            FileName$ = DirectoryEntryName(0)
            If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory
              FileName$ = "[DIR] "+FileName$
            EndIf
            
            AddGadgetItem(2, -1, FileName$)
            
          Wend
        Else
          MessageRequester("Erreur","Impossible d'examiner le dossier: "+GetGadgetText(0),0)
        EndIf          
EndProcedure  


If OpenWindow(0, 100, 200, #WindowWidth, #WindowHeight, "Sofetec - Fichiers Listing Excel")


  StringGadget  (0,  10, 10, 202, 24, GetCurrentDirectory())
  ButtonGadget  (1, 220, 10, 60 , 24, "List")
  ListViewGadget(2,  10, 40, 270, 150)
  StringGadget  (4,  10, 195, 202, 24, "rien")
  ;ImageGadget      (0, 200, 5, 0, 0, ImageID(2))
 ; SetGadgetText(4, "Initialisation Ok... Bienvenue !")
  
  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_Gadget

        ClearGadgetItems(2)  ; Clear all the items found in the ListView
        
        Liste_dossier()
         
      Select EventGadget()
        Case 1
          MessageRequester("Information", "xxxxxx", 0)
       
          
        Case 2
          ;SetGadgetText(2, "ViewGadget. Item selected: "+Str(GetGadgetState(2)))
          
          If EventType() = #PB_EventType_LeftClick 
            MessageRequester("Information", "Doubleclick: item"+Str(GetGadgetState(2))+", Text: "+GetGadgetText(2) , 0)
          ElseIf EventType() = 1
            DisplayPopupMenu(0, WindowID(0))
          EndIf
          
     EndSelect        
        
    EndIf

  Until Event = #PB_Event_CloseWindow

EndIf

; End 
Avatar de l’utilisateur
Mindphazer
Messages : 694
Inscription : mer. 24/août/2005 10:42

Re: listview decouverte

Message par Mindphazer »

Il faut que tu mettes l'appel de ta procédure Liste_Dossier() en dehors de ta boucle d'évènements (juste avant)
Bureau : Win10 64bits
Maison : Macbook Pro M3 16" SSD 512 Go / Ram 24 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: listview decouverte

Message par falsam »

Et supprimer ClearGadgetItems(2).
Dans ton code quelques soit l’événement sur n'importe quel gadget, tu vides ta liste de tes dossiers.
If Event = #PB_Event_Gadget
ClearGadgetItems(2) ; Clear all the items found in the ListView
La procédure Liste_dossier() n'est pas top non plus.

En examinant un dossier contenant que des xls, je pense que tu n'auras jamais les dossiers inclus dans le dossier en cours d'examen. Mais peut etre que c'est vraiment ce que tu veux.

Ton code légèrement modifié

Code : Tout sélectionner

; ------------------------------------------------------------
;Fichiers Listing Excel

; ------------------------------------------------------------
;
Enumeration   
  #WindowWidth  = 450
  #WindowHeight = 305
EndEnumeration

Procedure Liste_dossier()
  Protected Type$
  
  If ExamineDirectory(0, GetGadgetText(0), "*.*")  
    While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory
        Type$ = DirectoryEntryName(0)
      EndIf
     AddGadgetItem(2, -1, Type$)
    Wend
    FinishDirectory(0)
  EndIf
EndProcedure  


If OpenWindow(0, 100, 200, #WindowWidth, #WindowHeight, "Sofetec - Fichiers Listing Excel")
  StringGadget  (0,  10, 10, 202, 24, GetCurrentDirectory())
  ButtonGadget  (1, 220, 10, 60 , 24, "List")
  ListViewGadget(2,  10, 40, 270, 150)
  StringGadget  (4,  10, 195, 202, 24, "rien")
  ;ImageGadget      (0, 200, 5, 0, 0, ImageID(2))
  ; SetGadgetText(4, "Initialisation Ok... Bienvenue !")
  
  Liste_dossier()
  
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget      
      Select EventGadget()
        Case 1
          ;MessageRequester("Information", "xxxxxx", 0)
          
          
        Case 2
          ;SetGadgetText(2, "ViewGadget. Item selected: "+Str(GetGadgetState(2)))
          
          If EventType() = #PB_EventType_LeftClick 
            ;MessageRequester("Information", "Doubleclick: item"+Str(GetGadgetState(2))+", Text: "+GetGadgetText(2) , 0)
          ElseIf EventType() = 1
            DisplayPopupMenu(0, WindowID(0))
          EndIf
          
      EndSelect        
      
    EndIf
    
  Until Event = #PB_Event_CloseWindow
  
EndIf
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: listview decouverte

Message par Marc56 »

À moins que tu ne veuilles faire une liste très personnalisée, tu as un gadget tout prêt pour lister les fichiers:

ExplorerListGadget()

Tu peux supprimer toute ta fonction Liste_dossier()

Code : Tout sélectionner

  
;ListViewGadget(2,  10, 40, 270, 150)
ExplorerListGadget(2, 10, 40, 270, 150, GetGadgetText(0))
+ 16 fonctions et 6 évènements associés (voir remarque dans l'aide)

:wink:
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: listview decouverte

Message par Ar-S »

ExplorerListGadget() est effectivement dédié et pratique.
Si tu souhaites garder la listview() : Regarde du coté de GetGadgetItemText()

Petit exemple avec celui de la doc remanié en utilisant le callback BindGadgetEvent

Code : Tout sélectionner

Declare ZeList()
Declare CheckList()


;///////// PROCEDURES QUI NOUS SERVIRONT DANS LE PROGRAMME //////////////////
; Creation de la liste
Procedure ZeList()
  For a=0 To 11
      AddGadgetItem (0,-1,"Elément "+Str(a)+" de la boîte à liste")   ; défini le contenu de la boîte de liste
    Next
EndProcedure

; Surveillance du clic
Procedure CheckClic()
  Elem = GetGadgetState(0)
  Debug "Elément n°"+ Str(Elem)
   Debug "Txt : "+ GetGadgetItemText(0,Elem)
EndProcedure
;//////////////////////////////////////////////////////////////////////////////



; ////////////////////////// DEBUT DU PROGRAMME /////////////////////////////////

If OpenWindow(0,0,0,270,140,"ListViewGadget",#PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
    ListViewGadget(0,10,10,250,120)
    ; Remplissage
    ZeList()
    SetGadgetState(0,9)    ; sélectionne le dixième élément (la numérotation commmence à 0)
    
    ; Le callback qui surveille le clic dans la listview
    BindGadgetEvent(0,@CheckClic(),#PB_EventType_LeftClick)
    
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf
;//////////////////////////////////////////////////////////////////////////////
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: listview decouverte

Message par Marc56 »

Quelques exemples pour l'utilisation des sélecteurs de fichiers et répertoires

Code : Tout sélectionner

; Pour ne pas faire de fautes de frappe, obligons-nous à déclarer toutes les variables
EnableExplicit

; On laisse PB attribuer des numéros aux gadgets
Enumeration 
     #Win
     #Txt_Rep
     #Btn_List
     #List_Dir
     #File_Name
     #Path_Req
EndEnumeration

; Pour faire lisible, on peut couper après chaque , 
OpenWindow(#Win, 100, 200, 450, 305, 
           "Sofetec - Fichiers Listing Excel", 
           #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

; Répertoire de départ et type de fichiers à lister
Define Start_Dir.s = GetCurrentDirectory() + "*.xls*"

StringGadget(#Txt_Rep,  30, 10, 187, 24, Start_Dir)
ButtonGadget(#Btn_List, 220, 10, 60 , 24, "List")
ButtonGadget(#Path_Req, 10, 10, 20, 24, "...")
ExplorerListGadget(#List_Dir,  10, 40, 270, 150, Start_Dir)
StringGadget(#File_Name,  10, 195, 202, 24, "")


; Note: le double-clic sur un *répertoire* est géré en interne par le gadget lui-même
; Le cas "#PB_EventType_LeftDoubleClick" n'est donc utilisable que pour un fichier
; on récupère donc le nom du répertoire sélectionné au changement sur le gadget avec #PB_EventType_Change

Repeat
     Select WaitWindowEvent()
          Case #PB_Event_CloseWindow              ; Case de fermeture de la fenêtre
               End                                ; Bye     
               
          Case #PB_Event_Gadget                   ; Clic sur un gadget
               Select EventGadget()               ; Lequel ?
                         
                    Case #Path_Req
                         ; Clic sur [...] Sélection d'un répertoire par dialogue
                         Define New_Dir.s = PathRequester("Répertoire", Start_Dir) 
                         ; Si l'utilisateur a validé un répertoire
                         If New_Dir <> ""
                              SetGadgetText(#List_Dir, New_Dir + "*.xls*")
                         EndIf  
                         
                    Case #Btn_List
                         ; L'utilisateur a entré un chemin manuel. S'il existe on le sélectionne
                         If FileSize(GetGadgetText(#Txt_Rep)) = -2 
                              SetGadgetText(#List_Dir, GetGadgetText(#Txt_Rep)) 
                         Else
                              MessageRequester("Erreur", 
                                               "Désolé, ce répertoire n'existe pas", 
                                               #PB_MessageRequester_Error) 
                         EndIf
                         
                    Case #List_Dir                ; La liste des fichiers    
                         Select EventType()       ; Que s'est il passé ?
                                   
                              Case #PB_EventType_Change  
                                   ; Le répertoire à changé 
                                   SetGadgetText(#Txt_Rep, GetGadgetText(#List_Dir))
                                   
                              Case #PB_EventType_LeftDoubleClick
                                   ; Doucle clic (sur un fichier)
                                   ; Affiche le nom complet du fichier sélectionné
                                   SetGadgetText(#File_Name, 
                                                 GetGadgetText(#List_Dir) + 
                                                 GetGadgetItemText(#List_Dir, GetGadgetState(#List_Dir)))
                         EndSelect
               EndSelect
               
     EndSelect
ForEver

; L'intérêt de l'ExplorerListGadget est qu'il est aussi gérable au clavier.
:wink:
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: listview decouverte

Message par Marc56 »

Note: le début de ton premier code

Code : Tout sélectionner

Enumeration   
#WindowWidth  = 450
#WindowHeight = 305
EndEnumeration
N'est pas faux, mais Enumeration ne sert à rien dans ce cas.
Ça, c'est suffisant

Code : Tout sélectionner

#WindowWidth  = 450
#WindowHeight = 305
Enumeration sert à numéroter automatiquement (par incrementation) des objets quand on ne veut pas ce préoccuper des numéros.

Sinon, pour juste sélectionner une ligne dans une listeview
Il faut d'abord récupérer le numéro de la ligne
Num_Line = GetGadgetState(#Lst)
Puis ensuite on peut avoir le texte de la ligne
GetGadgetItemText(#Lst, Num_Line)
Donc directement
GetGadgetItemText(#Lst, GetGadgetState(#Lst))

Code : Tout sélectionner

EnableExplicit

Enumeration 
     #Win
     #Lst
     #Txt
EndEnumeration

OpenWindow     (#Win,  0,   0, 500, 300, "", 
                #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget (#Lst, 10,  10, 480, 260)
StringGadget   (#Txt, 10, 275, 480,  20, "")

Define i.a
For i = 0 To 30
     AddGadgetItem(#Lst, -1, "Ligne " + Str(i))
Next

Repeat
     Select WaitWindowEvent() 
          Case #PB_Event_CloseWindow 
               End
          Case #PB_Event_Gadget
               If EventGadget() = #Lst 
                    Select EventType()
                              
                         Case #PB_EventType_LeftClick , 
                              #PB_EventType_LeftDoubleClick
                              ; Simple ou double clic
                              ; Récupérer le numéro de la ligne sélectionnée
                              Define Num_Line   = GetGadgetState(#Lst)
                              ; Mettre le texte de la ligne sélectionnée
                              SetGadgetText(#Txt, GetGadgetItemText(#Lst, Num_Line))
                              
                         Case #PB_EventType_RightClick
                              ; Clic droit (pourrait être un menu)
                              MessageRequester("Information", 
                                               "Ligne sélectionnée: N° " + 
                                               GetGadgetState(#Lst))
                              
                    EndSelect
               EndIf               
     EndSelect 
ForEver
:wink:
Patix
Messages : 102
Inscription : ven. 19/nov./2004 14:17

Re: listview decouverte

Message par Patix »

Merci à Tous pour vos réponses.

Vais regarder cela de près 8)
Répondre