Connaitre le nom du contrôle que l'on clique.

Résolu
cs_tonio63 Messages postés 5 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 12 mai 2005 - 10 mai 2005 à 11:50
cs_tonio63 Messages postés 5 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 12 mai 2005 - 12 mai 2005 à 10:29
Bonjour.


Voici mon problème.


J'ai un formulaire avec près de 200 contrôles identiques, certes, mais non groupés et avec des noms bien sûr différents. Pour éviter de créer autant de procédures événementielles qu'il y a de contrôles, je souhaite pouvoir récupérer le nom de l'item situé sous la souris lorsque je clique, mais je ne trouve pas.


En Delphi, par exemple, il existe une méthode (ItemAtPos) qui fait ça très bien, mais voilà, je développe en VB...


Merci d'avance à tous.


@ntoine

8 réponses

cs_tonio63 Messages postés 5 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 12 mai 2005
12 mai 2005 à 10:29
Merci à tous

J'ai trouvé ma solution tout seul, en glanant des petits trucs par ci par là, je la livre telle quelle au cas où ça intéresserait d'autres personnes.

1) Je dois trouver la position relative du curseur de la souris sur la Form.
- Appel à GetCursorPos des API pour avoir la posision absolue.
Private Declare Function GetCursorPos Lib "user32" (Pt As PointAPI) As Long
Private Type PointAPI
x As Long
y As Long
End Type
- Ensuite, il me faut la position absolue du coin supérieur gauche de ma fenêtre, ce que j'obtiens avec GetWindowRect des API également.
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, R As TRect) As Long
Private Type TRect
Left As Long
Top As Long
Width As Long
Heigth As Long
End Type
- Puis on évite de tomber dans le piège du zoom et/ou du scoll effectué sur la fenêtre
Private Sub JeDetecteUnClick() 'à brancher sur l'interception du clic souris
'Je déclare quelques variables
'Préfixage w pour Window, Scr pour Scroll, cs pour Curseur souris et ZRat pour Zoom Ratio
Dim wLeft&, wTop&, ScrLeft&, ScrTop&, csLeft&, csTop&, ZRat!
Dim Tampon As PointAPI
Dim WP As TRect, sSQL$, Crit$
GetWindowRect ActiveWindow.Handle, WP
With WP
wLeft = .Left
wTop = .Top
End With
With ActiveWindow
ScrLeft = .GetScrollPosition(fvScrollHorizontal)
ScrTop = .GetScrollPosition(fvScrollVertical)
ZRat = .ZoomRatio / 100
End With
GetCursorPos Tampon
csLeft = Fix((Tampon.x - wLeft + ScrLeft) / ZRat)
csTop = Fix((Tampon.y - wTop + ScrTop) / ZRat)
End Sub

2) Après, via une simple comparaison des coordonnées XY obtenues dans csLeft et csTop, il est simple de trouver le contrôle qui se situe sous cette coordonnée.
Pour ma part, j'ai consigné dans une table les coordonnées de chacun de mes contrôles, XMin, XMax, YMin et YMax, et grace à une requête du style :
SELECT NomCtl FROM MaTable WHERE (csLeft Between XMin and XMax) and (csTop Between YMin and YMax)

3) Et le tour est joué.
3
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
10 mai 2005 à 12:37
Ben sois tu utilise un groupe de controle soit tu ne peut pas faire autrement.





Il est plus facile de batiser kk1 que de la convertir. (surtout en programmation)

Une question se pose sur le forum, pas en privé


NH
0
cs_tonio63 Messages postés 5 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 12 mai 2005
10 mai 2005 à 14:07
Seulement voilà, contourner un problème, c'est pas le régler, c'est baisser les bras et s'avouer vaincu.

Etant un battant, je me dis que si c'est possible dans un autre langage, y a certainement un moyen d'y parvenir en VB.

Question de temps. Tu apprendras ça avec l'âge, mon garçon...

PS : bonjour à ton chat (celui de la photo)
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
10 mai 2005 à 14:21
G suis ptete pas un battant (de WC ), mais g sais pas faire autrement.





Il est plus facile de batiser kk1 que de la convertir. (surtout en programmation)

Une question se pose sur le forum, pas en privé


NH
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
10 mai 2005 à 15:30
... Sauf qu'avant de créer 200 contrôles sur une form, faut se poser des questions ...
En VB6 tu n'as pas la main sur les handles d'Events, alors tu pourras peut-être t'en sortir avec les API, mais tu auras aussi vite fait de refaire ta form ...
Et ne vient pas me parler de battant ou d'age ....
Pour finir, 200 controles sur une même form ... faut oser ...

Christophe R
0
cs_tonio63 Messages postés 5 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 12 mai 2005
10 mai 2005 à 18:06
C'est en fait du code qui doit piloter un convoyeur, avec un potentiel de 200 caisses. Via une base MySQL, j'entretien le contenu des caisses en temps réels. (Chacun de mes contrôles correspond à une caisse dont la couleur est dictée par son contenu) Je souhaitais juste connaitre le contenu d'une seule caisse en cliquant dessus. (Nature du contenu, provenance, poids, destination, etc.)

Alors à moins d'avoir 200 formulaires (...) je devais avoir 200 contrôles, qui sont en fait, pour être plus précis, des objets qui se déplacent au gré des aiguillages du convoyeur.

Est-ce possible de renseigner une variable qui contiendrait en permanebce la position de la souris ? Car à la rigueur, je peux encore me débrouiller si j'ai des coordonnées XY pour savoir quelle caisse est sous le curseur.

D'avance merci.

PS : tes petits chats sont pas mal non plus...
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
11 mai 2005 à 09:08
Ben le plus simple serait de créer dynamiquement tes contrôles ... Ainsi, tu n'aurais qu'un seul EVT Click pour tes 200 contrôles, différenciables par l'argument Index de cet EVT

Christophe R
0
cs_tonio63 Messages postés 5 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 12 mai 2005
11 mai 2005 à 09:33
Salut

Tout d'abord, Merci du temps que tu m'as déjà consacré.

Je vais te donner + de précisions sur le cas.

Si mon dev avait été en VB pur, il y a longtemps qu'il aurait été réglé, mais voilà c'est une interface VBA raccrochée à un logiciel qui s'appelle PcVue. Il est certainement très bien dans son domaine, (la supervision), mais s'agissant de bien intégrer VB en son sein, il y a encore pas mal de progrès à faire.

Ainsi, les contrôles n'intègrent pas les événements souris déplacée, enfoncée ou relachée, et les Forms ne connaissent pas l'événement Clic. C'est un peu du développement à la McGyver. Mais bon, jusqu'à maintenant, je m'en suis sorti en fabriquant ce qui n'existait pas grace aux API.

Si je pouvais connaitre la position XY de la souris (position relative, c-a-d que si je pointe le coin supérieur gauche d'un contrôle, ça puisse me dire contrôle.Top et contrôle.Left), je serais en mesure de déterminer le contrôle pointé. J'ai bien un truc dans le genre, mais ça me donne les coordonnées globales de l'écran.

Je continue à chercher, sans baisser les bras. Quant à ma phrase vis à vis de l'âge de NHenry, c'etait bien sûr de l'humour, une façon plus ironique de lui dire que sa réponse ne permet pas de faire avancer le schmilbick d'un millimètre.

D'avance merci

@ntoine
0
Rejoignez-nous