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

 Delphi Discussion :

Simuler OnKeyDown dans TTimer


Sujet :

Delphi

  1. #1
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 132
    Points
    132
    Par défaut Simuler OnKeyDown dans TTimer
    Bonjour a toutes et a tous .
    Voila plus de deux semaines que je galère pour simuler la procédure - FormKeyDown - dans un timer.
    Pour bien expliquer : comment savoir si une touche a été pressée dans l’évènement d’un TTimer .
    Merci pour toutes aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    Var Key:Word;
        Shift: TShiftState;
    begin
    label2.Caption:= chr(Key);
     
     if  GetKeyState(VK_SHIFT) < 0 then 
        begin
          Label1.caption:='Shift +'+Label2.Caption;
       end;
     
    end;

  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
    Essaye ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
     if  (GetAsyncKeyState(VK_SHIFT) and $8000) <> 0 then
        Label1.caption:='Shift +'+Label2.Caption;
    end;
    Il faut que Shift soit appuyé au même du Timer, si tu as laisse Interval à 1000, tu risque de le louper
    Essaye à 50ms, n'oublie pas le Enabed du Timer aussi !

    GetAsyncKeyState and $0001 permet de gérer si Shift a été appuyé entre cet appel et le précédent, je ne l'ai jamais utilisé ainsi pour ma part

    On a parlé de cela dans Problème de touche clavier , je te laisse lire ce sujet
    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
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 132
    Points
    132
    Par défaut
    Merci ShaiLeTroll pour votre réponse si rapide

    je n'ai pas de problème pour la détection du Shift mais mon problème est que je ne sais comment que Label2 intercepte la touche clavier appuyée .

  4. #4
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par MIWAN Voir le message
    mon problème est que je ne sais comment que Label2 intercepte la touche clavier appuyée .
    Normal un TLabel n'est pas un descendant de TWinControl mais d'un TGraphicControl

    Il faut que tu l'attaque avec les Evénements Windows WM_KEY etc...

  5. #5
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Citation Envoyé par BuzzLeclaire Voir le message
    Normal un TLabel n'est pas un descendant de TWinControl mais d'un TGraphicControl

    Il faut que tu l'attaque avec les Evénements Windows WM_KEY etc...

    Elle ne détienne pas le focus

  6. #6
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Montor Voir le message
    Elle ne détienne pas le focus
    Cela dépends de ce que tu souhaite faire, si c'est un déplacement personnellement je place le tlabel dans un tpanel.
    Si c'est juste pour détecter le clique pour faire une modification de texte cela suffira..

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 694
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Citations

    1. Simuler OnKeyDown dans TTimer
    2. comment savoir si une touche a été pressée dans l’évènement d’un TTimer
    3. je n'ai pas de problème pour la détection du Shift mais mon problème est que je ne sais comment que Label2 intercepte la touche clavier appuyée


    Perso... j'ai pas compris la question

  8. #8
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Perso... j'ai pas compris la question
    C'est ce que je me suis dit hier soir...
    Philippe.

  9. #9
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    C'est, je pense, l'opportunité de l'utilisation d'un Timer qui pose problème et qui a été mal comprise par MIWAN.

    « Le composant Timer permet de déclencher un événement (une seule fois ou de façon répétitive) après un intervalle de temps mesuré. »

  10. #10
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 132
    Points
    132
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Citations

    1. Simuler OnKeyDown dans TTimer
    2. comment savoir si une touche a été pressée dans l’évènement d’un TTimer
    3. je n'ai pas de problème pour la détection du Shift mais mon problème est que je ne sais comment que Label2 intercepte la touche clavier appuyée


    Perso... j'ai pas compris la question

    peut être que je n'étais pas claire :

    dans les événements (onKeyDown et onKeyPress) le label intercepte les caractères tapés dans le clavier ; mais quand la forme n'est pas active on perd la réception des touches . a cause de ce la je cherche a simulé ces procédures dans un Ttimer;

    j'ai bien fait beaucoup de manipulations et je n'ai pas pu arriver a mes besoins

    par exemple :les procédures de Sub0
    http://www.developpez.com/telecharge...e2ee45a2146ee9

    on voit qu'il détecte la sourie et meme que la fiche(Form) n'a pas de focus , mais comment afficher les caractères svp ?

  11. #11
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 132
    Points
    132
    Par défaut
    Citation Envoyé par Caribensila Voir le message
    C'est, je pense, l'opportunité de l'utilisation d'un Timer qui pose problème et qui a été mal comprise par MIWAN.
    oui je ne sais comment procéder pour que le label affiche les caractères .

  12. #12
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par MIWAN Voir le message
    peut être que je n'étais pas claire :
    Eh bien, je dirais pas très...
    Citation Envoyé par MIWAN Voir le message
    dans les événements (onKeyDown et onKeyPress) le label intercepte les caractères tapés dans le clavier ; mais quand la forme n'est pas active on perd la réception des touches . a cause de ce la je cherche a simulé ces procédures dans un Ttimer;
    Si la fiche n'est pas active, c'est qu'une autre l'est et c'est elle qui récupère les événements clavier (les messages windows en fait) ?

    En fait, je pense que la solution revient à traiter ces messages, mais pour en être sur, pourriez vous présenter plus concrètement ce que vous voulez obtenir comme fonctionnement ?
    Philippe.

  13. #13
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 132
    Points
    132
    Par défaut
    Citation Envoyé par Ph. B. Voir le message

    En fait, je pense que la solution revient à traiter ces messages, mais pour en être sur, pourriez vous présenter plus concrètement ce que vous voulez obtenir comme fonctionnement ?
    OK

    pour l'affichage de l'état des souris il est dans le source de Mr: Sub0
    ce qui me manque :
    1 - si je tape c sur le clavier ---> le TLabel affiche c.
    2 - si je fait Shift + C ---> Le TLabel affiche : ' Shift + ' C
    ainsi que pour les autres combinaisons du clavier.

  14. #14
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par MIWAN Voir le message
    ce qui me manque :
    1 - si je tape c sur le clavier ---> le TLabel affiche c.
    2 - si je fait Shift + C ---> Le TLabel affiche : ' Shift + ' C
    ainsi que pour les autres combinaisons du clavier.
    On pourrait peut-être utiliser un TApplicationEvents qui se chargerait d'intercepter les messages et de traiter ceux qui sont pertinents via le gestionnaire de message OnMessage. Les messages à étudier sont entre autres WM_KEYDOWN, WM_KEYUP, WM_CHAR...
    En fonction de l'information capturée, on peut remplir de manière adéquate le TLabel.
    Philippe.

  15. #15
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 132
    Points
    132
    Par défaut
    bonsoir

    pour les Touches shift , alt c'est bon avec le code suivant pour ce qui s'intéresse

    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
     
     
    dans un timer 
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      i : byte;
    begin
     
      for i:=8 To 222 do
      begin
             if GetAsyncKeyState(i)=-32767 then
          if GetKeyState(VK_Shift)<0 then
          Label1.Caption:='Shift + '+(GetCharFromVirtualKey(i))
          else
          Label1.Caption:=(GetCharFromVirtualKey(i));
      end;
     
     
    end;
    maintenant je suis bloqué par la combinaison VK_CONTROL et un autre caractère . la ou j'espère une aide

  16. #16
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 132
    Points
    132
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Citations

    1. Simuler OnKeyDown dans TTimer
    2. comment savoir si une touche a été pressée dans l’évènement d’un TTimer
    3. je n'ai pas de problème pour la détection du Shift mais mon problème est que je ne sais comment que Label2 intercepte la touche clavier appuyée


    Perso... j'ai pas compris la question

    bonjour

    je cherche a savoir comment intercepter une combinaison des touches clavier.

  17. #17
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2012
    Messages : 111
    Points : 171
    Points
    171
    Par défaut onkeydown de tforme
    salu a tt le monde
    il n'existe pas un evenement onkeydown dans le composant ttimer
    mai en pent jouer avec on keydown de notre form et en utilison une variable de teste pour savoir si une touche et enfoncer moi j'utilise la varibla tag de timer si tag a la valeur 1 alor une touche est enfoncer sinon on fai rien .
    voula la source

    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
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
    timer1.Tag := 1;
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    if timer1.Tag = 1 then
    begin
    //--- ecrire ce que veu tu faire
    timer1.tag :=0;    // renitialiser la variable a 0
    end
     
     
    end;

  18. #18
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 132
    Points
    132
    Par défaut
    bonjour

    Citation Envoyé par tarekk73
    il n'existe pas un evenement onkeydown dans le composant ttimer

    ça tt le monde le sait c'est pour cela j'ai le titre (simulation);

    moi j'utilise la varibla tag de timer si tag a la valeur 1 alor une touche est enfoncer sinon on fai rien .
    ce petit trick ne marche pas quand la fiche perd le focus .

    on toutes les cas je suis très reconnaissant de votre intervention merci.

    NB:

    je crois que je dois fouiller dans les HOOKS - Claviers.


  19. #19
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2012
    Messages : 111
    Points : 171
    Points
    171
    Par défaut ce petit trick ne marche pas quand la fiche perd le focus
    salu amie
    onkeydown existe que dans les composantS visuel ( les composants qui recoit la focalisation)
    dans notre cas ttimer ne recoit pas la focalisation. c'est pour ça j'ai utilisez un composant visuel . en plus de ça onkeydown de n'importe quel composant ne s'execute automatiquement que si son composant et on focalisation .
    merci et bon courage amie

Discussions similaires

  1. Filtre RC par simulation numérique dans le microcontrôleur
    Par thierrytf dans le forum Embarqué
    Réponses: 13
    Dernier message: 12/06/2015, 21h36
  2. Simulation du "+" dans le bindingNavigator
    Par sincos dans le forum Windows Forms
    Réponses: 8
    Dernier message: 26/06/2009, 17h54
  3. simuler un double click sur une liste dans un dbgrid
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 1
    Dernier message: 01/09/2005, 10h45
  4. Simulation de touche dans un richedit
    Par firejocker dans le forum Composants VCL
    Réponses: 4
    Dernier message: 29/07/2004, 16h58
  5. Accès à une case d'un DBGrid dans l'event OnKeyDown
    Par fba dans le forum Bases de données
    Réponses: 2
    Dernier message: 02/03/2004, 12h48

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