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

Langage Delphi Discussion :

Problème de touche clavier


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2009
    Messages : 41
    Points : 31
    Points
    31
    Par défaut Problème de touche clavier
    Bonjour,

    Mon problème est le suivant, je n'arrive pas tout le temps à attrapper l'évènement l'utilisateur a appuyé sur une touche.
    J'ai une TForm FParent qui contient une TForm TFEcranPrincipal qui contient une autre TForm TFSaisie. Chacune de ses TForm contient un ou plusieurs panels (voir la pièce jointe).

    J'ai réglé la propriété KeyPreview à true pour chacune de ses TForm. Ce que je ne comprends pas, parfois j'arrive à attraper l'évènement l'utilisateur à appuyer sur une touche, parfois non. J'ai remarqué que si le focus était sur panel 1 ou 3, j'arrivais systématiquement à détecté si l'utilisateur avait appuyé sur la touche. Si le focus est sur le panel 2 ou 4, il ne se passe rien. J'ai comparé les panels entre eux, je n'ai pas vu de différences majeures.

    Est-ce que quelqu'un a une idée ou mieux une solution?
    Images attachées Images attachées  

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Ce sont des Form ancrés par la propriété Parent ?
    il y a une autre technique avec Dock mais je ne l'a connais pas !

    Le Focus sur un Panel c'est plutôt difficile normalement, c'est que tu le forces avec un SetFocus, tu as des Edit, des Grilles ou des Boutons avec des raccourcis & !
    Pourquoi tu captures le clavier ? si c'est juste pour des raccourcis, utilisent plutôt les Actions, les HotKeys et autres techniques conçus pour cela !

    Qui ne capture pas ?
    TFMain ne pourra pas recevoir les évènements capturés pas TF_EcranPrincipal (Panel 4) ou TF_Saisies, la propriété Parent imbrique visuellement mais les TForm reste tout de même isolé !

    Le KeyPreview est géré par le TWinControl, lorsqu'un TEdit recoit un message clavier, il va chercher son Parent de type TForm (il s'arrête au premier trouvé dans la hiérarchie en partant de lui et en remontant)
    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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2009
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Mes Forms sont effectivement imbriquées entre elles à l'aide de la propriété Parent. Pour chacune de ces Forms, j'ai mis en place un code pour récupérer l'action l'utilisateur a appuyé sur la touche. Quand cela fonctionné, c'est le "premier" parent Form du panel qui détecte qu'une touche a bien été enfoncée.

    A l'intérieur d'une même Form, selon que tel ou tel panel possède le Focus, le KeyPress fonctionnait ou ne fonctionnait pas.

    C'est effectivement dans l'optique de créer des raccourcis.

    Je vais creuser cette histoire de HotKey.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2009
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Petite rectification, c'est la Form "Parent", c'est-à-dire la mère de toutes mes Forms, qui détecte que l'utilisateur a appuyé sur une touche

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    J'étais un peu parti sur le fait que cela soit TFMain qui gérait les raccourcis,

    Le TWinControl va chercher son PREMIER Parent de type TForm
    Si celui-ci est à KeyPreview à true, il provoque le OnKeyDown \ OnKeyUp de la TForm

    Puis il devrait propager au Parent TForm et cela récursivement sauf si Key a été mis à Zéro pour inhiber le caractère !

    Si tu as une version pro, n'hésite pas à regarde TWinControl.DoKeyDown \ TWinControl.DoKeyUp dans Controls.pas


    Pour le OnKeyPress, pas de bol, lui est géré différemment !
    Cela commence pareil
    Le TWinControl va chercher son PREMIER Parent de type TForm
    Si celui-ci est à KeyPreview à true, il provoque le OnKeyPress de la TForm
    Mais il ne propage pas à un éventuel parent TForm, du coup, tu ne reçois pas la notification !

    Deux solutions
    KeyPress mais chaque TForm gère ses raccourcis
    KeyDown pour centraliser les raccourcis dans TFMain

    Mais il y a d'autres façons de procéder !
    Une TActionList, le Bouton utilise la TAction qui a le ShortCut
    Un TApplicationEvents.OnShortCut
    Un RegisterHotKey + WMHotKey qui lui fonctionne même lorsque ton application n'est pas active (remercions AndNotOr)
    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
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2009
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Merci pour ta réponse.

    J'ai fait quelques essais avec KeyDown et KeyPress, dés que j'appuie sur une touche clavier, c'est respectivement le KeyDown et le KeyPress de F_Main qui détecte qu'une touche a été enfoncée. Là où ça devient curieux, c'est que cela continue de fonctionner même en ayant mis les KeyPreview à False pour mes 3 forms.

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    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 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Autre possibilité pour détecter l'appui sur une touche donnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function  ToucheCla(t : integer) : boolean; // Détection Appui Touche-clavier ou Touche-Souris
    begin     If  ((GetAsyncKeyState(t) and 32768)<> 0)
              then Result:=true else Result:=false;
    end;
    Pour l'utilisation :
    - Exemple 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin     Timer1.interval:=50; // <- à déclarer dans l'Inspecteur d''objets
              if ToucheCla(VK_CONTROL) then showMessage('A enfoncé la touche Ctrl');
              if ToucheCla(Ord('R')) then showMessage('A enfoncé la touche R ou r');
    end;
    - Exemple 2 pour interrompre une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure Quelconque;
    var i: integer;
    begin
      ...
      for i := 1 to maxInt do begin
        ...
        if ToucheCla(VK_ESCAPE) then Break;
        ...
      end;
    end;
    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    @Gilbert Geyer, lol, c'était la technique dégeux que j'avais proposé dans [XE2] Raccourci windows intercepté par mon appli juste au dessus du RegisterHotKey + WMHotKey de AndNotOr
    Comme quoi, les techniques à la mano conserve un succès fou par rapport au technique intégrée et normalisée

    Sinon, ToucheCla peut s'écrire tout simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function  ToucheCla(t : integer) : boolean; // Détection Appui Touche-clavier ou Touche-Souris
    begin     
      Result := (GetAsyncKeyState(t) and $8000) <> 0;
    end;
    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

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2009
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Salut Gilbert,

    J'ai essayé ta solution, elle fonctionne et je te remercie de t'être penché sur mon problème. Toutefois, je vais pour le moment garder la solution avec la détection qu'une touche a été appuyée grâce au FormKeyDown de fenêtre mère, même si cette solution ne me satisfait pas totalement.

  10. #10
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    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 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    ShaiLeTroll : Comme quoi, les techniques à la mano conserve un succès fou par rapport au technique intégrée et normalisée
    ... j'ai un faible pour les solutions basiques.

    Sinon, ToucheCla peut s'écrire tout simplement
    ... ok, vu, autant pour moi ... et on gagne une ligne de code.

    patoche.05 : ... Toutefois, je vais pour le moment garder la solution ...
    ... bin c'est normal : on propose et tu disposes.

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

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

Discussions similaires

  1. Problème TwebBrowser : touches claviers
    Par Invité(e) dans le forum Composants VCL
    Réponses: 7
    Dernier message: 03/07/2011, 07h47
  2. problème code touches clavier
    Par vbapprenti dans le forum Général VBA
    Réponses: 9
    Dernier message: 09/05/2011, 23h30
  3. problème de touches du clavier sous eclipse
    Par isa21493 dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 22/05/2008, 09h22
  4. Problème evenement touche clavier + souris
    Par nasriOM dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 08/11/2007, 12h55
  5. Réponses: 7
    Dernier message: 05/06/2006, 13h44

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