Connaitre le nom du contrôle que l'on clique. [Résolu]

Signaler
Messages postés
5
Date d'inscription
mercredi 19 février 2003
Statut
Membre
Dernière intervention
12 mai 2005
-
Messages postés
5
Date d'inscription
mercredi 19 février 2003
Statut
Membre
Dernière intervention
12 mai 2005
-
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

Messages postés
5
Date d'inscription
mercredi 19 février 2003
Statut
Membre
Dernière intervention
12 mai 2005

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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 179 internautes nous ont dit merci ce mois-ci

Messages postés
14800
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
19 juin 2021
156
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
Messages postés
5
Date d'inscription
mercredi 19 février 2003
Statut
Membre
Dernière intervention
12 mai 2005

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)
Messages postés
14800
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
19 juin 2021
156
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
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
9 juin 2006
27
... 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
Messages postés
5
Date d'inscription
mercredi 19 février 2003
Statut
Membre
Dernière intervention
12 mai 2005

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...
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
9 juin 2006
27
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
Messages postés
5
Date d'inscription
mercredi 19 février 2003
Statut
Membre
Dernière intervention
12 mai 2005

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