
Salut à tous, voici une procedure que j'ai trouvé sur CodeArchives et qui
sert à faire une recherche dans une Listicongadget, ce qui est très utile.
On obtient la sélection de l'item recherché dans la liste en entrant le
nom de l'élément (ici de la colonne 1) dans un stringgadget et un bouton
qui lance la dite procédure.
Je l'utilise et ça fonctionne très bien. je suis donc satisfait de ce côté là.
Là où je ne suis pas satisfait c'est dans la compréhension de chaque ligne
de cette procédure et c'est pourquoi je me suis dit que quelqu'un pourrait
m'en expliquer, en détails, à quoi correspondent chaque terme.
Cela servirait, j'en suis sûr, à plusieurs d'entre nous. cela ferait une
sorte de Tuto sur ce bout de code qui utilise plusieurs fonctions intéressantes.
Voici donc la procédure dans sa forme d'usage :
Code : Tout sélectionner
Procedure FindStringLIG(searchString1.s)
SendMessage_(GadgetID(#ListIcon_P1), #LVM_FIRST + $54, $8, 1)
fItem.LV_FINDINFO
fItem\flags = #LVFI_STRING
fItem\psz = @searchString1
itemNumber = SendMessage_(GadgetID(#ListIcon_P1), #LVM_FINDITEM, -1, fItem)
If itemNumber > -1
Goto SCROLL_AND_SELECT
Else
For i = 0 To CountGadgetItems(#ListIcon_P1) - 1
If searchString1 = GetGadgetItemText(#ListIcon_P1, i, 1)
itemNumber = i
Goto SCROLL_AND_SELECT
EndIf
Next
EndIf
Goto PROC_ERROR
SCROLL_AND_SELECT:
pItem.POINT
SendMessage_(GadgetID(#ListIcon_P1), #LVM_GETITEMPOSITION, itemNumber , pItem)
SendMessage_(GadgetID(#ListIcon_P1), #LVM_SCROLL, pItem\x, pItem\y - 150)
sItem.LV_ITEM
sItem\mask = #LVIF_STATE
sItem\state = #LVIS_SELECTED
sItem\stateMask = #LVIS_SELECTED
SendMessage_(GadgetID(#ListIcon_P1), #LVM_SETITEMSTATE, itemNumber , sItem)
Goto PROC_END
PROC_ERROR:
MessageRequester("ERREUR", "L'élément recherché : " + searchString1 + " n'a pas été trouvé", #MB_ICONEXCLAMATION | #MB_OK)
PROC_END:
EndProcedure
Code : Tout sélectionner
Procedure FindStringLIG(searchString1.s)
;L'API suivante envoie un message à la ListIcon_P1, mais que représentent
;la constante: #LVM_FIRST et les valeurs : + $54, $8, 1
SendMessage_(GadgetID(#ListIcon_P1), #LVM_FIRST + $54, $8, 1)
fItem.LV_FINDINFO ; find item par ses infos
fItem\flags = #LVFI_STRING; find item en fonction du contenu du stringgadget
fItem\psz = @searchString1; find item en fonction de sa position
itemNumber = SendMessage_(GadgetID(#ListIcon_P1), #LVM_FINDITEM, -1, fItem) ; Renvoie le n° de l'item trouvé
If itemNumber > -1 ;si l'item est supérieur à -1,
Goto SCROLL_AND_SELECT ;on passe directement à cette procédure (voir plus bas)
Else ;sinon
;on compte le nombre d'items de la ListIcon
;on recherche l'item demandé dans la colonne n°1...
For i = 0 To CountGadgetItems(#ListIcon_P1) - 1
If searchString1 = GetGadgetItemText(#ListIcon_P1, i, 1);s'il a été trouvé
itemNumber = i ; le n° de l'item devient celui recherché
Goto SCROLL_AND_SELECT; on se rend à l'endroit où se situe l'item
EndIf
Next
EndIf
Goto PROC_ERROR ;Si l'item n'a pas été trouvé, activation de la procédure d'erreur
SCROLL_AND_SELECT: ;Label (Peut on donner un autre nom, genre PositionAndSelection ?)
pItem.POINT ;PositionItem.Point ?
SendMessage_(GadgetID(#ListIcon_P1), #LVM_GETITEMPOSITION, itemNumber , pItem)
;Ci-dessus:Renvoi la position de l'item en fonction de son numéro
SendMessage_(GadgetID(#ListIcon_P1), #LVM_SCROLL, pItem\x, pItem\y - 150)
;Ci-dessus:déplacement jusqu'à la position de l'item
sItem.LV_ITEM ;besoin de lumière...ma chandelle est morte
sItem\mask = #LVIF_STATE ;besoin de lumière...
sItem\state = #LVIS_SELECTED ;besoin de lumière...
sItem\stateMask = #LVIS_SELECTED ;besoin de lumière...
SendMessage_(GadgetID(#ListIcon_P1), #LVM_SETITEMSTATE, itemNumber , sItem);Sélection de l'entête de l'item ?
Goto PROC_END ;Fin de la procédure
PROC_ERROR: ;procédure d'erreur si item pas trouvé (voir plus haut)
MessageRequester("ERREUR", "L'élément recherché : " + searchString1 + " n'a pas été trouvé", #MB_ICONEXCLAMATION | #MB_OK)
PROC_END:
EndProcedure
Dans l'aide, il est dit qu'un code bien fait ne devrait pas utiliser
de GOTO. j'en conclu que celui-ci n'est pas bien fait... mais il fonctionne.
J'imagine que pour certains c'est de la rigolade...Ben j'aimerai bien rigoler
avec eux, c'est pourquoi vos lumières seront les bienvenues.
@+ Jacobus