Utilisation de InvokeLostFocus()

Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
- - Dernière réponse : Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
- 29 sept. 2006 à 10:52
Bonjour,

dans un projet je suis emmener à utiliser un clavier virtuel (utilisation d'un programme par ecran tactile donc pas de clavier 'réel').
Le clavier réagi avec l'application appelante. Cette derniere lui envois le nom du champ à remplir pour que sur le clavier virtuel on indique ce nom et un champ de saisie.

Le champ a remplir sur la form appelante est un composant infragistic. Très jolie mais avec des comportements bizarre (pour les OnClick, OnEnter etc ... qui ne sont pas appelé tout le temps).

Donc, là ou ca bloque c'est que j'aimerai, sur la form appelante, générer l'evènement LostFocus() sur le controle à remplir pour lancer la procédure de validation du control (Lorsque je fais tabulation ca fonctionne, car le controle perd le focus).

Sur le site des MSDN, j'ai vu la fonction InvokeLostFocus à appliquer sur un Control qui devrait faire ca.
Mais lorsque je l'implémente, visual studio (.net1.1) mais dis que je ne peux pas cette méthode est inaccecible du à son niveau de protection

Je suis OK, elle est définie en:
protectedvoid InvokeLostFocus (
    Control toInvoke,
    EventArgs e
)
Mais comment alors je peux l'utiliser? Impossible de trouver un exemple sur le net. Sur les forum où ils en parlent, les personnes ne semblent pas avoir de probleme pour l'utiliser, je ne sais pas où je me trompe.

f.colo
Afficher la suite 

10 réponses

Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
1
0
Merci
J'ai regarder la fonction InvokeOnClick sur un code de taharban (CALCULATRICE).
Il ne fait rien de particulier, surtout que en recopiant son code, VisualStudio me propose bien la fonction InvokeLostFocus.
Je ne comprend pas comment l'utiliser dans mon code. Juste appeler InvokeLostFocus sur mon controle, sans regarder l'application autour.

f.colo
Commenter la réponse de cs_fcolo
Messages postés
546
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
4 mai 2007
1
0
Merci
Vu que cette méthode est protected et qu'il te signale qu'elle est innaccecible à cause de son niveau de protection..
Tu n'essaierais pas de l'éxécuter en dehors de la classe de ton control ?
Commenter la réponse de MoDDiB
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
1
0
Merci
Oui, j'essais de l'appeler ailleur.
J'ai une classe qui connait le controle à mettre à jours avec une fonction de mise a jours.
Il y a toute une procédure (c'est pas moi qui l'ai codé) qui permet d'appeler depuis le clavier cette fonction.
Cette fonction est du type:

private

Control mZoneDeTexteCourante;

public
void MettreAJourAvecCV(
string texteSaisi)
{

if(mZoneDeTexteCourante !=
null)
{
mZoneDeTexteCourante.Text = texteSaisi;

}
}

mZoneDeTexteCourante est en fait un textBox (infragistics) pour la saisie de valeur pour un logiciel. Lorsque ce textBox perd le focus, il exécute une action (requete BDD).
A l'origine, depuis le clavier virtuel, j'envoyer un tabulation par sendInput mais ca pose certain probleme par la suite lorsque le focus passe à un autre controle.
C'est pour celà que j'aimerai trouver une solution qui valide le textBox en lui enlevant le focus ou en simulant la perte du focus.

Cette solution semblait bonne, à part la notion de "protected" qui me bloque.

f.colo
Commenter la réponse de cs_fcolo
Messages postés
546
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
4 mai 2007
1
0
Merci
Il te suffit d'appeler l'évènement dans la form appelante dans une fonction publique et d'appeler cette fonction non ?
Commenter la réponse de MoDDiB
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
1
0
Merci
J'arrive a appelé cette fonction, ce que je veux faire c'est après enlever le focus du controle appelant.

f.colo
Commenter la réponse de cs_fcolo
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29
0
Merci
Salut, pas bien compris.. et si tu donnes le focus à un autre contrôle ou forme avec la méthode Focus ?
Commenter la réponse de Lutinore
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
1
0
Merci
Je vais essayer de mieux expliquer :).

J'ai deux applications qui tourne en .NET 1.1 sur un automate possédant un ecran tactile. Sur l'automate il n'y a pas de clavier ni de souris.
Une des applications est un clavier virtuel, du même genre que celui de windows. On doit pouvoir s'en servir pour des application PC normale mais aussi avec la seconde application. Dans ce dernier cas, sur le clavier, on doit retrouver le nom du champ à mettre à jour ainsi qu'un textBox (sur le clavier) pré-rempli de la valeur à mettre à jours.

Lorsque je clique sur un champ éditable de la seconde application, le clavier virtuel doit automatiquement s'ouvrir et se placer au plus proche du champ. (tout ca fonctionne)
Sur le clavier virutel, on rempli la nouvelle valeur (dans le textbox du clavier) et on valide. La fonction de la seconde application  MettreAJourAvecCV()
est appelée, le champ précédement cliqué est mis a jour mais conserve le focus. Pour le valider et lancer la procédure de controle de la valeur entrée, il faut qu'il perde le focus.
La seconde application est faite par des Interfaces, et la partie qui communique avec le clavier virtuel ne connait que le champ à mettre à jours comme un contrôle. Plusieurs types de champs peuvent appeler le clavier.
Ces champs sont généralement des composants infragistics. Le problème avec ces composants est qu'ils ont un comportement bizarre. L'evenement clic est levé que si le composant n'a pas le focus (je sais, c'est bizarre, je me m'arrache les cheveux avec ces composants). Ca veux dire que si on ferme le clavier virtuel, et qu'on veux ré-éditer le champ qui a le focus et cliquant dessus, ca ne rappelle pas le focus car l'evenement clic n'est plus généré. Donc on envoi aussi une tabulation lorsqu'on ferme le clavier pour palier se probleme.

Pour faire sortir le focus du controle, j'envois actuellement une tabulation à la seconde application depuis le clavier virtuel avec SendInput du clavier. Un SelectNextControl() ne fonctionne pas car on reste dans le composant infragistics. On dirait qu'ils ont plusieurs couches.
L'autre idée a été de récupérer la form contenant le controle avec un findform(). Mais même en faisant un .focus() sur la form le controle conserve le focus (y a toujours le pipe clignotant de windows dedans).

La solution d'envoi d'une tabulation est bien pour valider le champ mais, pour palier au problème du clic qui n'est plus généré, on appelle aussi le clavier virtuel depuis l'evenement OnEnter(). Donc, si le champ suivant qui prend le focus est éditable, il rappelle le clavier car le OnEnter est levé. Donc sur une fenetre avec plusieur controle éditable il est impossible de fermer le clavier.

C'est pour cela que l'idée de simuler la sortie du focus me plaisait, mais elle semble pas possible.

f.colo
Commenter la réponse de cs_fcolo
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29
0
Merci
Tu peux toujours tenter d'envoyer le message WM_KILLFOCUS avec SendMessage mais je ne sais pas comment va réagir l'application..

Pour palier le problème du clique qui ne répond pas ( si j'ai bien compris, pas sûr ^^ ) tu peux essayer d'intercepter le clique au niveau de la forme avant qu'il arrive au contrôle en implémentant IMessageFilter.
Commenter la réponse de Lutinore
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
1
0
Merci
Merci Lutinore pour ton aide, mais ca n'a pas plus fonctionné :).
ICI, quelqu'un donne une explication (en anglais) du pkoi ne pas (jamais) utiliser le WM_SETFOCUS et WM_KILLFOCUS.

First, you NEVER, EVER send WM_SETFOCUS.  Ever.  This is a notification sent by the SetFocus API to inform the window that focus has been set; it does not itself set thefocus.
Finally, you NEVER, EVER send WM_KILLFOCUS.  Ever.  This is as incorrect as sending WM_SETFOCUS.  It does not kill the focus, any more that WM_SETFOCUS sets the focus.

Voila ce que j'avais fait:

using System.Runtime.InteropServices;

[DllImport("user32.dll", EntryPoint="SendMessage")]

public
static
extern
int SendMessage (
IntPtr hwnd,

uint wMsg,

int wParam,

int lParam);

private
void EnvoiePerteFocus(IntPtr hwnd)
{

uint WM_KILLFOCUS = 0x0008;
SendMessage(hwnd, WM_KILLFOCUS,0, 0);
}

Pour l'utilisation du IMessageFilter, le probleme est que l'application touche à sa fin, et les controle appelant le clavier sont présent dans trop de fenêtres pour que dans chacune j'implémente un cas spécifique au controle.
A l'heure actuelle, nous allons livrer cette version du clavier virtuel et on verra par la suite

Merci en tout cas pour votre aide, même si je n'ai pas du etre tres clair dans mes explication.

f.colo
Commenter la réponse de cs_fcolo
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29
0
Merci
C'est pour ça que j'ai écris "mais je ne sais pas comment va réagir l'application..". : ) Comme tes contrôles gérent apparemment de manière particulière le focus, ont pouvait tenter, les concepteurs du contrôle ont peut être implémentés un comportement particulier pour le message WM_KILLFOCUS.
Commenter la réponse de Lutinore