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 :

[MFC][VC6.0] Custom CEdit, problème appel UpdateData


Sujet :

MFC

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 225
    Par défaut [MFC][VC6.0] Custom CEdit, problème appel UpdateData
    Salut tout le monde !

    J'ai un soucis avec un de mes contrôles à l'appel de la méthode UpdateData(TRUE). Le contrôle en question (dont le code est joint en fin de post) est un CEdit pour la saisie de nombre flottants. J'utilise ce contrôle dans une boîte de dialogue et j'ai associé à ce contrôle un flottant. Lorsque je valide ma boîte de dialogue, j'ai le message d'erreur "Please enter a number".

    Je ne vois pas trop ce que je dois faire alors si quelqu'un(e) peut me donner une piste ça serait super cool.

    D'avance merci pour vos réponses.

    Bonne soirée à toutes et à tous.

    Le code de mon contrôle est le suivant :
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
    // FloatEdit.cpp : implementation file
    //
     
    #include "stdafx.h"
    #include "FloatEdit.h"
     
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
     
    /////////////////////////////////////////////////////////////////////////////
    // CFloatEdit
     
    CFloatEdit::CFloatEdit()
    {
    }
     
    CFloatEdit::~CFloatEdit()
    {
    }
     
     
    BEGIN_MESSAGE_MAP(CFloatEdit, CEdit)
    	//{{AFX_MSG_MAP(CFloatEdit)
    	ON_WM_CHAR()
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
    /////////////////////////////////////////////////////////////////////////////
    // CFloatEdit message handlers
    void CFloatEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    	// On autorise uniquement les caractères de type suivants :
    	// chiffre
    	// virgule ou point
    	// moins
    	if( this->IsCypherChar(nChar) )
    	{
    		// On vérifie qu'on ne tente pas d'ajouter un chiffre avant le signe moins
    		if( this->IsNegative() && (LOWORD(this->GetSel())==0) )
    			return;
    	}
    	else if( this->IsDecimalChar(nChar) )
    	{
    		// Si le nombre en cours de sélection possède déjà un caractère décimale
    		// on sort de la méthode pour éviter d'avoir à traiter le caractère
    		if( this->HasDecimal() )
    			return;
    	}
    	else if( this->IsSignChar(nChar) )
    	{
    		// On change le signe
    		this->ToggleSign();
     
    		// On sort de la méthode car on ne souhaite pas traiter le caractère
    		// Dans le cas contraire, on affichera toujours le signe - même après
    		// l'avoir supprimé
    		return;
    	}
    	else
    		return;
     
    	CEdit::OnChar(nChar, nRepCnt, nFlags);
    }
     
    bool CFloatEdit::IsDecimalChar(UINT a_nChar) const
    {
    	// Le code ASCII de la virgule est 44 et celui du point est 46
    	return ( (a_nChar==44) || (a_nChar==46) );
    }
     
    bool CFloatEdit::IsCypherChar(UINT a_nChar) const
    {
    	// Le code ASCII du chiffre 0 est 48 et celui de 9 est 57
    	return ( (a_nChar>=48) && (a_nChar<=57) );
    }
     
    bool CFloatEdit::IsSignChar(UINT a_nChar) const
    {
    	// Le code ASCII du signe moins est 45
    	return ( a_nChar==45 );
    }
     
    bool CFloatEdit::IsNegative() const
    {
    	// On vérifie la présence du signe - dans la chaîne courante
    	// pour savoir si le nombre est négatif
    	CString l_szCurrentValue;
    	this->GetWindowText(l_szCurrentValue);
     
    	return ( l_szCurrentValue.Find("-")!=-1 );
    }
     
    void CFloatEdit::ToggleSign()
    {
    	// Récupération de la valeur courante
    	CString l_szCurrentValue;
    	this->GetWindowText(l_szCurrentValue);
     
    	// Modification de la valeur
    	if( this->IsNegative() )
    	{
    		// Suppression du caractère -
    		l_szCurrentValue.Remove('-');
    	}
    	else
    	{
    		// Ajout du caractère - en première position
    		CString l_szTemp = l_szCurrentValue;
    		l_szCurrentValue = "-";
    		l_szCurrentValue += l_szTemp;
    	}
     
    	// Affectation de la nouvelle valeur
    	this->SetWindowText(l_szCurrentValue);
    }
     
    bool CFloatEdit::HasDecimal() const
    {
    	// Si pour une raison ou une autre le caractère décimal ne peut être ajouté
    	// la méthode renvoie false, par exemple dans les cas suivants :
    	// - le caractère décimale est ajouté avant le signe moins
    	// - le caractère décimale est ajouté alors qu'il est déjà ajouté
     
    	// Récupération de la valeur courante
    	CString l_szCurrentValue;
    	this->GetWindowText(l_szCurrentValue);
     
    	// S'il y a déjà un caractère décimal on renvoie true
    	int l_nDecimalIndex = l_szCurrentValue.Find(",");
    	if( l_nDecimalIndex != -1 )
    		return true;
     
    	// S'il n'y a pas de caractère décimal mais qu'on tente de l'ajouter avant le signe
    	// moins on renvoie true
    	int l_nMinusIndex = l_szCurrentValue.Find("-");
    	if( (l_nMinusIndex != -1) && (LOWORD(this->GetSel()) == 0) )
    		return true;
     
    	return false;
    }

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    ce message est donné par la macro DDX_Text qui appelle la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AfxTextFloatFormat(CDataExchange* pDX, int nIDC,
        void* pData, double value, int nSizeGcvt)
    en cas d'echec de conversion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (_stscanf(szBuffer, _T("%lf"), &d) != 1)
    #endif // !_WIN32_WCE
            {
                AfxMessageBox(AFX_IDP_PARSE_REAL);
                pDX->Fail();            // throws exception
            }
    le message correspondant a AFX_IDP_PARSE_REAL est affiché.
    donc ta saisie n'est pas considérée comme valide...

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 225
    Par défaut
    Ok, je vais modifier ma classe CFloatEdit en forçant le caractère de la décimale à '.' plutôt que ',' car j'ai l'impression que c'est à cause de ça que la saisie est considérée comme invalide.

    Une fois le test validé je remonterai l'information.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 225
    Par défaut
    J'ai oublié de te remercier pour tes informations Farscape.

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    tu devrais faire un setlocale pour utiliser les paramètres windows.
    http://cpp.developpez.com/faq/vc/ind...CTimeFrenchSet

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 225
    Par défaut
    Je viens de faire un tour sur le lien MSDN indiqué dans la faq concernant le setLocale.

    Concernant mon code, j'avais effectivement un soucis de validité à cause du caractère utilisé pour la décimale. En utilisant le point plutôt que la virgule ça fonctionne.

    Encore merci pour les infos.

    ++

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/10/2010, 14h23
  2. Réponses: 1
    Dernier message: 31/01/2008, 16h55
  3. [MFC] retour chariot dans CEdit
    Par ricky78 dans le forum MFC
    Réponses: 4
    Dernier message: 13/07/2005, 10h30
  4. [MFC]Utilisation d'un SLIDER , problème de conversion
    Par sylvain_c42 dans le forum MFC
    Réponses: 1
    Dernier message: 10/05/2005, 14h31
  5. Réponses: 2
    Dernier message: 17/02/2004, 23h27

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