Passage d'un control a l'autre par la touche enter

Signaler
Messages postés
8
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
19 juillet 2006
-
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
bonjour, je cherche le moyen de creer un control Tedit qui
- 1 : n'accepte que les nombres  (expl:  1.02 , 2.00 )
- 2 : a la validation par Enter passe au control suivant.(je n'ai pas trouver comment faire cela n'accepte que la touche TAB pour passer au control suivant)
- 3 : eventuellement avec les touche fleche haut bas droite gauche home fin , le focus ce deplace du control actuel a celui situé soit audessu, audessous , a droite ou a gauche.
- 4 il y a 6 controles Tedit en deux rangées de 3.

je debute il y a bien le detournement de la wndproc mais je n'arrive pas a trouver comment simuler l'appui de TAB lorsque j'appui sur Enter.
ou d'envoyer un message pour donner le focus au control suivant

je travaille avec Cbuilder 3.

merci de m'aider.

amicalement pierre

6 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
En vrai code:
PostMessage(hdlg, WM_NEXTDLGCTL, 0, 0); // next ctrl
PostMessage(hdlg, WM_NEXTDLGCTL, 1, 0); // prev ctrl

ciao...
BruNews, MVP VC++
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Personnellement, j'utilise le détournement de la WNDPROC de l'Edit. Ca s'appelle le sous-classement. Puisque la fenêtre mère ne pourra pas détecter l'appui sur la touche dans un Edit ayant le focus, il faudra donc sous-classer ce dernier afin d'intercepter cette touche dans la procédure de sous classement. Pendant le traitement du message WM_KEYDOWN, on vérifie que wParam correspond à VK_RETURN ou VK_TAB. Si c'est le cas, on appelle la fonction GetWindow() qui permet de trouver le HWND de l'Edit précédent ou suivant. On passera ensuite ce HWND à SetFocus(). Une seule procédure servira pour tous les Edits.
Pour l'Edit qui ne doit accepter que les nombres, tu lui mets le style ES_NUMBER. Là encore, le sous-classement permet un filtrage beaucoup plus sophistiqué en cas de besoin.

Je ne tavaille pas sur Builder mais le principe reste le même. Si tu veux utiliser les APIs, je peux te faire un exemple de code.
Messages postés
8
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
19 juillet 2006

En vrai code:
PostMessage(hdlg, WM_NEXTDLGCTL, 0, 0); // next ctrl
PostMessage(hdlg, WM_NEXTDLGCTL, 1, 0); // prev ctrl

Merci du renseignement

je suppose que hdlg et le handle de la fiche contenant les controls. ?

mais, je viens d'essayer cette methode mais il n'y a aucun effet.

je rappelle mon projet .
une fiche TForm contient 6 composants( control )Tedit.
placé en deux rangées de 3.
je desire que lorsque je tape ENTER (ou fleche droite ou gauche) je passe au Tedit suivant ou precedent.
je ne tape dans ces Tedit que des nombres (avec decimales)
j'ai essayé avec le Handle de TForm et celui du control dans lequel je tape un nombre. mais rien ne ce passe . pourtant le message est bien envoyé .(peut etre j'ai pas utilisé le bon Handle )

je prefere que le message soit envoyé par le Tedit concerné ( pour créer un composant deviré par la suite)

merci.
Messages postés
8
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
19 juillet 2006

Dans Cbuilder 3 je n'arrive pas

lorsque je fait
 Handlesuivant = GetWindow(Handle,GW_HWNDNEXT);

Handle etant le Handle du control dans lequel je suis.
 
j'obtiens toujours un handle NULL.

d'autre Part SetFocus est une methode de TWinControl elle n'a pas d'argument.
je semble pas avoir acces a la fonction de window SetFocus (HWND);

Merci du renseignement

je rappelle mon projet .
une fiche TForm contient 6 composants( control )Tedit.
placé en deux rangées de 3.
je desire que lorsque je tape ENTER (ou fleche droite ou gauche) je passe au Tedit suivant ou precedent.
je ne tape dans ces Tedit que des nombres (avec decimales)
j'ai essayé avec le Handle de TForm et celui du control dans lequel je tape un nombre. mais rien ne ce passe . pourtant le message est bien envoyé .(peut etre j'ai pas utilisé le bon Handle )

je prefere que le message soit envoyé par le Tedit concerné ( pour créer un composant deviré par la suite)

merci.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Essaie de travailler directement en API. Pour cela je pense que tu devras créer un nouveau projet ne faisant pas appel aux trucs specifiques à Builder. C'est possible car j'ai une fois vu sur ce site un code source 100% API utilisant Builder. Tu peux aussi changer d'outil de travail en optant par exemple pour Visual C/C++ Express 2005. Il est gratuit et excellent.
Voici un tutorial contenant les liens de téléchargement et les étapes à suivre pour le paramétrer:
http://www.cppfrance.com/codes/PROGRAMMER-WIN32-AVEC-VISUAL-CPLUSPLUS-EXPRESS-TUTORIAL_38359.aspx
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Sur Borland sans Borlanderies c'est ici:
http://www.cppfrance.com/code.aspx?ID=28232

ciao...
BruNews, MVP VC++