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

C++Builder Discussion :

Utilisation pavet numerique


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Points : 58
    Points
    58
    Par défaut Utilisation pavet numerique
    Bonjour,

    J'ai fait une calculatrice sur c++ builder 6 puis j'aimerais que l'utilisateur puisse aussi faire ses calculs avec le clavier.. Pour les chiffre de 0 à 9 sa fonctionne puisque c'est un TEdit mais pour les symboles d'opérations (+,-,*,/) je sais pas du tout comment faire.. Je sais qu'on peut faire avec un test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     if(KEY==??) { 
    mon code 
    }
    Comment puis-je trouver le numero de touche pour ses symboles ?

    Merci

  2. #2
    Membre habitué
    Inscrit en
    Mars 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 105
    Points : 133
    Points
    133
    Par défaut
    Bonjour,

    un extrait de l'aide (code des touches virtuelles) :
    VK_MULTIPLY Touche Multiplication (pavé numérique)
    VK_ADD Touche Plus (pavé numérique)
    VK_SEPARATOR Touche Séparateur (pavé numérique)
    VK_SUBTRACT Touche Moins (pavé numérique)

    VK_DECIMAL Touche décimale (pavé numérique)
    VK_DIVIDE Touche Division (pavé numérique)
    Nicolas

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Points : 58
    Points
    58
    Par défaut
    Merci... Maintenant j'ai une autre problème..

    Quand je vais dans mon TEdit et que je tappe avec le pavet "5*" je voudrais qu'il m'efface le caractère "*"..

    Voila mon code ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //---------------------------------------------------------------------------
    void __fastcall TfmMain::edAffichageKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
       if (Key == VK_MULTIPLY ) {
          operation = 3 ;
          val1 = edAffichage->Text.ToInt() ;
          edAffichage->Text = "" ;
       }
    }
    //---------------------------------------------------------------------------
    Il efface le chiffre "5" mais pas le "*"..

    Merci

  4. #4
    Membre habitué
    Inscrit en
    Mars 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 105
    Points : 133
    Points
    133
    Par défaut
    Bonjour,

    1. Je pense que tu aurais dû ouvrir une nouvelle discussion (principalement pour que le titre soit bien en rapport avec le contenu --> meilleure gestion de la base de données)

    2. Il est préférable de faire ton traitement sur le OnKeyUp plutot que sur le OnKeyDown car le Tedit n'est pas encore mis à jour sur le OnKeyDown. Ceci explique pourquoi le 5 est effacé mais pas le *.

    3. Pour supprimer seulement le dernier caractère du TEdit, on peut par exemple utiliser la méthode "Delete" de la classe AnsiString (sur edAffichage->Text)

    Voilà, j'espère que cela répond à la question...

    Nicolas

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Points : 58
    Points
    58
    Par défaut
    3. Pour supprimer seulement le dernier caractère du TEdit, on peut par exemple utiliser la méthode "Delete" de la classe AnsiString (sur edAffichage->Text)
    Comment je fais pour faire ca ?

    Merci

  6. #6
    Membre habitué
    Inscrit en
    Mars 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 105
    Points : 133
    Points
    133
    Par défaut
    1. Tu regardes dans l'aide
    Supprime un nombre donné de caractères de la chaîne.

    AnsiString& __fastcall Delete(int index, int count);

    Description

    Delete modifie l'AnsiString pour supprimer count caractères de la chaîne en commençant par le caractère situé à la position index, où l'indice du premier caractère est 1. Elle renvoie la chaîne résultante modifiée (*this).

    Si index est plus grand que la longueur de l'AnsiString ou inférieur à 1, aucun caractère n'est supprimé.

    Si count indique plus de caractères qu'il n'en reste en partant de l'indice, Delete supprime le reste de la chaîne. Si count est inférieur à 0, aucun caractère n'est supprimé.
    2. Tu essayes de l'utiliser (par exemple avec la méthode Length() de AnsiString).

    3. Si tu n'y arrives pas, poste ton code.

    Désolé de ne pas te fournir le code tout fait, mais on apprend toujours mieux en découvrant par soi même...

    Nicolas

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Points : 58
    Points
    58
    Par défaut
    Si j'ai bien compris, je dois, déclarer une variable AnsiString
    Mettre le texte du TEdit dans cet variable puis après avec le StrLength() supprimer un caractere.. Je vais essayer de me debrouiller seule.. Mais si j'arrive pas, je vous redis..

    Merci

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Points : 58
    Points
    58
    Par défaut
    J'ai essayer mais je ne sais pas du tout comment m'y prendre pour ce StrLen.. J'ai céer un TEdit pour qu'il me retourne la valeur de la chaine dans ce TEdit..
    Voilà mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //---------------------------------------------------------------------------
    void __fastcall TfmMain::edAffichageKeyUp(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
       if(Key == VK_MULTIPLY ) {
       Texte = edAffichage->Text ;
       Edit1->Text = StrLen(Texte) ;
       }
    }
    //---------------------------------------------------------------------------
    Pourrais-tu m'aider stp ?

    Merci

  9. #9
    Membre habitué
    Inscrit en
    Mars 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 105
    Points : 133
    Points
    133
    Par défaut
    1. Je n'ai pas parlé de StrLen , mais de la méthode Length() de AnsiString.

    2. Si j'ai bien compris, le but est de supprimer '*' du TEdit affichant "5*". Voici une piste :
    • effectivement on peut passer par un AnsiString intermédiaire : asTexte par exemple.
    • ensuite, comme indiqué précédemment, on peut utiliser Delete pour supprimer le dernier caractère de asTexte : asTexte.Delete (index, count)
      • avec index représentant l'indice du caractère à supprimer : c'est là qu'on peut utiliser Length() pour récupérer cet indice
      • et count le nombre de caractères à supprimer : donc 1
    • ensuite, il ne reste plus qu'à mettre à jour le TEdit : edAffichage->Text= asTexte
    Nicolas

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Points : 58
    Points
    58
    Par défaut
    Salut,

    Je sais pas utiliser Length()... J'ai créer une autre variable int pour y mettre le nombre de caracteres de ma chaine.. J'ai fais ca comme code..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Indice = Length(asTexte)  ;
    J'ai l'erreur suivante : Appel a une fonction non définie 'Length'.

    Merci

  11. #11
    Membre habitué
    Inscrit en
    Mars 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 105
    Points : 133
    Points
    133
    Par défaut
    Comme je l'ai dit auparavant, Length() est une méthode de la classe AnsiString. Son appel se fait donc ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    indice = asTexte.Length();
    Nicolas

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Points : 58
    Points
    58
    Par défaut
    Merci beaucoup.. J'ai réussi ..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       if(Key == VK_MULTIPLY ) {
       asTexte = edAffichage->Text ;
       Indice = asTexte.Length() ;
       asTexte.Delete(Indice,1) ;
       edAffichage->Text = asTexte ;
       operation = 3 ;
       val1 = edAffichage->Text.ToInt() ;
       edAffichage->Text = "" ;
    Merci

  13. #13
    Membre habitué
    Inscrit en
    Mars 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 105
    Points : 133
    Points
    133
    Par défaut
    Super. Et si on veut améliorer un peu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(Key == VK_MULTIPLY ) 
    {
       asTexte = edAffichage->Text ;
       asTexte.Delete(asTexte.Length(),1) ;
       operation = 3 ;
       val1 = asTexte.ToInt() ;
       edAffichage->Clear();
    }

    Maintenant, que tu as bien compris les possibilités de la classe AnsiString, je propose une autre méthode ne travaillant pas sur AnsiString. Au lieu de supprimer le * du "55*", il peut être plus rapide de faire en sorte que l'"*" ne soit pas prise en compte (dans l'affichage).
    L'idée est d'intercepter le caractère '*' et donc de faire le traitement, mais ensuite de ne pas le propager afin qu'il ne soit pas pris en compte par l'affichage. Pour cela, on travaille sur le OnKeyPress :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void __fastcall TForm1::edAffichageKeyPress(TObject *Sender, char &Key)
    {
        if (Key == '*')       // et non plus VK_MULTIPLY car OnKeyPress travaille sur les char
            {
            Key = 0;          // indique qu'on ne propage pas la touche pressée
            operation = 3 ;
            val1 = edAffichage.ToInt() ;
            edAffichage->Clear();       // vide le Tedit
            }
    }
    Si j'ai indiqué ce code, c'est que je pense qu'il simplifiera la suite de ton programme (notamment lorsque tu devra traiter toutes les opérations, la touche ENTREE...).

    Nicolas

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Points : 58
    Points
    58
    Par défaut
    Humm merci... Maintenant j'ai une question pour l'Enter.. On fait comment pour gerer la touche enter ?

    Merci

  15. #15
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Pour gérer la touche Entrer, il faut une fois de plus se tourner du coté des Touches Virtuelles ...

    Dans l'aide SDK de C++, fais une recherche sur : Virtual-Key Codes

    Pour l'info, on gère le Enter avec cette Valeur : VK_RETURN

    J'espère que ça t'aidera par la suite

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Points : 58
    Points
    58
    Par défaut
    Ca ne m'as pas aidé du tout

    J'ai vu qu'il y a un evenement dans TEdit qui s'appele OnEnter mais je n'ai rien réussit a faire avec aussi.

  17. #17
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    L'événementielle OnEnter concerne la prise de focus par l'objet et n'a pas de rapport avec les touches ENTER ou RETURN.

    A plus !

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Points : 58
    Points
    58
    Par défaut
    Oui, ok.

    Mais alors comment je fais pour la touche enter ?

  19. #19
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    A plus !

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Points : 58
    Points
    58
    Par défaut
    hum ok merci.
    J'ai réussit. Est-ce que je pourrais avoir le code de la touche Escape et de la touche effacer (au deçu de la touche enter).

    Merci

Discussions similaires

  1. Réponses: 40
    Dernier message: 04/11/2016, 17h28
  2. [XAML] RessourceDictionary utiliser une constante numerique
    Par igorzup dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 07/06/2012, 09h44
  3. Réponses: 3
    Dernier message: 29/05/2006, 17h04
  4. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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