[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:
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;
} |