Recherche dans ListIconGadget

Partagez votre expérience de PureBasic avec les autres utilisateurs.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Recherche dans ListIconGadget

Message par nico »

La recherche s'effectue seulement sur la première colonne:

Code : Tout sélectionner

; Exemple de recherche d'élément dans une ListIconGadget
; La recherche s'effectue soit à partir de l'index 0
; soit à partir de la sélection
; soit à partir du String Gadget
; A noter: La recherche est sensible à la casse  
; By Nico

Structure LVFINDINFO
  flags.l
  psz.s
  lParam.l
  pt.POINT
  vkDirection.l
EndStructure

Procedure Recherche(handle.l, ValeurRecherche.s, depart.l)
  find.LVFINDINFO
  find\flags=#LVFI_PARTIAL
  find\psz= ValeurRecherche
  index.l=SendMessage_(handle, #LVM_FINDITEM, depart, find)
  SetGadgetItemState(4, index, 1)
  NbItem = CountGadgetItems(4)
  ;Message pour récupérer la hauteur d'un item
  SendMessage_(handle, #LVM_GETITEMRECT, 0, @prc.RECT)
  ;Message pour scroller tout au début (item*hauteur)
  SendMessage_(handle, #LVM_SCROLL, 0, -NbItem*(prc\bottom-prc\top))
  ;Message pour scroller sur l'élément recherché
  SendMessage_(handle, #LVM_SCROLL, 0, index*(prc\bottom-prc\top))
  ProcedureReturn index    
EndProcedure
 
If OpenWindow(0,100,200,380,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Recherche ListIcon Example") 
  If CreateGadgetList(WindowID()) 
    StringGadget(0,  10, 10, 360, 20, "Entrez un ou plusieurs caractères pour la  recherche sur la colonne Valeur", #PB_String_ReadOnly|#PB_String_BorderLess)
    ButtonGadget(1, 210, 50, 140, 20, "Rechercher depuis le début")
    ButtonGadget(2, 210, 30, 140, 20, "Suivant")
    StringGadget(3,  20, 40, 150, 20, "")
    hlist.l=ListIconGadget(4,20,80,330,100,"Valeur",100,#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection) 
    AddGadgetColumn(4,1,"Donnée",178)
    
    For x= 0 To 120 
      AddGadgetItem(4,-1,Str(x)+Chr(10)+"Donnée "+Str(x))
    Next x
    
    For x= 0 To 120 
      AddGadgetItem(4,-1,Str(x)+Chr(10)+Str(x))
    Next x
    
    Repeat 
      EventID = WaitWindowEvent()
      Select EventID
        Case  #PB_EventGadget
          Select EventGadgetID()
            Case 1  ;rechercher depuis le début
              Texte$ = GetGadgetText(3) 
              ElementTrouve= Recherche(hlist, Texte$, -1)
              
            Case 2  ;suivant
              Texte$ = GetGadgetText(3) 
              ElementTrouve= Recherche(hlist, Texte$, ElementTrouve)
              If ElementTrouve < 0
                MessageRequester("Info", "Valeur non trouvée")
              EndIf
              
            Case 3 ;rechercher depuis le String Gadget
              Texte$ = GetGadgetText(3)
              If EventType() <> #PB_EventType_Focus 
                If selection=#False
                  ElementTrouve= Recherche(hlist, Texte$, -1)
                EndIf 
              EndIf
              selection=#False
                
            Case 4  ;retrouve l'index courant pour continuer la recherche 
              ;à partir de l'élément sélectionné
               If EventType() = #PB_EventType_LeftClick
                #LVM_GETHOTITEM= $1000+61
                ElementTrouve.l=SendMessage_(hlist, #LVM_GETHOTITEM, 0, 0)
                Texte$ = GetGadgetText(4)
                SetGadgetText(3, Texte$)
                selection=#True
              EndIf
              
          EndSelect
      EndSelect
    Until EventID = #PB_Event_CloseWindow
  EndIf 
EndIf