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 :

Intercepter touches fonctions TAB et CTL


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 111
    Points : 44
    Points
    44
    Par défaut Intercepter touches fonctions TAB et CTL
    Bonjour à vous tous

    Je me permets de vous contacter pour un problème que je n'arrive pas à résoudre :

    J'ai une TFORM sur laquelle s'affichent plusieurs bitMap, différentes en fonction des actions de l'utilisateur. Il est donc difficile, à un instant donné, de savoir ce que la Form contient comme BitMap et où elles se trouvent. C'est pour cette raison que je n'ai pas implémenté l'événement "OnPaint" et que j'ai bloqué le déplacement de la Form.

    Tout se passe bien sauf que si on appuie sur les touches Tab ou Alt, l'événement "OnPaint" est lancé : toutes les bitmap s'effacent !!!

    J'ai essayé également ceci :

    protected
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;

    .....

    procedure TForm.WMPaint(var Message: TWMPaint);
    begin
    if PeutDessiner then
    inherited ;
    end;

    J'ai donc initialiser PeutDessiner à Vrai quand j'autorise à Redessiner et à Faux quand je n'autorise pas : En appuyant sur la touche Tab ou ALT, la fenêtre s'efface quand même alors que PeutDessiner est à faux ?!!!!

    Est-ce qu'il est possible d'intercepter l'appui de ces deux touches ou de les bloquer momentanément avant que "OnPaint" ne soit appelé ( j'ai essayé onKeyPress, OnKeyDown, OnKeyUp : elles sont appelées après OnPaint donc ne sont pas exploitables hélas ) ?

    Je vous remercie par avance de vos réponses et vous souhaite une très bonne journée.

    Laurent CUSSAC

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm.WMPaint(var Message: TWMPaint);
    begin
    if PeutDessiner then
      inherited 
    else
      Message:=0; // ou nil ou ???
    end;
    Sinon, utilise Application.OnMessage et affecte PeutDessiner à Handled si le message est WM_PAINT.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    Merci pour votre réponse, je suis parti sur votre piste de Application.OnMessage.

    Dans la partie TFORM.Create, j'ai inséré la ligne de commande Application.OnMessage := TraiteMessages ;

    Puis j'ai créé la routine

    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 TFORM.TraiteMessages(Var msg : TMsg; Var Handled: boolean);
    Var
       Traiter : Boolean ;
     
    begin
      Traiter := False ;
      With msg do
      begin
        IF Message = WM_KEYDOWN then
        Case  wparam of
          VK_TAB  : Traiter := True ;
          VK_MENU : Traiter := True ;
        end;
      end;
     Handled := Traiter ;
    end;
    Et enfin j'ai déclaré dans la partie déclaration des procédures de ma fiche TFORM : Procedure TraiteMessages(Var msg : TMsg; Var Handled: boolean);

    Quand je teste ( j'ai mis un point d'arrêt sur la première ligne de la procédure TraiteMessages ) , la procédure TraiteMessages n'est jamais appelée.

    Faut-il débloquer quelque chose ou initialiser quelque chose pour quelle soit appeler ?

    Merci beaucoup pour votre réponse

    Laurent CUSSAC

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    pourquoi se compliquer la vie quand on peut faire simple ^^

    dans le formKeyDown

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TMAFICHE.FormKeyDown(Sender: TObject; var Key: Word;    Shift: TShiftState);
    begin
        if  (ssCtrl in shift) then
          // touche Control Activé
     ....
    end;
    les valeur disponible sont :
    ssShift, ssAlt, ssCtrl, ...

    ne pas oublier le KeyPreview := true sur la forme
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    Merci Anapurna

    Je l'avais testé mais l'interception se fait après le traitement de la touche Alt. Je souhaiterais l'intercepter avant.

    J'ai testé la fonction application.OnMessage sur une application simple : cela marche nickel.

    Par contre, dans mon application, elle n'est jamais appelée ;-( Quelqu'un saurait-il pourquoi ?

    Merci par avance de votre réponse.

    Je vous souhaite une très bonne soirée

    Laurent CUSSAC

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    tu applique ton evenement comment ?

    Dans le Create il faut que tu fasse un truc du genre ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ... 
    OldTraitement  :=  application.OnMessage;
    application.OnMessage := TraiteMessages;
    ...
    application.OnMessage := OldTraitement;
    end;
    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
     
    Procedure TFORM.TraiteMessages(Var msg : TMsg; Var Handled: boolean);
    Var
       Traiter : Boolean ;
     
    begin
      Traiter := False ;
      With msg do
      begin
        IF Message = WM_KEYDOWN then
        Case  wparam of
          VK_TAB  : Traiter := True ;
          VK_MENU : Traiter := True ;
        end;
      end;
     Handled := Traiter ;
    end;
    mais je suis surpris ... je pense que tu doit avoir un soucis dans la gestion de tes messages ... cela ne me parait pas logique
    que la gestion des touche se fasse avant le onkeydown.

    sinon tu as la fonction GetKeyState qui permet de connaitre l'etat de la touche pour savoir si elle est activé

    il est difficile pour nous de répondre à ta question sans un bout de code reproduisant ton problème .
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    Merci de votre réponse Anapurna

    Le programme complet que j'ai conçu dépasse les 70 000 lignes et il fonctionne correctement.

    Il s'agit en fait d'une routine qui affiche des BitMaps en fonction du choix de l'utilisateur ( cette partie fonctionne très bien ).

    J'ai constaté par hasard que si on appuie sur les touches Tab ou Alt ou flèches alors la fiche s'efface ( tout appuie sur une autre touche n'efface rien ).

    J'ai donc testé les routines KeyDown, KeyPressed , KeyUp : quand elles sont appelées ( j'ai testé en mode debug ) les images ont déjà été effacées, je ne peux donc pas intervenir à partir de ces routines. Je souhaitais donc intercepter ces touches avant que leur traitement ne soit effectué : je ne comprends pas pourquoi le fait d'appuyer sur ces touches peut entraîner un effacement des images !!!

    Je suis en train d'étudier le application.OnMessage : quand je teste sur une application de base, cela marche nickel ( donc le principe est ok ) mais quand j'implémente la même procédure dans mon programme, elle n'est pas appelée ce qui me semble très étrange. D'où mon questionnement ?

    Si vous avez une idée, je suis preneur ;-)

    Je vous souhaite une très bonne journée et vous remercie pour votre réponse.

    Laurent CUSSAC

  8. #8
    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,

    Comme le dit Anapurna :
    sinon tu as la fonction GetKeyState qui permet de connaitre l'etat de la touche pour savoir si elle est activé
    Voici la routine qui utilise le KeyState :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function  ToucheCla(t : integer) : boolean; // Appui Touche clavier ou souris
    //        utilisations : if ToucheCla(VK_CONTROL) then ...
    //                       if ToucheCla(Ord('R')) then ...
    begin     Result:= ((GetAsyncKeyState(t) and 32768)<> 0)
    end;
    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    Un grand merci à vous tous pour vos réponses.

    Je vais tester ce que vous m'avez dit et je vous dirai ce qu'il en est.

    Bonne journée à vous tous

    Laurent CUSSAC

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    Bonsoir tout le monde

    Alors j'ai testé un peu toutes vos solutions et celle qui fonctionne le mieux est celle utilisant application.OnMessage que voici :

    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
    Procedure TTestBulle.TraiteMessages(Var msg : TMsg; Var Handled: boolean);
    Var
       Traiter : Boolean ;
     
    begin
      Traiter := False ;
      With msg do
      begin
        If Message = WM_KEYDOWN then
          Case  wparam of
            VK_TAB  : Traiter := True ;
            VK_CONTROL : Traiter := True ;
            VK_UP : Traiter := True ;
            VK_DOWN : Traiter := True ;
            VK_LEFT : Traiter := True ;
            VK_RIGHT : Traiter := True ;
          end
        { Touche Alt }
        Else if Message = 260  then
          Traiter := True ;
      end;
      Handled := Traiter ;
    end;
    J'arrive à intercepter toutes les touches sauf la touche ALG GR qui ne déclenche pas le message WM_KEYDOWN ( la touche ALT non plus mais la valeur Message qui lui est associée est 260 ).

    Sauriez vous comment reconnaître l'appui sur la touche ALT GR dans cette procédure ( CONTROL est repéré, ALT est également repéré mais l'appui sur les deux touches n'est pas repéré ) ?

    Je vous remercie par avance de votre réponse et vous souhaite une très bonne soirée

    Laurent CUSSAC

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    Bon et bien j'ai trouvé, il suffisait d'enlever la ligne "If Message = WM_KEYDOWN then" et de tester directement le msg.wparam.

    Encore merci pour toutes vos idées et bonne journée à tous.

    Laurent CUSSAC

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

Discussions similaires

  1. Fonction tab à l'appui de la touche entrée
    Par yeste64 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 30/09/2011, 10h52
  2. Réponses: 4
    Dernier message: 03/02/2009, 14h02
  3. Les touches Fonction F1 -> F12
    Par Sombila dans le forum Delphi
    Réponses: 3
    Dernier message: 08/02/2007, 16h18
  4. Réponses: 4
    Dernier message: 18/01/2006, 14h49
  5. Comment inhiber la combinaison de touche CTRL+TAB ?
    Par jddev dans le forum Langage
    Réponses: 8
    Dernier message: 18/08/2005, 12h12

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