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

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

PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 22 août 2005 à 15:39
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
cs_Eric25 175 Messages postés mardi 19 octobre 2004Date d'inscription 26 juin 2006 Dernière intervention - 22 août 2005 à 19:33
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 22 août 2005 à 10:31
0
Utile
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
cs_Eric25 175 Messages postés mardi 19 octobre 2004Date d'inscription 26 juin 2006 Dernière intervention - 22 août 2005 à 10:44
0
Utile
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??
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 22 août 2005 à 10:50
0
Utile
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 4172 Messages postés mercredi 30 juillet 2003Date d'inscription 9 juin 2006 Dernière intervention - 22 août 2005 à 13:54
0
Utile
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 !!!!
cs_Eric25 175 Messages postés mardi 19 octobre 2004Date d'inscription 26 juin 2006 Dernière intervention - 22 août 2005 à 14:46
0
Utile
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
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 22 août 2005 à 15:19
0
Utile
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
cs_Eric25 175 Messages postés mardi 19 octobre 2004Date d'inscription 26 juin 2006 Dernière intervention - 22 août 2005 à 15:27
0
Utile
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...
cs_Eric25 175 Messages postés mardi 19 octobre 2004Date d'inscription 26 juin 2006 Dernière intervention - 22 août 2005 à 15:44
0
Utile
C'est une tres bonne idée. Je vais voir ce que ca donne...

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