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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 ?
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" <eric.barsalou@wanadoo.fr> a écrit dans le message de news:
eI2c6i7TEHA.1012@TK2MSFTNGP09.phx.gbl...
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 ?
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 ?
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
' 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 ?
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
' 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" <eric.barsalou@wanadoo.fr> a écrit dans le message de
news:eI2c6i7TEHA.1012@TK2MSFTNGP09.phx.gbl...
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 ?
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
' 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 ?
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
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 ?
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
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)
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)
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)