cs_tonio63
Messages postés5Date d'inscriptionmercredi 19 février 2003StatutMembreDernière intervention12 mai 2005
-
10 mai 2005 à 11:50
cs_tonio63
Messages postés5Date d'inscriptionmercredi 19 février 2003StatutMembreDernière intervention12 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...
cs_tonio63
Messages postés5Date d'inscriptionmercredi 19 février 2003StatutMembreDernière intervention12 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)
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 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 ...
cs_tonio63
Messages postés5Date d'inscriptionmercredi 19 février 2003StatutMembreDernière intervention12 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.
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 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
cs_tonio63
Messages postés5Date d'inscriptionmercredi 19 février 2003StatutMembreDernière intervention12 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.