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 :

[BDB]Annuler appui sur touche [IDE]


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif Avatar de Jerome S
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2011
    Messages : 62
    Par défaut [BDB]Annuler appui sur touche
    Bonjour,
    Je suis en cours d'apprentissage du C++. Je dois travailler sur Borland Builder C++
    Aujourd'hui, je dois contrôler la saisie au niveau d'un TEdit. Si l'utilisateur presse certaines touches, rien ne doit se passer.
    Actuellement, j'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void __fastcall TCondition::BarreConditionKeyDown(TOject *, WORD &Key, TShiftState)
     
    if(Key!=107 && Key!=110)
    {
        Key=0;
    }
    Mais ca ne fonctionne pas. Quand j'affiche le code de la touche pressé dans un TLablel, il m'affiche bien le code 0 mais le caractère s'affiche quand même.
    Quelqu'un a une idée s'il vous plait ?
    Merci d'avance

  2. #2
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Utilise l’événement OnKeyPress plutot que OnKeyDown pour empêcher/autoriser uniquement certains caractères:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
    {
    // autoriser uniquement les chiffres
      switch ( Key )
      {
        case '0' : break;
        case '1' : break;
        case '2' : break;
        case '3' : break;
        case '4' : break;
        case '5' : break;
        case '6' : break;
        case '7' : break;
        case '8' : break;
        case '9' : break;
        case '\b' : break;
        default: Key = 0 ; break ;
      }
    }
    ou dans ton exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void __fastcall TForm1::Edit2KeyPress(TObject *Sender, char &Key)
    {
    // autoriser uniquement les lettre 'k' et 'n'
      switch ( Key )
      {
        case 'k' : break;
        case 'n' : break;
        case '\b' : break;
        default: Key = 0 ; break ;
      }
    }

  3. #3
    Membre actif Avatar de Jerome S
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2011
    Messages : 62
    Par défaut
    Ca fonctionne ! Merci à toi !
    Comment se fait-il que dans l'évenement KeyPress ca fonctionne alors que KeyDown ne fonctionne pas ?

    Merci encore

  4. #4
    Membre confirmé Avatar de bfespi69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2008
    Messages : 79
    Par défaut
    Tu pouvais faire ça aussi dans le onkeydown, ça marche :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void __fastcall TCondition::BarreConditionKeyDown(TOject *, WORD &Key, TShiftState)
     
    if(Key!=107 && Key!=110)
    {
        Key=NULL;
    }

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 057
    Par défaut
    @bfespi69, tu es sûr que cela fonctionne ?
    Sur mon C++Builder 2007, l'affectation à Zéro ou à NULL n'a aucun effet et génère le même code Assembleur !
    Tu ne confonds pas OnKeyDown et OnKeyPress ?

    En plus, il faut faire attention OnKeyDown fourni des Codes Virtuels, ces codes sont différents d'un caractère

    écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(Key!=107 && Key!=110)
    c'est comme écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(Key!=VK_ADD && Key!=VK_DECIMAL)
    Donc n'autoriser que '+' et '.' et non que 'k' et 'n'


    Extrait de l'aide Controls.TWinControl.OnKeyDown
    Mais pour les touches qui génèrent des caractères, Windows produit également le message WM_CHAR. Au moment du déclenchement de votre événement OnKeyDown, le message WM_CHAR de la touche sera déjà dans la file d'attente des messages. Comme la définition de Key sur #0 n'arrête pas sa livraison, l'événement OnKeyPress est déclenché. En définissant Key sur #0, OnKeyPress n'a pas le droit d'être déclenché pour les touches n'ayant pas de caractères. Pour les touches représentant des caractères, OnKeyPress continuera à être déclenché.
    Perso, je trouve cela assez flou, les touches sans caractères sont rares comme ALT, CTRL, MAJ, même mais ces touches, cela ne les élimines pas !
    Pour la saisie OnKeyPress est nettement plus pratique car c'est bien un Char le paramètre !
    Pensez que Char pourra être Ansi ou Unicode selon la version de C++Builder
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre confirmé Avatar de bfespi69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2008
    Messages : 79
    Par défaut
    Sur Borland C++ Builder 5 , cela fonctionne de mettre NULL pour exclure certaines touches.

    Cependant je ne possède que cette version alors je ne sais pas pour les plus récentes.

    Voici mon code sur OnKeyPress :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    void __fastcall TfrmEtapeCNDef::TransformKey(TObject *Sender, char &Key)
    {
        if ( Key == '.' ) Key = DecimalSeparator;
     
        if ( ! (    Key == DecimalSeparator
                 || ( Key >= '0' && Key <= '9' )
                 || Key == '\b'
                 || Key == '+'
                 || Key == '-'
               )
           )
        {
            Key = NULL;
        }
    }

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

Discussions similaires

  1. Detection d'appuis sur touche CTRL + autre touche
    Par rolls dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 11/11/2008, 14h23
  2. Réponses: 2
    Dernier message: 05/05/2008, 13h16
  3. appui sur touche
    Par Ludo_360 dans le forum Delphi
    Réponses: 6
    Dernier message: 14/05/2007, 09h13

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