OVH Cloud OVH Cloud

ListBox

4 réponses
Avatar
Barsalou
Si l'on crée une listBox de dimension telle qu'un seul élément apparaît,
peut-on se débrouiller pour savoir quel élément est visible, de façon à
pouvoir utiliser cette information sans qu'il soit nécessaire que
l'utilisateur clique sur son choix.
Il suffirait ainsi à l'utilisateur d'utiliser l'ascenseur pour choisir sa
réponse. Actuellement il a parfois tendance à oublier de cliquer sur la
valeur après l'avoir affichée, ce qui provoque évidemment une erreur de
traitement.
Je constate ce phénomène sur divers sites. On croit avoir fait son choix
dans la liste mais ce n'est pas le cas. Sur d'autres sites il est demander
de valider en cliquant sur un autre bouton, ce qui prouve que le programme
sait quel élément est visible, donc il y a un moyen.
Peut-être faut-il passer par la détection de l'évènement ascenseur ? mais
comment ?

4 réponses

Avatar
le_troll
Bonjour,

Ah, tu compares VB et le HTML pour la validation, le problème c'est
celui du défilement à la molette, que généralement on n'a pas en VB sur la
feuille, le focus reste sur l'objet, et avec la molette on veut descendre la
feuille et on déroule le contenu de la liste à la place, lol, faut cliquer
avant dans une partie vide de la feuille...

C'est pas pour te fâcher, mais si tu ne veux voir qu'un élément d'une
liste, prends l'objets ComboList, il est fait pour ça, car une liste, son
but c'est justement d'afficher "une liste", pas d'afficher une seule ligne,
c'est comme un groupe avec un seule personne...
--
Merci, @+, bye, Joe
troll75 AROBASE iFrance POINT com
------------------------------------------
Ce message est plein de virus "certifiés"
Le_Troll, éleveur de Trolls depuis César, qui disait:
Avec une hache, celui qui tient le manche a toujours raison !
------------------------------------------


"Barsalou" a écrit dans le message de news:

Si l'on crée une listBox de dimension telle qu'un seul élément apparaît,
peut-on se débrouiller pour savoir quel élément est visible, de façon à
pouvoir utiliser cette information sans qu'il soit nécessaire que
l'utilisateur clique sur son choix.
Il suffirait ainsi à l'utilisateur d'utiliser l'ascenseur pour choisir sa
réponse. Actuellement il a parfois tendance à oublier de cliquer sur la
valeur après l'avoir affichée, ce qui provoque évidemment une erreur de
traitement.
Je constate ce phénomène sur divers sites. On croit avoir fait son choix
dans la liste mais ce n'est pas le cas. Sur d'autres sites il est demander
de valider en cliquant sur un autre bouton, ce qui prouve que le programme
sait quel élément est visible, donc il y a un moyen.
Peut-être faut-il passer par la détection de l'évènement ascenseur ? mais
comment ?




Avatar
Zoury
Salut! :O)

Jètes un oeil sur cet exemple, j'ai commenté le code, n'hésite pas si tu as
des questions.
'***
' Form1
' 1 ListBox1
Option Explicit

Private Declare Function SendMessage _
Lib "user32" _
Alias "SendMessageA" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any _
) As Long

Private Const LB_ITEMFROMPOINT As Long = &H1A9

Private Sub Form_Load()

Dim i As Long
For i = 1 To 10
Call List1.AddItem("Item " & i)
Next i

End Sub

Private Sub List1_Scroll()

' on sélectionne l'item trouvé
' si aucune n'est trouvé on
' ne sélectionne rien (ListIndex = -1)
'
List1.ListIndex = GetVisibleItemIndex(List1)

End Sub

Private Function GetVisibleItemIndex(ByRef lst As ListBox) As Long

Dim lRet As Long

' LB_ITEMFROMPOINT nous permet de déterminer l'index
' de l'item le plus près des coordonnées x et y passé
' qu'on lui passe en paramètre soit :
'
'GetVisibleItemIndex = SendMessage(lst.hwnd, LB_ITEMFROMPOINT, 0, ByVal
MakeDWord(x, y))
'
' Sauf que les coordonnées dans notre cas sont de (0, 0), on
' peut donc passer 0 sans utiliser la fonction MakeDWord

lRet = SendMessage(lst.hwnd, LB_ITEMFROMPOINT, 0, ByVal 0) 'MakeDWord(0,
0) = 0

' les points fournit sont valides
' si le HiWord de la valeur de
' retour vaut 0
'
' l'index sélectionner se trouve dans
' le LoWord de cette valeur
'
If (HiWord(lRet) = 0) Then

' trouvé! on renvoit l'index, soit :
'
' GetVisibleItemIndex = LoWord(lRet)
'
' étant donnée que hiWord(lRet) vaut 0
' on peut renvoyer lRet tel quel sans
' utiliser la fonction LoWord()
'
GetVisibleItemIndex = lRet

Else

' non trouvé, on renvoit -1
GetVisibleItemIndex = -1

End If

End Function

Private Function HiWord(ByRef dw As Long) As Integer
If (dw And &H80000000) Then ' négatif
HiWord = (dw &H10000) - 1
Else
HiWord = dw &H10000
End If
End Function

' ces fonctions sont non nécessaire à l'exécution de l'exemple
'
'Private Function LoWord(ByRef dw As Long) As Integer
' If (dw And &H8000&) Then
' LoWord = &H8000 Or (dw And &H7FFF&)
' Else
' LoWord = dw And &HFFFF&
' End If
'End Function
'
'Private Function MakeDWord(ByRef LoWord As Integer, ByRef HiWord As
Integer) As Long
' MakeDWord = (HiWord * &H10000) Or (LoWord And &HFFFF&)
'End Function
'***


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
"Barsalou" a écrit dans le message de
news:
Si l'on crée une listBox de dimension telle qu'un seul élément apparaît,
peut-on se débrouiller pour savoir quel élément est visible, de façon à
pouvoir utiliser cette information sans qu'il soit nécessaire que
l'utilisateur clique sur son choix.
Il suffirait ainsi à l'utilisateur d'utiliser l'ascenseur pour choisir sa
réponse. Actuellement il a parfois tendance à oublier de cliquer sur la
valeur après l'avoir affichée, ce qui provoque évidemment une erreur de
traitement.
Je constate ce phénomène sur divers sites. On croit avoir fait son choix
dans la liste mais ce n'est pas le cas. Sur d'autres sites il est demander
de valider en cliquant sur un autre bouton, ce qui prouve que le programme
sait quel élément est visible, donc il y a un moyen.
Peut-être faut-il passer par la détection de l'évènement ascenseur ? mais
comment ?




Avatar
Eric BARSALOU
Merci et bravo, ça m'a l'air d'être exactement ce qu'il me faut et tout à
fait génial; je pense qu'il faut invoquer la fonction successivement pour
toutes les ListBox puis faire le traitement ad-hoc sur les valeurs trouvées.
La fonction SendMessage est-elle documentée quelque part ? Et que
représentent x et y ? Faut-il toujours prendre 0 et 0 dans mon cas ? et
pourquoi ?

Eric
Avatar
Zoury
Salut Eric! :O)

La fonction SendMessage est-elle documentée quelque part ?



La fonction est documentée ici :

SendMessage Function
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesfunctions/sendmessage.asp


Mais cette fonction est très très générique. Elle permet d'envoyer un
message à une ou des fenêtres. La fonction appelle la procédure de la
fenêtre visée par le message et attend que le message soit traité par
celle-ci avant de redonner la main à ton application. Ce concept d'envoi de
message d'une fenêtre à l'autre est à la base même du fonctionnement de
Windows. Si tu veux plus d'information à ce sujet regarde cette fiche :

About Messages and Message Queues
http://msdn.microsoft.com/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/MessagesandMessageQueues/AboutMessagesandMessageQueues.asp


Et finalement voici la fiche concernant le message LB_ITEMFROMPOINT
http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/listboxes/listboxreference/listboxmessages/lb_itemfrompoint.asp



Et que représentent x et y ?
Faut-il toujours prendre 0 et 0 dans mon cas ?
et pourquoi ?



Regarde la description du paramètre lParam dans le dernier lien, ça devrait
répondre à toutes ces questions ;O)

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/