Savoir quel controle vient de perdre le focus [Résolu]

Messages postés
175
Date d'inscription
mardi 19 octobre 2004
Dernière intervention
26 juin 2006
- - Dernière réponse : crenaud76
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
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
Afficher la suite 

12 réponses

Meilleure réponse
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
3
Merci
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

Dire « Merci » 3

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

Codes Sources a aidé 106 internautes ce mois-ci

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

Dire « Merci » 3

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

Codes Sources a aidé 106 internautes ce mois-ci

Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
0
Merci
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
Messages postés
175
Date d'inscription
mardi 19 octobre 2004
Dernière intervention
26 juin 2006
0
Merci
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??
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
0
Merci
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
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Dernière intervention
9 juin 2006
0
Merci
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 !!!!
Messages postés
175
Date d'inscription
mardi 19 octobre 2004
Dernière intervention
26 juin 2006
0
Merci
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
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
0
Merci
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
Messages postés
175
Date d'inscription
mardi 19 octobre 2004
Dernière intervention
26 juin 2006
0
Merci
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...
Messages postés
175
Date d'inscription
mardi 19 octobre 2004
Dernière intervention
26 juin 2006
0
Merci
C'est une tres bonne idée. Je vais voir ce que ca donne...

MERCI
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
0
Merci
voilà qui est bien plus propre^^
PCPT
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Dernière intervention
9 juin 2006
0
Merci
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.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.