Salut
je veut taper des nombres avec virgules
dans le contrôle edit ;
quelle variable utiliser , comment faire ?
Merci
Salut
je veut taper des nombres avec virgules
dans le contrôle edit ;
quelle variable utiliser , comment faire ?
Merci
En général, on le laisse stocker une chaîne de caractères, que l'on convertit ensuite en nombre à virgule flottante.
Après, pour le détail, il faudrait savoir quel framework tu utilises, et quel langage.
Mac LAK.
___________________________________________________
Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.
Sources et composants Delphi sur mon site, L'antre du Lak.
Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.
Rejoignez-nous sur : ► Serveur de fichiers [NAS] ► Le Tableau de bord projets ► Le groupe de travail ICMO
je programme avec le language c,
apret avoire vue le tuto api win de ce site
j'essais de faire un programme avec api windows, qui fais le calcule
exemple : addition de deux nombres;
j'ai deffinit les variables avec float ...
mais sa ne marche pas
Comme te l'a dit Mac LAK, tu laisse l'utilisateur taper n'importe quelle chaîne dans ton EDIT, ensuite tu lis cette chaîne (avec GetWindowText par exemple) et la convertis en flottant (avec atof par exemple). Vient ensuite le moment d'améliorer ton programme : empêcher l'utilisateur de taper autre chose que ce qui peut bien être l'expression d'un nombre réel. Pour cela tu dois traiter l'événement EN_UPDATE du contrôle qui est généré chaque fois qu'il doit être mis à jour (chaque fois son texte à été modifié par exemple). A ce moment tu récupères le texte de l'EDIT et testes (avec strtod par exemple) si l'expression est bien valide. Si l'expression n'est pas valide, annule la dernière modification en lui envoyant le message EM_UNDO. Si t'as toujours des problèmes, poste ton code pour qu'on puisse voir ce qui ne va pas.
j'utilise GetDlgitemint et SetDlgitemint
sa ne permet pas d'ecrire du text juste les nombres en décimal
GetDlgitemText aussi
je suis débutan en api windows
merci pour votre aide
Salut
merci pour vos Réponses et votre aide.
le code est simple et permet de faire une addition de deux nombres
mais ils ne sont pas réel donc c'est pas pratique;
comment utiliser des nombres avec deux chiffres aprés la virgule?
fichier recource:
Fichier source:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #include <windows.h> #define IDE_EDIT1 101 #define IDE_EDIT2 102 DIALOG1 DIALOG 60, 60, 260, 80 STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Dialogue Principale" BEGIN DEFPUSHBUTTON "Ok", IDOK, 56, 55, 42, 12 LTEXT "Saisie d'un nombre :", -1, 45, 15, 80, 10 EDITTEXT IDE_EDIT1, 45, 30, 60, 12, ES_NUMBER | ES_RIGHT LTEXT "Saisie d'un nombre :", -1, 125, 15, 80, 10 EDITTEXT IDE_EDIT2, 125, 30, 60, 12, ES_NUMBER | ES_RIGHT END
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 #include <windows.h> #define IDE_EDIT1 101 #define IDE_EDIT2 102 BOOL APIENTRY DlgProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { DialogBox(hInstance,"DIALOG1",NULL,(DLGPROC)DlgProc); return 0; } //--------------------------------------------------------------------------- BOOL APIENTRY DlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK) { CHAR st[256]; UINT valeur,valeur1,valeur2 ; valeur1 = GetDlgItemInt(hDlg, IDE_EDIT1, NULL, FALSE); valeur2 = GetDlgItemInt(hDlg, IDE_EDIT2, NULL, FALSE); valeur = valeur1+valeur2; wsprintf(st, "La somme est: %d", valeur); MessageBox(hDlg, st, "Résultat", MB_OK); } if (LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg,0); return TRUE; } default: return FALSE; } }
Déjà il y a quelques corrections à faire :
- DlgProc ne doit plus retourner BOOL mais INT_PTR. BOOL, c'était à l'époque de la préhistoire. Si ton compilateur ne connaît pas le type INT_PTR, c'est qu'il est trop ancien et que tu devrais mettre à jour tes outils.
- Le code de formattage pour afficher un UINT est %u et non %d (INT).
- Si LOWORD(wParam) == IDOK, il n'y a ni un break pour quitter le bloc switch après le traitement ni un return pour terminer la fonction. Le traitement va alors se poursuivre avec le cas "case default:".
- Mettre un else entre les deux if. Pourquoi tester une deuxième fois une variable si on connaît déjà sa valeur ?
Après correction on obtient :
Quoiqu'on peut encore faire mieux ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 INT_PTR APIENTRY DlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK) { CHAR st[256]; UINT valeur,valeur1,valeur2 ; valeur1 = GetDlgItemInt(hDlg, IDE_EDIT1, NULL, FALSE); valeur2 = GetDlgItemInt(hDlg, IDE_EDIT2, NULL, FALSE); valeur = valeur1+valeur2; wsprintf(st, "La somme est: %u", valeur); MessageBox(hDlg, st, "Résultat", MB_OK); } else if (LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg,0); } return TRUE; default: return FALSE; } }
Si tu veux pouvoir utiliser les nombres décimaux, enlève le style ES_NUMBER dans chacun de tes EDIT. Ce style impose au contrôle de n'accepter que des chiffres (c'est-à-dire les caractères de 0 à 9), avec quelques subtilités supplémentaires et que je n'ai pas envie de détailler et que tu peux d'ailleurs parfaitement ignorer. Va plutôt sur MSDN si tu veux plus d'infos. Tu peux utiliser Get(/Set)WindowText ou Get(/Set)DlgItemText pour lire/modifier le texte d'un EDIT.
Le probléme est résolue
par les étapes suivantes:
1: atof
2: l'addition
3: et gcvt qui permet de convertire la variable on text
merci beaucoup et à la prochaine
gcvt est une fonction non standard et très obsolète. Utilise plutôt sprintf.
Salut
strdot na pas fonctionner avec ce programe, j'ais beaucoup essayer mais..
par contre gcvf permet de faire l'addition mais elle reconnait selement le pavé numerique c'est mieux que rien.
et bien sur l'utilisateur peut écrire tous ce qu'il veut ( Lettres et nombres )
j'ais pas bien compri EN_UPDATE et EM_UNDO ?
Merci encore
C'est strtod ("string to double") et non strdot. L'utilisation de cette fonction, entre autres, est expliquée ici. Et je n'ai pas bien compris ton problème avec gcvt mais d'ailleurs je t'ai déjà dit de ne pas utiliser cette fonction.
EN_UPDATE est une notification envoyée par un contrôle EDIT à la fenêtre à laquelle il appartient chaque fois qu'il doit se mettre à jour, comme je te l'ai déjà expliqué. Si tu ne sais toujours pas de quoi je parle, tout est expliqué dans ce tutoriel.
EM_UNDO est un message que tu envoies à un contrôle EDIT (envoyer un message peut se faire avec la fonction SendMessage) pour annuler la dernière modification de son contenu.
Salut
où peut-on mettre EN_UPDATE ?
j'ai fait if pour tester la valeur entrée.
j'ai écrie la ligne suivante :
SendDlgItemMessage(hwnd,ID_EDIT1,EM_UNDO,0,0);
sa na pas marcher je cherche encore
je cherche des exemples de codes qui pourront m'aider ?
Il y a des tutoriels que tu peux lire pour apprendre la programmation Windows. Le forum c'est plus pour des questions un peu particulières .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 case WM_COMMAND: switch(LOWORD(wParam)) { case LE_CONTROLE_EDIT: switch(HIWORD(wParam)) { case EN_UPDATE: /* Faire ce que t'as à faire. */ break; } break; } break;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager