Savoir quel controle vient de perdre le focus

Résolu
cs_Eric25 Messages postés 175 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 26 juin 2006 - 22 août 2005 à 10:05
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Derniè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 ?

Merci d'avance

12 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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)

PCPT
3
cs_Eric25 Messages postés 175 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 26 juin 2006 3
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 .

TreeView.setfocus
Doevents
...

Merci pour tes réponses qui m'ont bien aidées
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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....

PCPT
0
cs_Eric25 Messages postés 175 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 26 juin 2006 3
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??
0

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

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
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 ...

"MsgBox Me.ActiveControl.Name"

Pas de LostFocus, car pas de perte de focus !!!!
0
cs_Eric25 Messages postés 175 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 26 juin 2006 3
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 ?

Merci d'avance
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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
0
cs_Eric25 Messages postés 175 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 26 juin 2006 3
22 août 2005 à 15:27
Oui effectivement ca serait bien, mais malheureusement cela ne repondrais pas aux exigences de ce projet .
Je crois que je suis dans une impasse...

Merci pour ces eclaircissements...
0
cs_Eric25 Messages postés 175 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 26 juin 2006 3
22 août 2005 à 15:44
C'est une tres bonne idée. Je vais voir ce que ca donne...

MERCI
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
22 août 2005 à 20:03
voilà qui est bien plus propre^^
PCPT
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
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 ...

CallByName Me, Me.ActiveControl.Name & "_LostFocus", VbMethod

... 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 ...

Christophe.
0
Rejoignez-nous