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 :

Surcharge de la méthode KeyDown


Sujet :

C++Builder

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Par défaut Surcharge de la méthode KeyDown
    Salut,

    J'ai un soucis avec la surcharge de la méthode KeyDown dans un composant de ma création.
    Un appui sur n'importe quelle touche standard du clavier provoque bien le passage par ma fonction surchargée.
    En revanche, toutes les touches spéciales (telles que les flèches de direction) ne passent pas par ma fonction.
    Aurais-je loupé quelque chose ?

  2. #2
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Tu peux nous mettre le code de ta fonction pour qu'on voit

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Par défaut
    dans le .h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DYNAMIC void __fastcall KeyDown(Word &Key, Classes::TShiftState Shift);
    dans le .cpp :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    
    void __fastcall TMyGrid::KeyDown(Word &Key, Classes::TShiftState Shift)
    {
       int tch;
       bool autoriser_touche = false;
    
       tch = (int)Key;
    
       if (tch == VK_SPACE) //touche ESPACE -> caractère suivant dans le cycle (simulation double-clic)
       {
          DblClick();
          return;
       }
       else if (tch == VK_LEFT) //touche FLECHE GAUCHE -> se déplacer sur la cellule à gauche de celle en cours
       {
          Selected = Selected - 1;
          return;
       }
       else if (tch == VK_RIGHT) //touche FLECHE DROITE -> se déplacer sur la cellule à droite de celle en cours
       {
          Selected = Selected + 1;
          return;
       }
    
       //refuser la touche en fonction du cycle en cours
       switch (CycleType)
       {
          case ccWiegand:
             autoriser_touche = (tch == 46) || (tch == 48) || (tch == 49) || (tch == 68) || (tch == 100) || (tch == 80) || (tch == 112) || (tch == 73) || 					(tch == 105) || (tch == 88) || (tch == 120);
          break;
    
          case ccClockData:
          case ccDallas:
             autoriser_touche = (tch == 46) || ((tch >= 48) && (tch <= 57)) || ((tch >= 65) && (tch <= 70)) || ((tch >= 97) && (tch <= 102)) || (tch == 88) || (tch == 120);
          break;
       }
    
       if (!autoriser_touche)
       {
          Beep();
          return;
       }
       else
       {
          //mise en majuscule
          AnsiString Portion = AnsiString(Key).UpperCase();
          //mettre à jour la cellule courante et la règle
          FCelluleValue[Selected] = Cycle.Pos(Portion);
          FRegle[Selected+1] = Portion[1];
          Invalidate();
       }
    }
    
    Information supplémentaire : mon composant est dérivé d'un TCustomControl.

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Par défaut
    Je continue mes tests et ça ne fonctionne toujours pas.
    Par contre, j'ai une certitude : le problème n'est pas lié au code contenu dans la fonction.
    J'ai remplacé tout le code par un simple Beep.
    Quand j'appuie sur les touches standard ou même la barre d'espace, le son est bien joué.
    Par contre, quand j'appuie sur une flèche ou sur tabulation, aucun son et le focus est déplacé au contrôle suivant sur la fiche.

    Ma question : comment intercepter un appui sur les flèches ou sur la touche tabulation ?

  5. #5
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Je ne sais pas que cela peut venir de ca mais ta ligne

    est inutile

    tu peux directement tester avec la valeur de Key

    As-tu mis un message au début de ta fonction avant de tester les touches juste pour voir si la fonction est déclanché pour toutes les touches ?

  6. #6
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut engi
    Deja je te conseillerais de lire ce Tuto
    Un bout de code simplifie sur la fleche haute et basse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
    if(Key == VK_DOWN)
    {
    ShowMessage("Fleche en BAS");
    }
    if(Key == VK_UP)
    {
    ShowMessage("Fleche en HAUT");
    }
    }

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Par défaut
    Salut blondelle,
    merci pour ton lien. je ne savais pas bien ce qu'est un hook et j'en ai donc profité pour m'instruire.
    par contre, pour le reste, le probleme n'est pas tellement de tester la valeur de key (avec VK_DOWN ou VK_UP) mais le fait qu'un appui sur les flèches ne provoquent pas le passage par mon événement keydown alors que c'est le cas de presque toutes les autres touches.

  8. #8
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Par défaut
    Je m'obstine pour essayer de comprendre.
    J'ai surchargé la méthode WndProc de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void __fastcall TMyGrid::WndProc(Messages::TMessage &Message)
    {
       if (Message.Msg == WM_KEYDOWN)
          Beep();
       TCustomControl::WndProc(Message);
    }
    Même constat : si j'appuie sur une touche standard, j'entends bien le bip.
    Par contre, si j'utilise la tabulation ou les flèches, pas de bip !

  9. #9
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    TMyGrid dérive de quelle classe ?

    A plus !

  10. #10
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Par défaut
    Dérivé d'un TCustomControl

  11. #11
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Par défaut
    enfin, j'ai trouvé

    voilà mon code :

    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 TMyGrid::WndProc(Messages::TMessage &Message)
    {
    	if (Message.Msg == WM_GETDLGCODE)
    	{
    		WMGetDlgCode(Message);
    		return;
    	}
     
    	TCustomControl::WndProc(Message);
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TMyGrid::WMGetDlgCode(TMessage& Message)
    {
    	Message.Result = DLGC_WANTARROWS;
    }
    Avec ça, ma fonction KeyDown reçoit bien les touches virtuelles correspondant aux flèches.

    Merci de l'intérêt que vous avez porté à ce post.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/05/2007, 17h29
  2. SVG dans une surcharge de la méthode paint
    Par mistermick dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 15/02/2007, 17h11
  3. surcharge de la méthode Add d'une List
    Par Anto03 dans le forum C#
    Réponses: 4
    Dernier message: 19/01/2007, 14h12
  4. [Débutant] Surcharge d'une méthode
    Par HaTnuX dans le forum Langage
    Réponses: 2
    Dernier message: 18/01/2007, 19h27
  5. [MFC] Surcharge d'une méthode CListCtrl
    Par semenzato dans le forum MFC
    Réponses: 8
    Dernier message: 22/12/2005, 22h05

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