comment bouger la scrollbar d'une listicon ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
dreamind
Messages : 28
Inscription : dim. 16/janv./2005 23:34
Localisation : Toulouse/FRANCE

comment bouger la scrollbar d'une listicon ?

Message par dreamind »

bonjour !!!

Je suis toujours sur mon gestionnaire de stock et j'ai fais une routine de recherche de produit avec sélection dans la listicon mais si il sélectionne bien l'élément il ne l'affiche pas.

C'est à dire qu'il ne bouge pas la scrollbar donc il est bien sélectionné mais il faut bouger la scrollbar à la souris pour le faire apparaitre dans la zone visible.

Donc je voulais savoir s'il y avait un moyen pour que la scrollbar se déplace et affiche l'élément s'il n'est pas dans la zone visible de la listicon.

Sinon je ferai ça avec une fenetre qui affichera l'élément en question mais bon si vous connaissais un moyen je suis preneur.

Merci en espérant avoir bien expliqué.
dreamind
Messages : 28
Inscription : dim. 16/janv./2005 23:34
Localisation : Toulouse/FRANCE

Message par dreamind »

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu - Denis
; Version de PB : 3.90
;
; Explication du programme :
; Récupérer et changer la position de la barre de défilement d'une ListIconGadget

Procedure.l GetListPos(Gadget.l)
  ProcedureReturn SendMessage_(GadgetID(Gadget), #LVM_GETTOPINDEX, 0, 0)
EndProcedure

Procedure.l SetListPos(Gadget.l, Position.l)
  Protected Pos.point
  SendMessage_(GadgetID(Gadget), #LVM_GETITEMPOSITION, Position - 1, Pos)
  SendMessage_(GadgetID(Gadget), #LVM_SCROLL, 0, position*14)
EndProcedure



;- Debut du test

Procedure Remplir()
  ; On rempli la liste
  For n = 0 To 50
    AddGadgetItem(1, -1, "Elément " + Str(n))
  Next
EndProcedure


If OpenWindow(0, 0, 0, 300, 300, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "Scroll ListIconGadget")
  If CreateGadgetList(WindowID())
    ListIconGadget(1, 0, 0, 300, 250, "Elements", 275, #PB_ListIcon_FullRowSelect)
    
    ButtonGadget(2, 0, 260, 300, 25, "Actualiser")
    
    Remplir()
    
  Else
    End
  EndIf
Else
  End
EndIf

Repeat
  Event = WaitWindowEvent()
  
  If Event = #PB_EventGadget
    Select EventGadgetID() ; boutons, zone de texte, ...
      Case 2
        Pos = GetListPos(1)
        Debug "Premier élément visible = " + Str(Pos)
        ClearGadgetItemList(1)
        Debug "Liste vidée"
        remplir()
        Debug "Remplissage de la liste"
        SetListPos(1, Pos)
        Debug "on remet à la position d'origine"
    EndSelect
  EndIf
  
Until Event = #PB_EventCloseWindow
Bon j'ai trouvé ça et ça fonctionne merci au soldat inconnu
dreamind
Messages : 28
Inscription : dim. 16/janv./2005 23:34
Localisation : Toulouse/FRANCE

Message par dreamind »

bon si cela peut aider quelqu'un voilà ce que j'ai fais :

Code : Tout sélectionner

ClearGadgetItemList(#liste_produit)
                  remplir()
                  SendMessage_(GadgetID(#liste_produit), #LVM_SCROLL, 0, i*14)
                  SetGadgetItemState(#liste_produit, i, #PB_ListIcon_Selected)
                  SetGadgetState(#liste_produit,i)
on efface la liste et on la remplie à nouveau sinon il y a des décalage.
i est la position de la sélection dans la liste et le *14 me demandez pas pourquoi mais avec ce multiplicateur cela fonctionne.

Merci au soldat inconnu et par hasard s'il passe par ici ou si quelqu'un connait se serait bien d'expliquer pourquoi il me faut multiplier par 14.

:D
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

c'est la hauteur d'une ligne en pixels je pense ;)
le problème c'est que si un utilisateur quelconque personalise son windows et que la hauteur des lignes change, cette valeur devient fausse...

Le mieux c'est de récupérer cette valeurvia l'api mais quand à savoir laquelle utiliser (GetClientRect_() ???)...

En tout cas ca tombe bien car j'allais m'intéresser au problème ^^

Dri
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je pense que le message LVM_GETITEMRECT permet de récupérer la hauteur de la ligne
Pour LVM_scroll, bien lire la doc car le système arrondi la valeur si necessaire.
Pour le 14, c'est le message LVM_scroll qui a besoin d'un incrément par taille de ligne entière (en mode report et c'est ton cas)

Comme le dit Dri, tu as de la chance que ça fonctionne

voici ce que dis la doc MS
When the list-view control is in report view, the control can only be scrolled vertically in whole line increments. Therefore, the dy parameter will be rounded to the nearest number of pixels that form a whole line increment. For example, if the height of a line is 16 pixels and 8 is passed for dy, the list will be scrolled by 16 pixels (1 line). If 7 is passed for dy, the list will be scrolled 0 pixels (0 lines).

soit

Lorsque la list-view est en mode report, le control peut être "scrollé" verticalement par incréments d'une valeur d'une ligne entière . Par conséquent, le paramètre dy sera arrondi au nombre le plus proche en Pixels qui forme une ligne entière. Par exemple, si la taille d'une ligne est de 16 Pixels et si on passe 8 pour dy, la liste sera déroulée de 16 Pixels (1 ligne). Si on passe 7 pour dy, la liste sera déroulée de 0 Pixels (0 ligne).
Dernière modification par Anonyme2 le ven. 29/juil./2005 13:12, modifié 2 fois.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

on efface la liste et on la remplie à nouveau sinon il y a des décalage.
C'est ridicule de faire ça, je ne sais pas coment tu fais mais y a un problème si tu dois effacer ta liste.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

nico a écrit :
on efface la liste et on la remplie à nouveau sinon il y a des décalage.
C'est ridicule de faire ça, je ne sais pas coment tu fais mais y a un problème si tu dois effacer ta liste.
Tu as raison Nico.

C'est peut-être un problème du à l'index de la 1er ligne qui est 0
dreamind
Messages : 28
Inscription : dim. 16/janv./2005 23:34
Localisation : Toulouse/FRANCE

Message par dreamind »

bon si je comprends bien il faut que je récupère la hauteur des lignes pour palier aux différentes résolutions d'écran.

Par contre si je n'efface pas la liste ça merdois et le code du soldat c'est pareil il efface la liste alors je sais pas il faut que je regarde ça.

En tout cas merci pour vos réponses.

:wink:
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Poste un bout de code qui montre le problème, on va t'aider! :)
dreamind
Messages : 28
Inscription : dim. 16/janv./2005 23:34
Localisation : Toulouse/FRANCE

Message par dreamind »

Code : Tout sélectionner

;----------------------------------
;             GESTOK
;  Gestion de stock maintenance SNP
;         FUNDARO WILLIAM
;            AOUT 2005
;----------------------------------
;
;========== déclaration des constantes

Enumeration  ;énumération des fenetres
  #Window_0
  #window_recherche
  #window_alarme
  #window_sauvegarde
  #window_recherche_nom
  #window_recherche_ref
EndEnumeration

Enumeration  ;énumération des gadgets
  #titre_log
  #menu
  #menu_ajout
  #menu_supp
  #menu_nom
  #menu_ref
  #menu_about
  #liste_produit
  #titre
  #bouton_quitter
  #alarme
  #text_sauvegarde
  #bar_sauvegarde
  #saisie_recherche_nom
  #lancer_recherche
  #annul_recherche
  #saisie_recherche_ref
  #lancer_recherche_ref
  #annul_recherche_ref
EndEnumeration

;******* déclaration des variables

Structure champs
    nom.s
    ref.s
    emploi.s
    emplacement.s
    stock.l
    alarme.l
EndStructure

NewList produit.champs()


;utilisation de listicongadget
;voici des options ppur le classement de la listeicon
;LVS_SORTASCENDING 
;Item indexes are sorted based on item text in ascending order. 

;LVS_SORTDESCENDING 
;Item indexes are sorted based on item text in descending order.

;******* déclaration des procedures


;---------------*********** création des fenetres *****************-------------------------
Procedure remplir()
  AddGadgetColumn(#liste_produit,1,"Référence",175)
        AddGadgetColumn(#liste_produit,2,"Emploie",181)
        AddGadgetColumn(#liste_produit,3,"Emplacement",100)
        AddGadgetColumn(#liste_produit,4,"Stock",50)
        AddGadgetColumn(#liste_produit,5,"Alarme",50)
        
        AddGadgetItem(#liste_produit,-1,"Harry Rannit"+Chr(10)+"trois"+Chr(10)+"e4"+Chr(10)+Str(5))
        AddGadgetItem(#liste_produit,-1,"Ginger Brokeit")
        AddGadgetItem(#liste_produit,-1,"albert")
        For i=1 To 80
          AddGadgetItem(#liste_produit,-1,"point"+Str(i))
        Next
        AddGadgetItem(#liste_produit,-1,"zebre")

EndProcedure 


Procedure fenetre_principale()
  If OpenWindow(#Window_0, 216, 0, 800, 600,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered , "Gestion de stock --- Maintenance SNP")
If CreateMenu(#menu, WindowID(#Window_0))
    MenuTitle("Produits")
      MenuItem( #menu_ajout, "Ajouter une référence")
      MenuItem( #menu_supp, "Supprimer une référence")
     
    MenuTitle("Recherche")
      MenuItem( #menu_nom, "Par nom")
      MenuItem( #menu_ref, "Par référence")
 
      
    MenuTitle("?")
      MenuItem(#menu_about, "About")

  EndIf

    If CreateGadgetList(WindowID(#Window_0))
    
      TextGadget(#titre_log,300,10,200,40,"GESTOK",#PB_Text_Center)
      If LoadFont(0,"Arial",25,#PB_Font_Bold)
        SetGadgetFont(#titre_log,FontID())
      EndIf
     
      ListIconGadget(#liste_produit, 20, 70, 760, 455, "Nom", 200, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_GridLines | #LVS_SORTASCENDING)
        
        remplir()
        
      ButtonGadget(#alarme,50,540,100,30,"Alarme")  
      ButtonGadget(#bouton_quitter,650,540,100,30,"QUITTER")
    EndIf
  EndIf
EndProcedure

Procedure fenetre_recherche_nom()
  If OpenWindow(#window_recherche_nom,0,0,250,80, #PB_Window_ScreenCentered, "Recherche par nom")
  
    If CreateGadgetList(WindowID(#window_recherche_nom))
      StringGadget(#saisie_recherche_nom,25, 20,200,20,"")
      ButtonGadget(#lancer_recherche,35,50,80,20,"Recherche")
      ButtonGadget(#annul_recherche,135,50,80,20,"Annuler")
    EndIf 
    
  EndIf
 
HideWindow(#window_recherche_nom,1)
EndProcedure

Procedure fenetre_recherche_ref()
  If OpenWindow(#window_recherche_ref,0,0,250,80, #PB_Window_ScreenCentered, "Recherche par référence")
  
    If CreateGadgetList(WindowID(#window_recherche_ref))
      StringGadget(#saisie_recherche_ref,25, 20,200,20,"")
      ButtonGadget(#lancer_recherche_ref,35,50,80,20,"Recherche")
      ButtonGadget(#annul_recherche_ref,135,50,80,20,"Annuler")
    EndIf 
    
  EndIf
 
HideWindow(#window_recherche_ref,1)
EndProcedure

;-------------------------*************** fin création fenetre *****************------------------------

Procedure recherche_par_nom()
  
  HideWindow(#window_recherche_nom,0)
  SetWindowPos_(WindowID(#window_recherche_nom), -1, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE)
  UseWindow(#window_recherche_nom)
  fin_boucle = 0
  objet_trouve.b = 0
  Repeat
  event_nom = WaitWindowEvent()
  ActivateWindow()
      If event_nom = #PB_EventGadget
        Select EventGadgetID()
          Case #annul_recherche
            HideWindow(#window_recherche_nom,1)
            fin_boucle = 1
          Case #lancer_recherche
            ;ici code de recherche de nom
            nom_recherche.s = GetGadgetText(#saisie_recherche_nom)
            If nom_recherche<>""
              For i=0 To CountGadgetItems(#liste_produit)
                nom_liste.s = GetGadgetItemText(#liste_produit, i, 0)
                If nom_recherche = nom_liste               
                  ClearGadgetItemList(#liste_produit)
                  remplir()
                  SendMessage_(GadgetID(#liste_produit), #LVM_SCROLL, 0, i*14-1)
                  SetGadgetItemState(#liste_produit, i, #PB_ListIcon_Selected)
                  SetGadgetState(#liste_produit,i)
                  i=CountGadgetItems(#liste_produit)               
                  objet_trouve = 1
                  fin_boucle=1             
                EndIf
              Next
              If objet_trouve = 0
                MessageRequester("Résultat de la recherche","Aucun produit trouvé",#PB_MessageRequester_Ok)
                SetGadgetText(#saisie_recherche_nom, "")
              EndIf
            Else 
              MessageRequester("Erreur d'entrée","Veuillez entrer un nom pour lancer la recherche",#PB_MessageRequester_Ok)
            EndIf 
        EndSelect 
      EndIf 
  Until fin_boucle=1
  HideWindow(#window_recherche_nom,1)
  UseWindow(#window_0)
  ActivateWindow()
  ActivateGadget(#liste_produit)
  

EndProcedure
 
Procedure recherche_par_ref()
   HideWindow(#window_recherche_ref,0)
  SetWindowPos_(WindowID(#window_recherche_ref), -1, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE)
  UseWindow(#window_recherche_ref)
  fin_boucle = 0
  objet_trouve.b = 0
  Repeat
  event_nom = WaitWindowEvent()
  ActivateWindow()
      If event_nom = #PB_EventGadget
        Select EventGadgetID()
          Case #annul_recherche_ref
            HideWindow(#window_recherche_ref,1)
            fin_boucle = 1
          Case #lancer_recherche_ref
            nom_recherche.s = GetGadgetText(#saisie_recherche_ref)
            If nom_recherche<>""
              For i=0 To CountGadgetItems(#liste_produit)
                nom_liste.s = GetGadgetItemText(#liste_produit, i, 1)
                If nom_recherche = nom_liste
                  SetGadgetItemState(#liste_produit, i, #PB_ListIcon_Selected)
                  ClearGadgetItemList(#liste_produit)
                  remplir()
                  SendMessage_(GadgetID(#liste_produit), #LVM_SCROLL, 0, i*14)
                  SetGadgetItemState(#liste_produit, i, #PB_ListIcon_Selected)
                  SetGadgetState(#liste_produit,i)
                  i=CountGadgetItems(#liste_produit)
                  objet_trouve = 1
                  fin_boucle=1             
                EndIf
              Next
              If objet_trouve = 0
                MessageRequester("Résultat de la recherche","Aucun produit trouvé",#PB_MessageRequester_Ok)
                SetGadgetText(#saisie_recherche_ref, "")
              EndIf
            Else 
              MessageRequester("Erreur d'entrée","Veuillez entrer une référence pour lancer la recherche",#PB_MessageRequester_Ok)
            EndIf
        EndSelect 
      EndIf 
  Until fin_boucle=1
  HideWindow(#window_recherche_ref,1)
  UseWindow(#window_0)
  ActivateWindow()
  ActivateGadget(#liste_produit)
EndProcedure
 
Procedure sauvegarde()
  If OpenWindow(#window_sauvegarde,0,0,200,80, #PB_Window_ScreenCentered,"Fermeture")
    If CreateGadgetList(WindowID(#window_sauvegarde))
      TextGadget(#text_sauvegarde,0,10,200,20,"Sauvegarde en cours patientez...",#PB_Text_Center)
      ProgressBarGadget(#bar_sauvegarde, 15, 40,170, 20, 0,100)
      
      For i=1 To 100000
        SetGadgetState   (#bar_sauvegarde, i/1000)
      Next
    EndIf
  EndIf 
EndProcedure

;*************************************************

;***********   PROGRAMME

fenetre_principale()
fenetre_recherche_nom()
fenetre_recherche_ref()


Repeat
Event = WaitWindowEvent()
If event = #PB_EventMenu
  Select EventMenuID()
    Case #menu_nom
      recherche_par_nom()
    Case #menu_ref
      recherche_par_ref()
    Case #menu_about
      MessageRequester("About GESTOK","Copyright - 2005 - Fundaro william au titre de la SNP.")
  EndSelect 
EndIf

If Event = #PB_EventGadget
  Select EventGadgetID()
    Case #bouton_quitter
      event = #PB_Event_CloseWindow
  EndSelect
EndIf

Until event = #PB_Event_CloseWindow
sauvegarde()
bon voilà mon code pour le moment ne soyez pas trop méchant avec moi.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

nico a écrit :Poste un bout de code qui montre le problème, on va t'aider! :)
Faudrait déjà corriger le code de Regis, histoire d'avoir un exemple fonctionnel... Son code est d'ailleurs beaucoup plus court...

Dri
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

SendMessage_(GadgetID(#ListView), #LB_SETTOPINDEX, NbElement, 0) permet de s'assurer que l'élément numéro NbElement est bien visible dans le ListViewGadget #ListView.

SendMessage_(GadgetID(#ListIcon), #LVM_ENSUREVISIBLE, NbElement, 0) permet de s'assurer que l'élément numéro NbElement est bien visible dans le ListIconGadget #ListIcon.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Voila un exemple grace à Gnozal

Code : Tout sélectionner

;basé sur l'exemple de l'aide...

Procedure ScrollListView(ListViewID, Item)
  SendMessage_(ListViewID, #LB_SetTopIndex, Item, #Null)
EndProcedure

Procedure ScrollListIcon(ListIconID, Item)
  SendMessage_(ListIconID,  #LVM_EnsureVisible, Item, #Null)
EndProcedure

Enumeration
  #MyWindow
  #MyGadget
  #MyString
  #MyButton
EndEnumeration

If OpenWindow(#MyWindow,100,100,300,125,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ListIcon")
  If CreateGadgetList(WindowID())
   ListIconGadget(#MyGadget, 5, 5, 290, 90, "Ligne", 100, #PB_ListIcon_AlwaysShowSelection)
   StringGadget  (#MyString, 5, 100, 50, 20, "", #PB_String_Numeric)
   ButtonGadget  (#MyButton, 60, 100, 60, 20, "Goto")
   
   ;Rempli le ListIconGadget
   For i = 1 To 40
     AddGadgetItem(#MyGadget, #PB_Default, Str(i))
   Next i
   
   Repeat
     EventID = WaitWindowEvent()
     
     If EventID = #PB_Event_Gadget
      
      GadgetID = EventGadgetID()
      
      If GadgetID = #MyButton
        
        Position = Val( GetGadgetText(#MyString) ) - 1
        SetGadgetItemState(#MyGadget, Position, #PB_ListIcon_Selected)
        ScrollListIcon(GadgetID(#MyGadget), Position)
        
      EndIf
      
     EndIf
     
   Until EventID = #PB_Event_CloseWindow And EventWindowID() = #MyWindow
  EndIf
EndIf
Dri ;)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Oui, c'est bien de l'avoir trouvé, mais ce n'est pas nouveau, c'est sur le Forum depuis un moment déjà, un code posté par Denis je crois.

Voilà un code qui permet de scroller sur un item choisi, là aussi rien de nouveau puisque j'avais déjà posté ce code dans trucs et astuces.
http://purebasic.hmt-forum.com/viewtopic.php?t=298

Code : Tout sélectionner

Procedure Scroll_and_selected(Position.l)
  ; Message pour récupérer la hauteur d'un item 
  SendMessage_(#liste_produit, #LVM_GETITEMRECT, 0, @prc.RECT) 
  Hauteur= prc\bottom-prc\top
  
  ; Nombre d'éléments
  NbItem = CountGadgetItems(#liste_produit) 
  
  ; Message pour scroller tout au début (item*hauteur) 
  SendMessage_(#liste_produit, #LVM_SCROLL, 0, -NbItem * Hauteur) 
  
  ; Message pour scroller sur l'élément recherché 
  SendMessage_(#liste_produit, #LVM_SCROLL, 0, Position * Hauteur) 
  
  ; Sélection de l'item 
  SetGadgetItemState(#liste_produit, Position, #PB_ListIcon_Selected) 
  
  ProcedureReturn index 
EndProcedure

Code : Tout sélectionner

            For i=0 To CountGadgetItems(#liste_produit) 
              nom_liste.s = GetGadgetItemText(#liste_produit, i, 1) 
              If nom_recherche = nom_liste 
                Scroll_and_selected(i)
                ; ClearGadgetItemList(#liste_produit) 
                ; Remplir() 
                ; SendMessage_(GadgetID(#liste_produit), #LVM_SCROLL, 0, i*14-1) 
                ; SetGadgetItemState(#liste_produit, i, #PB_ListIcon_Selected) 
                ; SetGadgetState(#liste_produit,i) 
                i=CountGadgetItems(#liste_produit)                
                objet_trouve = 1 
                fin_boucle=1  
              EndIf 
            Next
Ta recherche par référence ne semble pas fonctionner!
dreamind
Messages : 28
Inscription : dim. 16/janv./2005 23:34
Localisation : Toulouse/FRANCE

Message par dreamind »

Faudrait déjà corriger le code de Regis, histoire d'avoir un exemple fonctionnel... Son code est d'ailleurs beaucoup plus court...
Euhhhh désolé à part régis fait du camping j'en connais pas d'autre.

Ensuite à part

Code : Tout sélectionner

SetWindowPos_(WindowID(#window_recherche_nom), -1, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE)


SendMessage_(GadgetID(#liste_produit), #LVM_SCROLL, 0, i*14-1)
                  ;SendMessage_(GadgetID(#liste_produit),  #LVM_EnsureVisible, i, #Null)
et les conseils de denis pour utiliser les liste chaînés tout le reste est de moi.

SendMessage_(GadgetID(#liste_produit), #LVM_SCROLL, 0, i*14-1)
avec ça je ramène l'élément sélectionné à la première ligne visible

SendMessage_(GadgetID(#liste_produit), #LVM_EnsureVisible, i, #Null)
ramène l'élément dans la zone visible n'importe ou mais évite de reremplir la liste.

Bon merci à tous pour vos réponses et désolé de n'avoir pas cherché un peu mieux sur le forum.

:wink:
Répondre