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 <Buttons.hpp>
//---------------------------------------------------------------------------
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