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

chemins_hermes Messages postés 8 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 19 juillet 2006 - 19 juil. 2006 à 00:55
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 20 juil. 2006 à 11:05
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
19 juil. 2006 à 01:06
En vrai code:
PostMessage(hdlg, WM_NEXTDLGCTL, 0, 0); // next ctrl
PostMessage(hdlg, WM_NEXTDLGCTL, 1, 0); // prev ctrl

ciao...
BruNews, MVP VC++
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
19 juil. 2006 à 05:38
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.
0
chemins_hermes Messages postés 8 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 19 juillet 2006
19 juil. 2006 à 14:28
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.
0
chemins_hermes Messages postés 8 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 19 juillet 2006
19 juil. 2006 à 14:52
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.
0

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

Posez votre question
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
20 juil. 2006 à 05:40
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juil. 2006 à 11:05
Sur Borland sans Borlanderies c'est ici:
http://www.cppfrance.com/code.aspx?ID=28232

ciao...
BruNews, MVP VC++
0
Rejoignez-nous