[OK] Soucis selection multiple dans un ExplorerListGadget()

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

[OK] Soucis selection multiple dans un ExplorerListGadget()

Message par Ar-S »

Bonjour.

1ère galère PBiesque de 2012.

J'ai un explorerlistgadget.

Code : Tout sélectionner

; la liste
Global NewList files_PC.s()

; L'explorer
ExplorerListGadget(#ListPC, 3, 240, 285, 340, LastPath$,#PB_Explorer_List|#PB_Explorer_GridLines|#PB_Explorer_NoDriveRequester|#PB_Explorer_AlwaysShowSelection|#PB_Explorer_MultiSelect)

; boutons
ButtonGadget(#BT, 5, 360, 230, 25, "Gadget_1")

En utilisant CTRL, j'obtiens bien une sélection multiple. J'aimerai maintenant enregistrer ces éléments dans ma liste en appuyant sur un bouton. (#BT)

C'est là que le bas blesse.

Je n'arrive pas a ne détecter QUE les fichiers sélectionnés. Que ce soit via #PB_Explorer_Selected (que je n'utilise surement pas bien), ou autre GetGadgetItemState(), GetGadgetState(). Bref ça commence à me broyer les c....... comme dirait Cartman.

Voilà ma proce telle qu'elle est (foireuse avec le #PB_Explorer_Selected)...

Code : Tout sélectionner

;- ---------------------------------------------------
;- > AddFilePath()
;- ---------------------------------------------------
Procedure AddFilePath()
  ClearList(files_PC())
  Max = CountGadgetItems(#ListPC)
  Debug Max
  
  For NumF = 0 To Max-1
    If GetGadgetItemState(#ListPC,NumF) & #PB_Explorer_Selected 
   
      NomF$=NewPath$+GetGadgetItemText(#ListPC, NumF)
      AddElement(files_PC())
      files_PC() = NomFS$
      Debug Str(Item) + NomF$
    EndIf
    NumF + 1
    
  Next
  
  ;-test a virer
  ForEach files_PC()
    Debug files_PC()
  Next
  
EndProcedure

D'avance merci.
Je bloque dessus depuis hier soir et je commence à saturer. (bloquer par ce genre de connerie m'exaspère).
Dernière modification par Ar-S le lun. 09/janv./2012 23:03, modifié 1 fois.
~~~~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
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Soucis de selection multiple dans un ExplorerListGadget(

Message par Kwai chang caine »

Si ça peut t'aider, moi j'ai ça sur le sujet, mais avec des ExplorerTreeGadget
J'sais pas si ça a le même comportement ??? :roll:

Codes de SHARDIK

Code : Tout sélectionner

EnableExplicit

#Button = 0
#ExplorerTree = 1
#Window = 0

Procedure HighlightItem(HighlightFlag)
  Protected ItemHandle
  Protected TVHitTest.TV_HITTESTINFO
  Protected TVItem.TV_ITEM

  TVHitTest\Pt\x = WindowMouseX(#Window) - GadgetX(#ExplorerTree)
  TVHitTest\Pt\y = WindowMouseY(#Window) - GadgetY(#ExplorerTree)

  ItemHandle = SendMessage_(GadgetID(#ExplorerTree), #TVM_HITTEST, 0, @TVHitTest)

  If ItemHandle <> 0
    If TVHitTest\Flags <> #TVHT_ONITEMBUTTON
      TVItem\Mask = #TVIF_STATE
      TVItem\hItem = ItemHandle

      If HighlightFlag = #True
        TVItem\StateMask = #TVIS_DROPHILITED
        TVItem\State = #TVIS_DROPHILITED
      Else
        TVItem\StateMask = #TVIS_DROPHILITED | #TVIS_SELECTED
        TVItem\State = 0
      EndIf

      SendMessage_(GadgetID(#ExplorerTree), #TVM_SETITEM, 0, @TVItem)

      RedrawWindow_(GadgetID(#ExplorerTree), 0, 0, #RDW_UPDATENOW)

      ProcedureReturn #True
    EndIf
  EndIf

  ProcedureReturn #False
EndProcedure


Define EntryFound
Define i
Define Msg.S
Define WindowEvent

NewList SelectedItems.S()

If OpenWindow(#Window, 0, 0, 321, 330, "MultiSelect-Demo", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
  ExplorerTreeGadget(#ExplorerTree, 9, 12, 303, 279, "", #PB_Explorer_NoMyDocuments)
  SetWindowLong_(GadgetID(#ExplorerTree), #GWL_STYLE, GetWindowLong_(GadgetID(#ExplorerTree), #GWL_STYLE) | #TVS_DISABLEDRAGDROP)
  ButtonGadget(#Button, 80, 300, 150, 20, "Display selected files")

  Repeat
    WindowEvent = WaitWindowEvent()

    If EventType() = #PB_EventType_LeftClick
      If WindowEvent = #PB_Event_Gadget And EventGadget() = #Button
        Break
      EndIf

      If GetGadgetState(#ExplorerTree) = #PB_Explorer_File
        EntryFound = #False

        If ListSize(SelectedItems()) = 0
          If HighlightItem(#True) = #True
            AddElement(SelectedItems())
            SelectedItems() = GetGadgetText(#ExplorerTree)
          EndIf
        Else             
          FirstElement(SelectedItems())
         
          Repeat
            If SelectedItems() = GetGadgetText(#ExplorerTree)
              If HighlightItem(#False) = #True
                DeleteElement(SelectedItems())
                EntryFound = #True
              EndIf

              Break
            EndIf
          Until NextElement(SelectedItems()) = #False

          If EntryFound = #False
            If HighlightItem(#True) = #True
              AddElement(SelectedItems())
              SelectedItems() = GetGadgetText(#ExplorerTree)
            EndIf
          EndIf
        EndIf
      EndIf
    EndIf
  Until WindowEvent = #PB_Event_CloseWindow
   
  If ListSize(SelectedItems()) > 0
    Msg = "Number of selected files: " + Str(ListSize(SelectedItems())) + #CR$ + #CR$
     
    FirstElement(SelectedItems())

    For i = 1 To ListSize(SelectedItems())
      Msg = Msg + SelectedItems() + Chr(13)
      NextElement(SelectedItems())
    Next i
     
    MessageRequester("Info", Msg)
  Else
    MessageRequester("Info", "No Files were selected!")
  EndIf
EndIf
Et aussi

Code : Tout sélectionner

#FileTree = 1
#List = 2
#Button = 3

#TVS_CHECKBOXES = $100

; rekursiver scan durch das explorertreegadget:
Procedure ScanTree(hItem)

  hItem = SendMessage_(GadgetID(#FileTree), #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
  While hItem

    ; daten über das item lesen
    item.TV_ITEM\mask = #TVIF_CHILDREN|#TVIF_HANDLE|#TVIF_STATE
    item\hItem = hItem
    item\statemask = #TVIS_STATEIMAGEMASK
    SendMessage_(GadgetID(#FileTree), #TVM_GETITEM, 0, @item)
   
    ; ist die checkbox gesetzt??
    If ((item\state >> 12) -1)
     
      ; item selektieren, um per GetGAdgetText(#FileTree) den pfad zu bekommen
      SendMessage_(GadgetID(#FileTree), #TVM_SELECTITEM, #TVGN_CARET, hItem)
     
      ; Pfad abspeichern
      AddGadgetItem(#List, -1, GetGadgetText(#FileTree))
    EndIf
   
    ; wenn das item childitems hat, suche dort fortsetzen:
    If item\cChildren > 0
      ScanTree(hItem)
    EndIf
   
    ; nextes item
    hItem = SendMessage_(GadgetID(#FileTree), #TVM_GETNEXTITEM, #TVGN_NEXT, hItem)
  Wend

EndProcedure


If OpenWindow(0, 0, 0, 300, 600, "Path Requester", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    ExplorerTreeGadget(#FileTree, 5, 5, 290, 275, "", #PB_Explorer_NoFiles)
   
    ; checkboxes aktivieren
    styles = GetWindowLong_(GadgetID(#FileTree), #GWL_STYLE)
    SetWindowLong_(GadgetID(#FileTree), #GWL_STYLE, styles | #TVS_CHECKBOXES)
   
    ButtonGadget(#Button, 215, 285, 80, 20, "Ok")
    ListViewGadget(#List, 5, 310, 290, 285)
   
    Repeat
      Event = WaitWindowEvent()
     
      If Event = #PB_Event_Gadget And EventGadget() = #Button
     
        ClearGadgetItemList(#List)
       
        ; das selektierte item wird beim scan verändert -> abspeichern
        selected = SendMessage_(GadgetID(#FileTree), #TVM_GETNEXTITEM, #TVGN_CARET, 0)               
       
        ; suche beim root item starten
        root = SendMessage_(GadgetID(#FileTree), #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
       
        ; rekursiven scan durch alle items und childitems
        ScanTree(root)
       
        ; selektiertes item zurücksetzen
        SendMessage_(GadgetID(#FileTree), #TVM_SELECTITEM, #TVGN_CARET, selected)
       
     
      EndIf
     
    Until Event = #PB_Event_CloseWindow
   EndIf
End
Codes de FREAK

Code : Tout sélectionner

LVM_SETEXTENDEDLISTVIEWSTYLE = #LVM_FIRST + 54
#LVS_EX_CHECKBOXES = 4

#Explorer = 0
#Button = 1
#List = 2

If OpenWindow(0, 0, 0, 600, 600, "", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  If CreateGadgetList(WindowID(0))   
   
    ExplorerListGadget(#Explorer, 5, 5, 590, 380, "C:\")
   
    ; Enable the checkboxes in the Explorergadget:
    SendMessage_(GadgetID(#Explorer), #LVM_SETEXTENDEDLISTVIEWSTYLE, #LVS_EX_CHECKBOXES, #LVS_EX_CHECKBOXES)   
   
    ; for the test
    ButtonGadget(#Button, 5, 390, 80, 20, "Show selected")
    ListViewGadget(#List, 5, 415, 590, 180)
           
    Repeat
      Event = WaitWindowEvent()
     
      If Event = #PB_Event_Gadget And EventGadget() = #Button
     
        ClearGadgetItemList(#List)
       
        ; loop through all displayed items
        For i = 0 To CountGadgetItems(#Explorer)-1
       
          ; get the checkbox state
          state = SendMessage_(GadgetID(#Explorer), #LVM_GETITEMSTATE, i, #LVIS_STATEIMAGEMASK)
         
          If state >> 12 > 1
            ; checkbox is checked
            AddGadgetItem(#List, -1, GetGadgetText(#Explorer)+GetGadgetItemText(#Explorer, i, 0))
          EndIf
       
        Next i
            
      EndIf
         Until Event = #PB_Event_CloseWindow
  EndIf
EndIf
End   
Ou bien

Code : Tout sélectionner

#FileTree = 1
#List = 2
#Button = 3

#TVS_CHECKBOXES = $100

; rekursiver scan durch das explorertreegadget:
Procedure ScanTree(hItem)

  hItem = SendMessage_(GadgetID(#FileTree), #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
  While hItem

    ; daten über das item lesen
    item.TV_ITEM\mask = #TVIF_CHILDREN|#TVIF_HANDLE|#TVIF_STATE
    item\hItem = hItem
    item\statemask = #TVIS_STATEIMAGEMASK
    SendMessage_(GadgetID(#FileTree), #TVM_GETITEM, 0, @item)
   
    ; ist die checkbox gesetzt??
    If ((item\state >> 12) -1)
     
      ; item selektieren, um per GetGAdgetText(#FileTree) den pfad zu bekommen
      SendMessage_(GadgetID(#FileTree), #TVM_SELECTITEM, #TVGN_CARET, hItem)
     
      ; Pfad abspeichern
      AddGadgetItem(#List, -1, GetGadgetText(#FileTree))
    EndIf
   
    ; wenn das item childitems hat, suche dort fortsetzen:
    If item\cChildren > 0
      ScanTree(hItem)
    EndIf
   
    ; nextes item
    hItem = SendMessage_(GadgetID(#FileTree), #TVM_GETNEXTITEM, #TVGN_NEXT, hItem)
  Wend

EndProcedure


If OpenWindow(0, 0, 0, 300, 600, "Path Requester", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)


    ExplorerTreeGadget(#FileTree, 5, 5, 290, 275, "", #PB_Explorer_NoFiles)
   
    ; checkboxes aktivieren
    styles = GetWindowLong_(GadgetID(#FileTree), #GWL_STYLE)
    SetWindowLong_(GadgetID(#FileTree), #GWL_STYLE, styles | #TVS_CHECKBOXES)
   
    ButtonGadget(#Button, 215, 285, 80, 20, "Ok")
    ListViewGadget(#List, 5, 310, 290, 285)
   
    Repeat
      Event = WaitWindowEvent()
     
      If Event = #PB_Event_Gadget And EventGadget() = #Button
     
        ClearGadgetItemList(#List)
       
        ; das selektierte item wird beim scan verändert -> abspeichern
        selected = SendMessage_(GadgetID(#FileTree), #TVM_GETNEXTITEM, #TVGN_CARET, 0)               
       
        ; suche beim root item starten
        root = SendMessage_(GadgetID(#FileTree), #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
       
        ; rekursiven scan durch alle items und childitems
        ScanTree(root)
       
        ; selektiertes item zurücksetzen
        SendMessage_(GadgetID(#FileTree), #TVM_SELECTITEM, #TVGN_CARET, selected)
       
     
      EndIf
     
    Until Event = #PB_Event_CloseWindow
   EndIf
End
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Soucis de selection multiple dans un ExplorerListGadget(

Message par Ar-S »

Merci KCC pour tous ces bons codes, va falloir que je potasse ça.
(en espérant que le state = SendMessage_(GadgetID(#Explorer), #LVM_GETITEMSTATE, i, #LVIS_STATEIMAGEMASK) ou un dérivé dera l'affaire).
~~~~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
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Soucis de selection multiple dans un ExplorerListGadget(

Message par Kwai chang caine »

J'suis content si ça peut t'aider :D
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Soucis de selection multiple dans un ExplorerListGadget(

Message par Ar-S »

Je confirme.
le code de freak est parfait !
Image
L'ajout des checkbox a résolu mon problème.
je passe au suivant ^^

Merci encore :)
~~~~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
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: [OK] Soucis selection multiple dans un ExplorerListGadge

Message par Kwai chang caine »

:lol: Trop cool ton GIF :lol:
Parce que je sais pas si j'te l'ai dèjà dit....mais j'aime bien les gifs :mrgreen:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [OK] Soucis selection multiple dans un ExplorerListGadge

Message par Ar-S »

Ah bon ? :mrgreen:

Du coup j'ai bien avancé je suis content.
~~~~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
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: [OK] Soucis selection multiple dans un ExplorerListGadge

Message par Kwai chang caine »

:lol: :lol: :lol:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre