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

Langage C++ Discussion :

Saisie restreinte de caractères


Sujet :

Langage C++

  1. #1
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 176
    Points : 79
    Points
    79
    Par défaut Saisie restreinte de caractères
    Bonjour à tous,
    Je débute en Delphi C++ Builder après être passé par le Pascal de Delphi 10.2 Tokyo.
    J'ai un problème sur lequel je n'arrive pas à trouver de la documentation.
    Soit un TEdit (bandeEdit.Text) dans lequel je ne veux autoriser que les chiffres et le point. Voici le code en Pascal qui fonctionne parfaitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Var
     I: Integer;
     S: String;
    begin
     S :=  '';
     for I := 1 to Length(BandeEdit.Text) do
      if (BandeEdit.Text[I] in ['0'..'9','.']) then S := S + BandeEdit.Text[I];
      BandeEdit.Text :=  S;
    Voici le même traduit comme j'ai su (ou pu) en C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {
     int i;
     String S="";
     String txt = BandeEdit->Text;
     for (i = 1; txt.Length(); i++ );
    	{
    		if (BandeEdit->Text[i]) in (['0'.'9','.']));
    		{
    			S = S + BandeEdit->Text[i];
    		}
    		BandeEdit->Text=S;
    	}
    }
    J'ai forcément une erreur à la ligne 7 car le 'in' n'existe pas (du moins je pense) en C++.
    Pourriez-vous, s'il vous plait, me corriger cette erreur et me signaler d'éventuelles autres erreurs ou astuces de programmation sur ce cas précis ? J'attends actuellement un bouquin sur le C++.
    Merci beaucoup. Je compte sur votre aide.
    Cordialement

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par f5jcg_Lulu Voir le message
    J'ai forcément une erreur à la ligne 7 car le 'in' n'existe pas (du moins je pense) en C++.
    Si dans le C++ moderne tu as cette syntaxe "range" mais avec des itérateurs ou les tableaux STL. Il faut se renseigner et savoir si ton compilateur le supporte.
    Dans Delphi, c'est du Clang il me semble, mais pas à 100%

    Sinon réfléchis 1 peu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        c = BandeEdit->Text[i] // c type char
     
        if ((c == '0') || (c == '1') || (c == '2') || (c == '3') || (c == '4') ||
            (c == '5') || (c == '6') || (c == '7') || (c == '8') || (c == '9') || (c == '.')) {
     
            S += c;
        }
    Après en fonction de l'encodage des caractères, on peut simplifier Avec des caractères ASCII (type char), on peut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        c = BandeEdit->Text[i] // c type char
     
        if (((c >= '0') && (c <= '9')) || (c == '.')) {
     
            S += c;
        }

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Il n'y pas d'instruction in en C++, il existe à la place pleins d'autre moyens.
    Si on prend un peu de recul sur ce que fait la fonction, on voit qu'elle enlève tous les caractères qui ne font pas partie d'un nombre. Ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	auto   char_of_number = [](char c){ return c=='.' || std::isdigit(c); };
    	auto&  str = BandeEdit->Text;  // juste un alias
    	str.erase( std::stable_partition(str.begin(), str.end(), char_of_number), str.end() );
    On peut écrire ça plus simplement depuis le C++20, mais quand je vois String écrit avec une majuscule dans ton code, je crains que ton C++ ne soit pas vraiment du C++ moderne et ne supporte même pas le code que je propose.

  4. #4
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 176
    Points : 79
    Points
    79
    Par défaut
    Les 2 solutions de Foetus fonctionnent. Merci à tous pour votre aide.
    A bientôt. Cordialement

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

Discussions similaires

  1. saisie d'un caractère après une valeur dans inputbox
    Par CélineM dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/06/2007, 14h56
  2. Attente de saisie d'un caractère
    Par richard_sraing dans le forum C
    Réponses: 4
    Dernier message: 04/02/2007, 12h24
  3. empecher la saisie d'un caractère dans un édit
    Par Invité dans le forum Access
    Réponses: 7
    Dernier message: 17/01/2007, 15h35
  4. Programmer une boucle de saisie chaine de caractère.
    Par Spike Spiegel dans le forum C
    Réponses: 30
    Dernier message: 02/10/2005, 17h46
  5. Saisie de plusieurs caractère dans une liste déroulante
    Par Oluha dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/03/2005, 14h32

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