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

API, COM et SDKs Delphi Discussion :

[D7] OnKeyPress et touche TAB


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de dleu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 169
    Par défaut [D7] OnKeyPress et touche TAB
    Bonjour,

    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
     
    procedure TFicheSign.edtNomPreKeyPress(Sender: TObject; var Key: Char);
    var
      SqlString : string;
    begin
      if (key=#9) then  //#9=char(VK_TAB)
      begin
        key:=#0;  //évite le bip lors de l'utilisation de return
        SqlString:='SELECT * FROM pat WHERE nomp LIKE '+quotedStr(edtNomPre.Text+'%');
        with DataModule1.AQPat do
        begin
          Close;
          Sql.Clear;
          Sql.Add(SqlString);
          open;
          if RecordCount =0 then nouveau:=true else nouveau:=false;
          if RecordCount =1 then afficher;
        end;
      end;
    end;
    Cette procédure ne fonctionne pas quand la touche TAB qui est pressée. Pourtant si je remplace #9 par #13 (et en tapant sur return donc) la procédure fonctionne.

    Pourquoi, dans le OnKeyPress le test de la touche RETURN fonctionne et pas le test de la touche TAB ? Etrange, non ?

    Y a-t-il une solution pour que le test avec la touche TAB fonctionne ?

    Merci de m'aider.

    Didier

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Par défaut
    effectivement, pour la touche TAB il me semble qu'il faut utiliser OnKeyDown() / OnKeyUp()

  3. #3
    Membre Expert
    Avatar de Merlin
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2002
    Messages
    524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 524
    Par défaut
    Keypressed retourne un char et n'est pas adapté par exemple aux touches de fonctions. C'est étonnant que le Tab ne soit pas pris en compte mais pour vérifier que ton problème ne vient pas d'ailleurs, essaye de prendre l'événement OnKeyUp ou OnKeyDown pour la détection.

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Le tab n'est pa reconnu lorsquu'il est utilisé dans un edit.

    (J'ai fait le test sur le onKeyUp, et le code touche n'est pas retourné par l'application)

    Dans delphi la touche TAB permet de passer d'une zone de saisie/composants clicables à un autre et je crois que les onKeyxxx ne l'intercepte pas pour cette raison
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre confirmé Avatar de dleu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 169
    Par défaut
    Merci pour vous réponses :

    Dans delphi la touche TAB permet de passer d'une zone de saisie/composants clicables à un autre et je crois que les onKeyxxx ne l'intercepte
    Malatar, tu as malheureusement raison : cela ne fonctionne ni dans OnKeyPress, ni dans OnKeyDown, ni dans OnKeyUp.

    Il faudra que je trouve autre chose.

    Merci à vous tous.

  6. #6
    Membre Expert
    Avatar de Merlin
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2002
    Messages
    524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 524
    Par défaut
    Il faut bien entendu mettre KeyPreview à true dans le TForm pour avoir accès à certaines touches.
    Et comme je le disais, Keypressed n'est pas suffisant pour bon nombre de touches (et les combinaisons avec alt, shift...). Il faut donc généralement préférer OnKeyUp/Down. KeyPressed doit resté limité au caractères imprimables.

  7. #7
    Membre éprouvé Avatar de Guile
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 130
    Par défaut
    En effet, avec keypreview à true, ce code marche très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if key = VK_TAB then showMessage('TAB pressed');
    end;

  8. #8
    Membre confirmé Avatar de dleu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 169
    Par défaut
    A Guile : Ton code marche en effet très bien. Mais dans mon cas, j'utilise l'évènement OnKeyPress d'un Edit. Et dans ce cas-là, ça ne fonctionne pas.

    A Merlin : Que je mette le KeyPress de la form à true ne change rien : ça ne fonctionne pas.
    De plus, ça ne fonctionne pas non plus dans le onKeyDown et cela ne fonctionne que pour le onKeyUp mais
    uniquement quand j'entre dans mon edit. Or c'est à la sortie de mon edit que je voudrais appliquer ma requête.

    Merci quand même pour ces précisions.

  9. #9
    Membre confirmé Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Par défaut
    Bsr,

    Pour une raison que j'ignore, les contrôles fenêtrés Windaube s'obstinent à ne pas transmettre les touches qu'ils gérents comme les flèches ou encore la touche TAB ...

    Il existe bien un moyen d'intercepter la touche TAB via le message WM_GETDLGCODE mais alors dans ce cas la touche TAB ne fait strictement plus rien et tu ne peux plus passé d'un composant à l'autre.

    Le plus "simple" est donc d'intercepter la touche avant que le contrôle ne la recoive donc au niveau application:

    ex :

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        Procedure ApplicationMessage(Var msg : TMsg; Var Handled: boolean);
        procedure KeyTab(Control : TControl);
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnMessage := ApplicationMessage;
    end;
     
    procedure TForm1.KeyTab(Control : TControl);
    begin
      if Control = Edit1 then
      begin
        ShowMessage('Touche TAB pressée pour Edit1 ...');
      end;
    end;
     
    Procedure Tform1.ApplicationMessage(Var msg : TMsg; Var Handled: boolean);
    begin
      if Msg.message = WM_KEYDOWN then
      begin
        if Msg.wParam = VK_TAB then
        begin
          if Msg.hwnd = Edit1.Handle then KeyTab(Edit1);
        end;
      end;
    end;
     
    end.

    Voilà

    Cependant un OnExit ne suffirait-il pas dans ton cas ?

    @+
    Php

  10. #10
    Membre expérimenté

    Profil pro
    Personnel
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Personnel

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Par défaut
    Or c'est à la sortie de mon edit que je voudrais appliquer ma requête.
    Si c'est à la sortie de ton Edit, alors pourquoi pas:
    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
    procedure TFicheSign.edtNomExit(Sender: TObject);
    var
      SqlString : string;
    begin
        SqlString:='SELECT * FROM pat WHERE nomp LIKE '+quotedStr(edtNomPre.Text+'%');
        with DataModule1.AQPat do
        begin
          Close;
          Sql.Clear;
          Sql.Add(SqlString);
          open;
          if RecordCount =0 then nouveau:=true else nouveau:=false;
          if RecordCount =1 then afficher;
        end;
    end;
    Et du coup, on se moque pas mal de Tab...
    Fabrice

  11. #11
    Membre confirmé Avatar de dleu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 169
    Par défaut
    A phpLive et à MFDev :
    Cependant un OnExit ne suffirait-il pas dans ton cas ?
    Bien vu, mais dans ce cas, si mon edit a le focus et que l'utilisateur clique ailleurs dans la fiche, il sort de l'édit et lance la requête. Je ne veux pas de ça évidemment.

    J'ai trouvé une solution plus simple : puisque la touche TAB n'est prise en compte que lorsque on entre dans un edit via l'évènement OnKeyUp, je teste l'appui sur la touche entrée dans mon edit1 et je teste par onKeyUp l'appui sur la touche TAB à l'entrée de l'édit suivant dans l'ordre de tabulation. Et voilà : mon problème est résolu.

    Merci pour votre aide à tous.

    A+

    Didier

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

Discussions similaires

  1. [autotab] forcer la touche TAB
    Par pmartin8 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 07/12/2005, 16h36
  2. Comment se déplacer avec la touche tab dans un dbGrid ?
    Par bertrand_declerck dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/09/2005, 15h36
  3. [débutant] Ordre des champs de saisie par la touche tab
    Par almisuifre dans le forum C++Builder
    Réponses: 10
    Dernier message: 03/03/2005, 19h45
  4. Navigation avec la touche TAB
    Par wishnight dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 27/10/2004, 10h02
  5. Edit comment autorisé la touche TAB ?
    Par laurent_h dans le forum Windows
    Réponses: 2
    Dernier message: 11/04/2004, 14h11

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