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

Composants VCL Delphi Discussion :

Intercepter toutes les touches appuyées au clavier sur un TWinControl


Sujet :

Composants VCL Delphi

  1. #1
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 681
    Points
    681
    Par défaut Intercepter toutes les touches appuyées au clavier sur un TWinControl
    Bonjour,

    je souhaite intercepter toutes les touches claviers qui sont appuyées lorsque le Control a le focus.
    Le problème c'est que le touche de direction font passer à l'autre control.

    Voilà ce que j'ai essayé :
    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
     
          procedure WMChar(var Msg: TWMChar); message WM_CHAR;
          procedure WMKeyDown(var Msg: TWMKeyDown); message WM_KEYDOWN;
          procedure SubClassWndProc(var Message: TMessage);
     
    procedure TIE7Edit.SubClassWndProc(var Message: TMessage);
    begin
        if Message.Msg = WM_KEYDOWN
        then
            WMKeyDown(TWMKeyDown(Message))
        else
            WndProc(Message);
     
        Self.
    end;
     
    procedure TIE7Edit.WMKeyDown(var Msg: TWMKeyDown);
    var Shift : Boolean ;
    begin
        Shift := getkeyState(VK_SHIFT) <> 0 ;
     
        if Msg.CharCode = VK_LEFT
        then begin
            if not Shift
            then begin
                CursorPos := CursorPos - 1 ;
            end
            else begin
            end ;
        end ;
       // VK_RIGHT
    end ;
     
    procedure TIE7Edit.WMChar(var Msg: TWMChar);
    begin
        {
        Msg: Cardinal;
        CharCode: Word;
        Unused: Word;
        KeyData: Longint;
        Result: Longint;
        }
        FText := Char(Msg.CharCode) ;
    //    Msg.KeyData
    end ;
    Sans succes.

    Il me reste comme solution d'utiliser le gestionnaire OnKeyDown mais pour les flèche droite/gauche ça passe au control suivant.

  2. #2
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 131
    Points : 106
    Points
    106
    Par défaut
    pour ne pas que ta touche soit pise en compte, tu fait
    lorsque ta touche est pressée

    is your friend !! passer 20minutes a chercher permet parfois d'eviter de s'enerver en attendant une reponse pendant une heure... si, si je vous jure
    La bidouille s'avère souvent assez efficace : pensez-y en plus vous serez fiers de vous
    pensez à

  3. #3
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 681
    Points
    681
    Par défaut
    Le problème c'est que les fonctions ne sont même pas appelée dans le cas des touches de direction.
    Peut-être faut-il surcharger WndProc (si elle existe)

  4. #4
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Déjà, sache que pour pouvoir détecter des combinaisons de touche, il faut enregistrer l'état de chaque touche dans un boolean :
    http://www.developpez.net/forums/sho...315#post719315

    La méthode de capture des actions du clavier ultime est l'utilisation d'un hook, j'ai d'ailleurs fait une démo...

    Il ya aussi ce sujet : http://www.developpez.net/forums/sho....php?t=15863#4
    De retour parmis vous après 10 ans!!

  5. #5
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 681
    Points
    681
    Par défaut
    Un hook clavier me parait excessif, je veux juste intercepter les touches claviers de mon composant pas de windows.

    Peut-être qu'il faut que je dérive d'un TControl et pas d'un TWinControl mais ça va m'obliger à ré-écrire une bonne partie du code.

    Je pensais qu'en interceptant WM_KEYDOWN on inteceptait avant le composant.

    TTreeView dérive d'un TWinControl et intercepte les flèches de direction donc ça doit être possible plus simplement.

    EDIT : J'ai peut-être trouvé un élément de réponse. Utiliser TCustomEdit comme classe de base. Mais, la question reste posée.

  6. #6
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 131
    Points : 106
    Points
    106
    Par défaut
    il faut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if key=VK_LEFT
         then key:=#0;
    dans le onKeyDown

    is your friend !! passer 20minutes a chercher permet parfois d'eviter de s'enerver en attendant une reponse pendant une heure... si, si je vous jure
    La bidouille s'avère souvent assez efficace : pensez-y en plus vous serez fiers de vous
    pensez à

  7. #7
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 681
    Points
    681
    Par défaut
    Citation Envoyé par kevinou55 Voir le message
    il faut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if key=VK_LEFT
         then key:=#0;
    dans le onKeyDown
    Non, désolé, onKeyDown n'est pas appelé dans le cas des touches de direction.

  8. #8
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 131
    Points : 106
    Points
    106
    Par défaut
    as-tu mis la propriété keyPreview de ta Form à True ???

    is your friend !! passer 20minutes a chercher permet parfois d'eviter de s'enerver en attendant une reponse pendant une heure... si, si je vous jure
    La bidouille s'avère souvent assez efficace : pensez-y en plus vous serez fiers de vous
    pensez à

  9. #9
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 681
    Points
    681
    Par défaut
    Ah bah non, c'est une bonne idée ça. Mais alors comment font les TEdit pour recevoir avant la form ?

  10. #10
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 131
    Points : 106
    Points
    106
    Par défaut
    alors la il ne faut peut-etre pas trop m'en demander
    mais je pense que comme tu va gérer le onkeyDown d'un composant, c'est lui qui va gérer la pression des touches en premier... à vérifier

    cela fonctionne au moins maintenant ???

    is your friend !! passer 20minutes a chercher permet parfois d'eviter de s'enerver en attendant une reponse pendant une heure... si, si je vous jure
    La bidouille s'avère souvent assez efficace : pensez-y en plus vous serez fiers de vous
    pensez à

  11. #11
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 681
    Points
    681
    Par défaut
    Et si je dérive d'un TCustomControl, le problème ne serait-il pas résolu ?

    Quelle est la différence entre TWinControl et TCustomControl ?

  12. #12
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Pas beaucoup de différences à priori puisque TCustomControl hérite de TWinControl. La seule chose que fournit TCustomControl c'est le canvas ainsi que la méthode Paint pour tout les composants visuels. C'est pourquoi il est conseillé de partir de cette classe pour tout nouveau contrôle fenêtré.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  13. #13
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 681
    Points
    681
    Par défaut
    Effectivement, ça fait pareil.

    si je prend le code source d'EasyListview (un ListView ammélioré et partant de rien)
    ???????
    |
    TCommonCanvasControl
    |
    TCustomEasyListview
    |
    TEasyListview

    SynEdit lui dérive d'un TCustomControl.

    EDIT : J'ai trouvé !!!!
    procedure KeyUp(var Key: Word; Shift: TShiftState); override;
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
    procedure KeyPress(var Key: Char); override;

    il faut surcharger

    EDIT2 : Je me suite embalé, ça ne fonctionne pas !

  14. #14
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 681
    Points
    681
    Par défaut
    J'ai trouvé !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure WMGetDlgCode(var Msg: TWMGetDlgCode); message WM_GETDLGCODE;
     
    procedure TEssai.WMGetDlgCode(var Msg: TWMGetDlgCode);
    begin
      inherited;
     
      Msg.Result := Msg.Result or DLGC_WANTARROWS or DLGC_WANTCHARS;
     
      //if fWantTabs then
        Msg.Result := Msg.Result or DLGC_WANTTAB;
      //if fWantReturns then
        Msg.Result := Msg.Result or DLGC_WANTALLKEYS;
    end;
    je vais faire un petit tutoriel et je poste ça dans la FAQ

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

Discussions similaires

  1. intercepter toutes les exceptions Oracle ?
    Par mstic dans le forum Accès aux données
    Réponses: 3
    Dernier message: 19/04/2007, 10h52
  2. Réponses: 1
    Dernier message: 23/08/2006, 11h38
  3. les touches de mon clavier sont complètement mélangées
    Par StyleXP dans le forum Windows XP
    Réponses: 4
    Dernier message: 27/06/2006, 15h33
  4. Backup de toutes les bases de donnees active sur un server
    Par Nadaa dans le forum Administration
    Réponses: 2
    Dernier message: 22/06/2006, 08h58
  5. Réponses: 7
    Dernier message: 30/05/2006, 11h00

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