TEdit problème

vez_from_hell Messages postés 14 Date d'inscription jeudi 10 février 2005 Statut Membre Dernière intervention 15 mars 2006 - 10 févr. 2005 à 03:06
Dvdmizo Messages postés 74 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 3 mai 2006 - 12 févr. 2005 à 17:34
bonsoir
je travail avec Borland C++ Builder 5 et je souhaite que mon TEdit devienne une variable int.

exemple:

//---------------------------------------------------------------------------


#include <vcl.h>
#pragma hdrstop


#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Edit1Change(TObject *Sender)
{
AnsiString var = Edit1->Text;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
{
int nb_un;


nb_un=random(1+99);



if(Edit1>nb_un)
{
MsgBox("Entrez un plus petit chiffre");
}
if(Edit1<nb_un)
{
MsgBox("Entrez un plus grand chiffre");
}
if(Edit1 == nb_un)
{
MsgBox("Vous l'avez eu");
}
}
//---------------------------------------------------------------------------

je sais que c'est très basique mais je suis débutant et c'est mon premier programme en c++
alors si quelqu'un voudrait m'aider svp soit en corrigeant mes erreurs ou simplement me disant comment on fait pour mettre un TEdit en variable int.

3 réponses

Dvdmizo Messages postés 74 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 3 mai 2006
10 févr. 2005 à 09:59
Salut,


j'ai refait ton petit prog voici le source :



j'ai juste placé un TEdit et un TBitBtn sur la form



tout d'abord le .h

unit1.h



//---------------------------------------------------------------------------



#ifndef Unit1H

#define Unit1H

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include

//---------------------------------------------------------------------------

class TForm1 : public TForm

{

__published: // Composants gérés par l'EDI

TEdit *Edit1;

TBitBtn *BitBtn1;

void __fastcall Edit1KeyPress(TObject *Sender, char &Key);

void __fastcall BitBtn1Click(TObject *Sender);

private: // Déclarations utilisateur

public: // Déclarations utilisateur

__fastcall TForm1(TComponent* Owner);

void choisis_un_nombre(void) ;

unsigned int le_nombre ;

};

//---------------------------------------------------------------------------

extern PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif





et voici le .cpp

unit1.cpp



//---------------------------------------------------------------------------



#include <vcl.h>

#include <time.h>

#include <stdlib.h>

#include <stdio.h>

#pragma hdrstop



#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

void TForm1::choisis_un_nombre(void)

{

randomize() ; // initialise le générateur de nombre aléatoires


// très utile car sans lui à chaque redémarrage on obtiendrait


// toujours la même séquence


// randomize est definie dans <time.h>

le_nombre = random(1+99); // la fonction random est définie dans <stdlib.h>

}

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

choisis_un_nombre() ; // au démarage on commence par choisir un nombre

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)

{

// cet évenement est appelé quand on appuie sur une touche

// la variable Key contient le code de la touche appuyée



// Si on appuie sur autre chose que des touches entre '0' & '9'

// et autre chose que la touche 'Backspace' (effacement juste au dessus de 'return')

// ou encore si c'est autre chose que la touche 'entrée'

if((Key < '0' || Key > '9') && Key != 8 && Key != 13)

{

Key = 0 ; // on annule la touche en mettant 0 dedans

}

if(Key == 13) // si on appuie sur la touche 'entrée'

{

BitBtn1Click(Sender) ; // on force l'appel à la fonction de click du bouton

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn1Click(TObject *Sender)

{

unsigned int nombre_saisi ;

char message[100] ;



try // on essaye de récupérer en int la valeur saisie dans Edit1

{

nombre_saisi = Edit1->Text.ToInt() ;

}

catch(...) // si la valeur déclenche une exception car elle n'est


// pas transformable en int on averti l'utilisateur

{

Application->MessageBoxA("Le nombre saisi n'est pas valide", "Erreur", MB_OK|MB_ICONSTOP) ;

return ; // et on sort de la fonction

}



// si tout s'est bien passé...



if(nombre_saisi < le_nombre)

{

Application->MessageBoxA("Trop petit", "Raté", MB_OK|MB_ICONINFORMATION) ;

}

if(nombre_saisi > le_nombre)

{

Application->MessageBoxA("Trop grand", "Raté", MB_OK|MB_ICONINFORMATION) ;

}

if(nombre_saisi == le_nombre)

{

// sprintf est définie dans <stdio.h>

sprintf(message, "Le nombre était bien : %d", le_nombre) ;

Application->MessageBoxA(message, "Raté", MB_OK|MB_ICONINFORMATION) ;



// on choisit un autre nombre puisque le précédent a été trouvé

choisis_un_nombre() ;



// et on avertit le joueur qu'on est prêt à recommencer...



Application->MessageBoxA("Un nouveau
nombre a été choisi, cliquer sur OK pour continuer à jouer", "Prêt",
MB_OK|MB_ICONINFORMATION) ;

}

}

//---------------------------------------------------------------------------



voila...

quelques petites explications sur le conversion en int d'un TEdit:

Un TEdit contient une propriété Text qui n'est autre qu'un AnsiString.
Les AnsiStrings possèdent des Methodes pour travailler au niveau des
chaines, ici j'ai utilisé ToInt() pour convertir en int mais il en
existe plein (ToDouble(), Length(), etc....)

Le truc avec la Methode ToInt() c'est qu'elle déclenche une exception
si la valeur est incorrecte (chaine vide ou bien contenant des
caractères impossibles à convertir en entiers (lettres ou ponctuation))


pour éviter que l'utilisateur ne puisse saisir n'importe quoi, j'ai
fait un filtrage directement en réponse à l'évenement d'appui sur une
touche pour ne garder que les chiffres ou les caractères qui
m'interressent (entrée ou effacement).

bon, maintenant la conversion n'échouera pas à cause de mauvais
caractères, mais la chaine peut très bien être vide. Pour réagir à
cela, 2 possibilités :



- soit en testant que la chaine n'est pas vide :



if(Edit1->Text == "")

{

Application->MessageBoxA("La chaine est vide", "Erreur", MB_OK) ;

}



- soit en interceptant l'exception et en affichant un message
personnalisé, ce que j'ai fait dans l'exemple ci-dessus avec le bloc
Try { } Catch {} . Personellement je préfère cette methode car elle me
permet de m'assurer que je n'ai pas oublié une situation à traiter et
que je ne me retrouverai pas avec un message en anglais
incompréhensible pour l'utilisateur au cas où on tomberait sur une
situation imprévue ...



bon, je crois que je vais arrêter là



si tu as des questions n'hesite pas ;-)


DvdMizo
0
vez_from_hell Messages postés 14 Date d'inscription jeudi 10 février 2005 Statut Membre Dernière intervention 15 mars 2006
11 févr. 2005 à 23:22
merci ça m'a beaucoup aidé mais maintenant j'ai un autre problème.
Si je veut filtrer les nombres qui sont supérieur à 99 et faire apparaître un MessageBox pour avertir de l'invalidité, ça ne fonctionne pas. J'ai essayé

if(Edit1->Text > "99")
{
Application->MessageBoxA("This is not valid. Try again", "Error", MB_OK|MB_ICONSTOP) ;
return;
}

mais ça ne marche pas.
Pouvez vous m'indiquer l'astuce svp.
Merci d'avance
0
Dvdmizo Messages postés 74 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 3 mai 2006
12 févr. 2005 à 17:34
si tu récupères la valeur dans un int ça sera plus facile ;-)

...
unsigned int nombre_saisi ;

...
try // on essaye de récupérer en int la valeur saisie dans Edit1
{
nombre_saisi = Edit1->Text.ToInt() ;
}
catch(...) // si la valeur déclenche une exception car elle n'est
// pas transformable en int on averti l'utilisateur
{
Application->MessageBoxA("Le nombre saisi n'est pas valide", "Erreur", MB_OK|MB_ICONSTOP) ;
return ; // et on sort de la fonction
}

if(nombre_saisi > 99)
{
Application->MessageBoxA("This is not valid. Try again", "Error", MB_OK|MB_ICONSTOP) ;
return;

}

DvdMizo
0
Rejoignez-nous