1. #1
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2010
    Messages : 48
    Points : 40
    Points
    40

    Par défaut Détecter l'appui sur la touche Tabulation

    Bonjour,

    Je cherche à créer une petite fonction de saisie intuitive de mots dans une phrase.
    J'ai pu constater dans plusieurs applications que lorsque le mot qui s'affiche correspond à celui qu'on désire, on tape sur la touche (flèche horizontale vers la gauche et une autre en-dessous vers la droite).
    Eh bien impossible de trouver le code ASCII de cette touche, donc celle située à gauche du clavier au-dessus du cadenas.
    Lorsque je demande en message la valeur de cette touche je ne reçois rien.
    Lorsque je tape sur cette touche je passe à un Edit différent.

    Si quelqu'un pouvait m'éclairer je lui serais bien reconnaissant.

    Merci.

    BB

  2. #2
    Membre averti Avatar de Cirec
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2010
    Messages : 153
    Points : 325
    Points
    325

    Par défaut

    Bonjour,

    c'est la touche Tab (Tabulation) code ASCII = #9

    Cordialement,
    @+

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2010
    Messages : 48
    Points : 40
    Points
    40

    Par défaut

    Merci Cirec,

    En effet c'est la touche Tab mais sauf erreur elle n'est reconnue que lors de l'évènement Keydown; je ne me trompe pas ou est-ce normal?

    BB

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    octobre 2005
    Messages
    2 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : octobre 2005
    Messages : 2 381
    Points : 3 220
    Points
    3 220

    Par défaut

    Bonjour,

    Sinon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function  ToucheCla(t : integer) : boolean; // Appui Touche Clavier ou Souris
    //        utilisations : if ToucheCla(VK_CONTROL) then
    //                         if ToucheCla(VK_RETURN) then 
    //                       if ToucheCla(Ord('R')) then
    begin     Result:= ((GetAsyncKeyState(t) and 32768)<> 0)
    end;
    avec touche Tab = VK_TAB

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Membre averti Avatar de Cirec
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2010
    Messages : 153
    Points : 325
    Points
    325

    Par défaut

    oui,
    la touche est interceptée et n'est pas retransmise aux descendants mais on peut quand même récupérer le message ou l'info, soit comme
    le propose Gilbert (mais il me semble que la touche doit être pressée lors de l'appel à "ToucheCla" pour que ce soit efficace) soit comme ceci
    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
      TForm3 = class(TForm)
        ...
        procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    implementation
     
    procedure TForm3.CMDialogKey(var Message: TCMDialogKey);
    begin
      with Message do
        if CharCode = VK_TAB then
        begin
          Caption := 'Touche Tab Pressée';
          Result := 1; // 0 = Message Traité  1 = Message non Traité
        end;
      inherited;  // propage le message aux autres composants
      // on peut décider de ne pas le propager dans certain cas ;)
    end;
    end.
    pour voir un comportement différent tu ajoute un TMemo avec le Focus et tu modifie comme ceci:
    le message est intercepté et marqué comme traité mais non propagé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm3.CMDialogKey(var Message: TCMDialogKey);
    begin
      with Message do
        if CharCode = VK_TAB then
        begin
          Caption := 'Touche Tab Pressée';
          Result := 1; // 0 = Message Traité  1 = Message non Traité
        end;
      //inherited;  // propage le message aux autres composants
      // on peut décider de ne pas le propager dans certain cas ;)
    end;
    puis:
    le message est intercepté et marqué comme non traité et non propagé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm3.CMDialogKey(var Message: TCMDialogKey);
    begin
      with Message do
        if CharCode = VK_TAB then
        begin
          Caption := 'Touche Tab Pressée';
          Result := 0; // 0 = Message Traité  1 = Message non Traité
        end;
      //inherited;  // propage le message aux autres composants
      // on peut décider de ne pas le propager dans certain cas ;)
    end;
    tu verras de suite la différence de comportement
    Cordialement,
    @+

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2010
    Messages : 48
    Points : 40
    Points
    40

    Par défaut

    Merci à vous mais je coince déjà à la première ligne, c'est-à-dire que je reçois le message suivant : " [Erreur] Unit1.pas(20): Déclaration forward ou external non satisfaite : 'TForm1.CMDialogKey'"
    Je ne pige pas pourquoi il ne faut quand même pas faire appel à une DLL particulière.
    Mais sinon vos explications sont claires.

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    octobre 2005
    Messages
    2 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : octobre 2005
    Messages : 2 381
    Points : 3 220
    Points
    3 220

    Par défaut

    Bonjour,

    Cirec : mais il me semble que la touche doit être pressée lors de l'appel à "ToucheCla" pour que ce soit efficace.
    Effectivement car si j'appelle if ToucheCla(VK_ESCAPE) dans une boucle de calculs logée dans une routine située n'importe où, pour interrompre un calcul avec VK_ESCAPE,
    je suis obligé d'appuyer sur la touche Echap pendant une durée au plus égale au temps de calcul d'une boucle complète.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  8. #8
    Membre averti Avatar de Cirec
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2010
    Messages : 153
    Points : 325
    Points
    325

    Par défaut

    re,

    le message d'erreur que tu signales nous dit que le corps de la procedure TForm1.CMKeyDialog n'a pas été trouvé !!!

    pour corriger ça c'est très simple dans la partie "implementation" de ton Unit1 du doit y placer la procedure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm3.CMDialogKey(var Message: TCMDialogKey);
    begin
      with Message do
        if CharCode = VK_TAB then
        begin
          Caption := 'Touche Tab Pressée';
          Result := 1; // 0 = Message Traité  1 = Message non Traité
        end;
      inherited;  // propage le message aux autres composants
      // on peut décider de ne pas le propager dans certain cas ;)
    end;
    si vraiment ça te pose un problème je te donnerai un Zip avec le code exemple

    Cordialement,
    @+

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2010
    Messages : 48
    Points : 40
    Points
    40

    Par défaut

    Merci Cirec,

    Je suis nul mais j'avais quand même copié ta procédure .
    Je suis gêné, j'avais laissé traîner un end. entre mes procédures en faisant les copier-coller .
    Sinon j'ai compris et ça marche merci beaucoup à vous.
    Je passe le post en résolu alors.

    BB

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

Discussions similaires

  1. Code ASCII du symbole Euro
    Par FW-S dans le forum Delphi
    Réponses: 9
    Dernier message: 03/04/2007, 01h27
  2. [web] Barre de Progression ASCII
    Par Red Bull dans le forum Web
    Réponses: 13
    Dernier message: 05/06/2003, 12h56
  3. Ascii DOs -> Ascii Windows
    Par remixtech dans le forum Langage
    Réponses: 3
    Dernier message: 22/03/2003, 07h14
  4. Conversion binaire -> ASCII
    Par will13013 dans le forum C
    Réponses: 8
    Dernier message: 08/01/2003, 04h12
  5. exporter la structure d'une base Sybase en ascii
    Par Jean-Cyp dans le forum Sybase
    Réponses: 5
    Dernier message: 05/11/2002, 16h15

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