IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[API] Récupérer la valeur d'un champs EDIT ?


Sujet :

MFC

  1. #1
    Membre averti

    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2005
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 195
    Points : 425
    Points
    425
    Par défaut [API] Récupérer la valeur d'un champs EDIT ?
    Salut,

    Dans un 1er temps, je ne sais pas vraiment si c'est des MFC ou pas, et dans un 2eme j'ai bien lu le "Tutorial d'initiation
    A la programmation avec l'API Windows" mais j'ai du mal a comprendre :s.

    Je voudrai savoir comment faire pour récupérer la valeur d'un champs EDIT numérique, faire de calcule avec, puis l'affichiger dans un MessageBox()
    D'après le tuto nommé ci-dessus, il faut employer la fonction GetDlgItemInt() or il me renvoie rien.

    Bon je vais essayer d'exposer un peu mieux le problème:
    J'aimerai réaliser une petite appli, cette appli serai une boîte de dialogue avec 2 contrôles de type "Edit", les 2 seraient numérique.

    Pour l'instant, grace au tuto, j'ai réussi a créer la fenêtre, et les contrôles mais impossible de faire un calcule avec, le calcule est aussi simple que ça:
    ou cn serai le 1er contrôle "Edit" et f le 2eme... et lorsque l'on cliquerai sur calculer, le MessageBox() afficherai le résultat.. et c'est là ou j'ai du mal, je n'arrive pas a faire de calcule avec les contrôles "Edit", et impossible de l'envoyer dans le MessageBox()..

    Si vous pouviez m'orienté ça serai fort simpatique ..

    voila mon code actuelle:
    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
    // Procédure de gestion de la boite de dialogue
    LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam)
    {
    	int Select, iLine, total, cn=0,f=0;
    	char *buf="";
     
    	switch(message)
    	{
    		case WM_COMMAND:
     
    			Select=LOWORD(wParam);
    			BOOL fError; 
    			BOOL fRelative;
     
    			fRelative = TRUE; 
     
    			switch(Select)
    			{
    				case IDOK:
     
    					//GetDlgItemText(Dlg,IDC_EDIT1,buf,2);
    					//GetDlgItemText(Dlg,IDC_EDIT2,buf2,2);
     
                        iLine = GetDlgItemInt(Dlg,IDC_EDIT1, &fError, fRelative); 
     
    					if (iLine)
    					{
    						SetDlgItemText(Dlg,IDC_EDIT1,buf);
    						MessageBox(Dlg, buf, "test", MB_OK); 
    					}
     
    					// total = ((cn*f)/200);
     
     
    				return TRUE;
     
    				case IDCANCEL:
    					EndDialog(Dlg,Select);
    				return TRUE;
    			}
    		default:
    		return FALSE;
    	}
    }
    Merci par avance,
    Cordialement.

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    ce que je te propose :

    rajouter une variable à ta callback :dans le WM_CREATE, récuperer le handle de l'édit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hEdit = GetDlgItem(Dlg, IDC_EDIT1);
    Puis, dans le IDOK, récuperer la valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    						int len = GetWindowTextLength(hEdit);
    						char * buff = new char[len+1];
    						GetWindowText(hEdit, buff, len+1);
    attention, buff devra etre libéré


    ps : c'est pas du MFC, mais de l'API

  3. #3
    Membre averti

    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2005
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 195
    Points : 425
    Points
    425
    Par défaut
    Salut nico-pyright(c),

    Merci, mais j'ai certainement très mal compris ce que tu viens de me dire car ça ne fonctionne toujours pas malgrès le code fournis.. peu être que cela vien de mon code (très certainement )

    Voila le code entier en ésperant que ça aide plus :/, il doit d'ailleur être pliens de fautes..
    .: Edit :.
    Boulet je suis, le code fonctionne en le modifiant un peu
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #include <windows.h>
    #include "resource.h"
     
    // Prototype de notre fonction
    LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam);
     
    // Rien de spécial ici
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)
    {
     	DialogBox(hInstance,(LPCTSTR)IDD_DIALOG1,NULL,(DLGPROC)MainProc);
    	return 0;
    }
     
    // Procédure de gestion de la boite de dialogue
    LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam)
    {
    	int Select, iLine;
    	char *buf="";
    	static HWND hEdit;
     
    	switch(message)
    	{
    		case WM_COMMAND:
     
    			Select=LOWORD(wParam);
    			BOOL fError; 
    			BOOL fRelative;
     
    			fRelative = TRUE; 
     
    			switch(Select)
    			{
    				case IDOK:
                        iLine = GetDlgItemInt(Dlg,IDC_EDIT1, &fError, fRelative); 
    					hEdit = GetDlgItem(Dlg, IDC_EDIT1);
     
    					if (iLine)
    					{
    						int len = GetWindowTextLength(hEdit); 
    						char * buff = new char[len+1]; 
    						GetWindowText(hEdit, buff, len+1); 
     
    						MessageBox(Dlg, buff, " Calcule", MB_OK); 
    					}
    					// total = ((cn*f)/200);
    				return TRUE;
     
    				case IDCANCEL:
    					EndDialog(Dlg,Select);
    				return TRUE;
    			}
    		default:
    		return FALSE;
    	}
    }

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    je ne vois pas de désallocation pour buff

    ensuite, il est en général plus judicieux de faire les initialisations dans le WM_CREATE

    Enfin, si tu récupères un nombre, il faudra le convertir comme indiqué dans la FAQ

  5. #5
    Membre averti

    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2005
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 195
    Points : 425
    Points
    425
    Par défaut
    Salut nico-pyright(c),

    Effectivement, il n'y en a pas pour l'instant, j'y penserai la prochaine fois pour WM_CREATE (or dans l'exemple donnée il n'y est pas).

    Pour la conversion, avec ton code pas de problème je le recupere bien mais je n'arrive pas à faire de calcule avec :/

    Pour détruire buff il faut que je face "delete []buff" non ?

    Merci

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    suffirait ; attention, il ne faut pas le faire n'importe quand bien sur ...
    Si tu ne le maitrises pas, tu peux remplacer par une chaine statique assez longueet virer l'étape du new

    Pour la conversion, je n'ai rien indiqué (a part d'aller voir dans la faq), mais si tu veux pouvoir faire une multiplication sur ta chaine récupérée, il va falloir la transformer (avec strtod) ; ensuite, si tu veux l'afficher dans un messageBox, il faudra la retransformer en chaine (avec sprintf par exemple)

  7. #7
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Darkenshin
    Effectivement, il n'y en a pas pour l'instant, j'y penserai la prochaine fois pour WM_CREATE (or dans l'exemple donnée il n'y est pas).

    Pour détruire buff il faut que je face "delete []buff" non ?

    Merci
    Non ! II faut pas y penser 3 jours après . C'est tout de suite qui faut le faire sinon ton appli va être instable , la mémoire va se fragmenter..
    C'est pourtant simple boudiou : un new , un delete.
    Evidemment il faut désallouer le tampon au bon moment

  8. #8
    Membre averti

    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2005
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 195
    Points : 425
    Points
    425
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     int len = GetWindowTextLength(hEdit); 
                      char * buff = new char[len+1]; 
                      GetWindowText(hEdit, buff, len+1);
    Il semblerai que la conversion est déjà faite a partir de là

    Pour "delete buff;", il suffit de la possitionner apres l'utilisation non ?

  9. #9
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    vu que je sais pas ce que tu veux faire ...
    Mais, là, tu disposes d'une chaine de caractères.

    Voilà

  10. #10
    Membre averti

    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2005
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 195
    Points : 425
    Points
    425
    Par défaut
    Salut mat.M & nico-pyright(c),

    Oui effectivement

    @nico-pyright(c), lol, en faite je voudrai recuperer le champ1 et le champ2 (controle edit) faire (champ1*champ2)/200 puis l'afficher dans un messagebox() quand on click sur "ok"

    .: Edit :.
    En gros je voudrai convertire ça:
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
       float cn, f, c;
     
       printf("Votre cout en nourriture: ");
       scanf("%f", &cn);
     
       printf("\nVotre pourcentage de fermier: "); 
       scanf("%f", &f);
     
       if ((cn > 0) && (f > 0))
       {
    		c = ((cn*f)/200);
    		printf("\nVotre nombre maximal de ferme 'effectives' est de %.0f. \n\n", c); 
       }
       else
       {
    	   printf("Erreur !");
       }
     
     
       system("pause");
       return 0;
    }
    dans une API

  11. #11
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    d'où ma remarque, on ne peut pas multiplier des chaines entre elles ...
    il faut passer par des nombres (entier, double, ce que tu veux).

    Enfin, tu verras quand tu en auras besoin

    Si ton post est résolu, n'oublie pas le bouton en bas à gauche

  12. #12
    Membre averti

    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2005
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 195
    Points : 425
    Points
    425
    Par défaut
    Oui, mais il n'est pas totalement résolu :/
    sinon regarde le poste au dessus, j'ai éditer mais tu a répondu avant ^^

    Je sais qu'il faut passer par des int ou des float mais le problème si je fait:
    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
    					if (iLine && iLine2)
    					{
    						int len = GetWindowTextLength(hEdit); 
    						int len2 = GetWindowTextLength(hEdit2); 
     
    						int test;
    						test = len*len2;
     
    						char * buff = new char[test+1]; 
     
    						GetWindowText(hEdit, buff, test+1);
    						MessageBox(Dlg, buff, " Calcule", MB_OK); 
     
    						delete buff;
     
    					}
    il n'affiche que le 1er
    .: Edit :.
    Et non le résultat de la multiplication

  13. #13
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    alors, comprenons nous bien
    len c'est la longueur du champ (donc de la chaine)
    si tu rentres "123456", len va valloir 6

    donc, il faut que tu fasses un GetWindowText/GetWindowTextLength sur chaque EDIT.
    Tu vas obtenir 2 variables chaine (buff1 et buff2 par exemple)

    ensuite, il va falloir les convertir en double par exemple avec strtod
    faire la multiplication
    puis convertir le résultat en chaine avec sprintf pour affichage dans un messagebox

  14. #14
    Membre averti

    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2005
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 195
    Points : 425
    Points
    425
    Par défaut
    J'avais bien compris d'ou ce que j'avais fait :
    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
    					if (iLine && iLine2)
    					{
    						int len = GetWindowTextLength(hEdit); 
    						int len2 = GetWindowTextLength(hEdit2); 
     
    						char * buff = new char[len+1]; 
    						char * buff2 = new char[len2+1];
     
    						GetWindowText(hEdit, buff, len+1);
    						GetWindowText(hEdit2, buff2, len2+1);
     
    						char *pEnd,*pEnd2;
    						double dbl, dbl2, test;
     
    						dbl = strtod (buff,&pEnd);
    						dbl2 = strtod (buff2,&pEnd2);
     
    						test = (dbl*dbl2);
     
    						// total = ((cn*f)/200);
    						MessageBox(Dlg, buff, " Calcule", MB_OK); 
    						MessageBox(Dlg, buff2, " Calcule", MB_OK);
     
    						delete buff;
    						delete buff2;
    					}
    mais après la multiplication je suis un peu perdu car sprintf() me dit qu'il ne peut pas convertir de l'int avec du char * :/ ensuite il me manque l'info sur comment l'implémenter dans le messagebox()

    sprintf ("Its square: %.0lf\n",test);

    error C2664: 'sprintf' : cannot convert parameter 2 from 'double' to 'const char *'

  15. #15
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    ca te fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    test = dbl*dbl2 / 200;
    char temp[50];
    sprintf(temp,"Résultat : %f",test);
    MessageBox(Dlg, buff, temp, MB_OK);

  16. #16
    Membre averti

    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2005
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 195
    Points : 425
    Points
    425
    Par défaut
    Merci :o

    tout fonctionne grace a toi , dsl d'avoir jouer le boulet j'ai un peu de mal avec le C

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer la valeur d'un champ Edit
    Par Watier_53 dans le forum VBScript
    Réponses: 3
    Dernier message: 28/03/2008, 17h00
  2. API pour récupérer la valeur d'un champ Edit
    Par buteiduil dans le forum Windows
    Réponses: 4
    Dernier message: 15/05/2005, 22h32
  3. Réponses: 1
    Dernier message: 22/02/2005, 23h40
  4. Récupérer la valeur d'un champ disabled
    Par nebule dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/01/2005, 10h45
  5. récupérer la valeur du 2ème champ dans un DBLookUpListBox
    Par jakouz dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/07/2004, 16h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo