comment bouger la scrollbar d'une listicon ?
comment bouger la scrollbar d'une listicon ?
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é.
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é.
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 si cela peut aider quelqu'un voilà ce que j'ai fais :
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.

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)
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.

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

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
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
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).
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.
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.

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.

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()
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.
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.
Voila un exemple grace à Gnozal
Dri 
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

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
Ta recherche par référence ne semble pas fonctionner!
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
Euhhhh désolé à part régis fait du camping j'en connais pas d'autre.Faudrait déjà corriger le code de Regis, histoire d'avoir un exemple fonctionnel... Son code est d'ailleurs beaucoup plus court...
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)
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.
