cs_Eric25
Messages postés175Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention26 juin 2006
-
22 août 2005 à 10:05
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 2006
-
23 août 2005 à 14:32
Bonjour,
J'ai besoin de savoir sur quel controle se trouvait l'utilisateur lorsqu'il ferme la fenetre.
Il y a t'il un moyen de savoir quel controle vient de perdre le focus ?
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 22 août 2005 à 15:39
il y a peut-être une solution, mais peu propre :
ajouter un textbox (par exemple) or de la Form (donc non visible).
ajouter un label transparent sans caption en haut de Form, de manière à être être obligé de le survoler pour cliquer sur fermer.
et au Label_mouseMove : TxtHidden.SetFocus
et pareil, il faut aussi gérer le fait que l'utilisateur peut faire "ALT+F4", donc Form reçoit d'abord KeyPreview, et si "Alt" : focus sur le TxtHidden.
c'est bidouillage, mais je en vois pas trop de solution....
(testé, fonctionnel, VB6)
cs_Eric25
Messages postés175Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention26 juin 20063 22 août 2005 à 19:33
Finalement, j'ai trouvé une solution toute bête. Sur le form_unload, j'envoi le focus vers un de mes controles qui n'intervient qu'en affichage suivi d'un Doevents et cela resout tous mes problèmes .
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 22 août 2005 à 10:31
salut,
la plupart de tes contrôles ont l'évènement LostFocus.
tu peux déclarer une variable en globale et la récupérer au Unload.
exemple avec un TextBox et un ComboBox
Dim MyLastControl As Object
Private Sub Combo1_LostFocus()
Set MyLastControl = Combo1
Debug.Print MyLastControl
End Sub
Private Sub Text1_LostFocus()
Set MyLastControl = Text1
Debug.Print MyLastControl
End Sub
Private Sub Form_Unload(Cancel As Integer)
MsgBox MyLastControl
Set MyLastControl = Nothing
End Sub
le problème, c'est qu'au moment ou tu cliques sur la croix Fermeture, ton dernier contrôle ne perd pas réellement le focus. tu peux donc parfois te retrouvé avec l'avant dernier contrôle l'ayant perdu....
cs_Eric25
Messages postés175Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention26 juin 20063 22 août 2005 à 10:44
Salut
Justement c'est la raison de ma question car j'ai du code qui s'éxécute sur les évènements lost focus de mes controles, or comme tu l'as dis, lorsque l'utilisateur clique sur la croix fermeture, l'évenement lostfocus ne s'execute pas. Voilà tout mon problème...
De plus, je ne peux pas modifier mon code actuel car ma fenêtre est remplie de controles et l'enchainement des evenements est plutot complexe.
J'etais parti sur la recherche des frames visibles lors de la fermeture du form pour déclencher tous les evenements lost focus de tous les controles de ces frames mais c'est un peu long. C'est pour cela que je voulais savoir s'il etait possible de recupérer l'index du dernier controle actif.
Merci quand même.
Une autre idée??
Vous n’avez pas trouvé la réponse que vous recherchez ?
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 22 août 2005 à 10:50
oui. mettre le Border à 0 pour forcer l'utilisateur à cliquer sur TON bouton fermer. là tu auras forcémernt le vrai dernier contrôle.
merci du quand-même, çà motive à répondre....
PCPT
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 22 août 2005 à 13:54
Pour info, un click sur la croix de fermeture ne provoque pas l'Evt LostFocus sur le controle qui avait le focus a ce moment la car .... ce controle à toujorus le focus, tout simplement. J'en veux pour preuve cette ligne insérer dans le Unload d'une Form contenant des controles ...
cs_Eric25
Messages postés175Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention26 juin 20063 22 août 2005 à 14:46
Désolé PCPT pour le "merci quand même". Je voulais juste te remercier même si ta reponse ne m'a pas reellement permis de resoudre mon problème, elle m'a au moins permis de mieux cerner le pb.
Je suis mal exprimé...
Merci 'tout court' Crenaud76.
Dans ce cas puis-je déclencher l'évènement lostfocus du controle actif sur mon form_unload ?
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 22 août 2005 à 15:19
non, puisque tu ne sauras pas lequel l'est (seulement l'avant dernier).
un bouton de femeture me paraît la meilleur solution.
quitte à laisser border normal, et refuser le Unload (cancel) s'il ne provient pas de ton bouton....
PCPT
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 23 août 2005 à 14:32
Sinon, à titre d'information, il est possible de déclencher le LostFocus du dernier controle actif au moment du click sur la croix de fermeture d'une form.
Pour ce faire, placer cette ligne de code dans le Unload de la form ...
... et passer les EVT LostFocus des controles en tant que Public, au lieu de Private.
Deux défauts à cette méthode :
1- Les EVt LostFOcus sont exposé en dehors d ela form, ce qui n'est pas forcément un bien
2- Il est alors impossible d'utiliser un gestionnaire d'erreur autour de l'appel à CallByName, car il ne renvoi jamais le bon code erreur. Ce souci peut cependant etre résolu en utilisant la fonction InvokeHook() de la dll TLI plutot que CallByName().
Si cela intéresse quelqu'un, j'ai cela en carton ...