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 :

Comment désactiver une touche activée par un KEYDOWN?


Sujet :

Delphi

  1. #1
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 37
    Par défaut Comment désactiver une touche activée par un KEYDOWN?
    Je m'explique:
    Je voudrais pouvoir faire une multisélection dans une DBGrid sans obliger l'utilisateur à appuyer à la fois sur un élément de la grille et sur la touche Ctrl (mon appli doit en effet tourner sur PDA).
    J'ai donc coder sur le OnCellClick de la DBGrid ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        keybd_event(VK_CONTROL,0,WM_KEYDOWN,0); //touche enfoncée
        keybd_event(VK_CONTROL,0,WM_KEYUP,0);//touche relevée
    Pour forcer la désactivation, sur le OnExit du composant et sur le OnCLose du formulaire j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if getkeystate(VK_CONTROL)= 1 then
        keybd_event(VK_CONTROL,0,WM_KEYUP,0);
    Malgré tout, une fois que j'ai quitté mon application (que je teste sur un PC), la touche Ctrl reste "virtuellement" enfoncée... pas moyen de la désactiver et je suis a priori obligée de redémarrer mon poste.

    Une idée? Merci !

  2. #2
    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
    Sinon tu peux utiliser le SmdbGrid qui permet d'afficher une checkbox sur la gauche pour de la multiselection.

    Le composant est gratuit et fonctionne très bien (je l'utilise depuis plusieurs années)
    Modérateur Delphi

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

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Par défaut
    C'est un peu tordu ta multi-selection via la simulation de la touche CTRL.
    Je me range facilement avec l'avis de Malatar...

    Par contre, si tu tiens à conserver cette approche,
    je te propose plutot l'API
    SendInput...
    pour la simulation des touches

    Voici comment tu peux l'utiliser
    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
     
    var
      Input:TInput;
    begin
      Input.Itype := INPUT_KEYBOARD;
      Input.ki.wVk := VK_CONTROL;
      Input.ki.wScan := 0;
      Input.ki.time := 0;
      Input.ki.dwExtraInfo := 0;
     
      Input.ki.dwFlags := 0;    // Preparation pour envoi Key DOWN
      SendInput(1, Input, SizeOf(Input));  //Send Key DOWN
      //Lecture de l'etat de VK_CONTROL
      if GetAsyncKeyState(VK_CONTROL) <> 0 then
      begin
          //Vk_Control est down! remet a UP!
          Input.ki.dwFlags := KEYEVENTF_KEYUP; // preparation pour envoi Key UP
          SendInput(1, Input, SizeOf(Input)); //Send Key UP
      end;
    Citation Envoyé par Microsoft
    (a propos de la fonction keybd_event)
    Windows NT/2000/XP:This function has been superseded. Use SendInput instead.
    j'espère le tout conforme...
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  4. #4
    Candidat au Club
    Inscrit en
    Janvier 2003
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 2

  5. #5
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 37
    Par défaut
    Bonjour à tous,
    @Malatar: Je viens de tester les SMDBGrid. Sympa en multiselect avec les checkbox hormis l' "indicator" qui est borné à une taille d'au moins 23. Je pourrais utiliser ce composant si j'arrive à ne conserver que les checkbox et donc à enlever l'indicateur avec la flèche... mais il faut que je vois si c'est possible, car je dois placer 4 dbgrid sur une partie de mon écran PDA, c'est un peu serré (bref!)
    Je continue mes tests avec ma méthode "tordue" dixit Eric Boisvert
    J'ai remplacé la touche Control par la touche Espace qui a le même effet qu'une touche caractère. Je jongle en même temps avec les BookMark ... j'espèrepouvoir vous en dire plus dans le courant de la journée !

  6. #6
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 37
    Par défaut
    Je teste les SMDBGrid et avec deux composants de cette classe sur un même formulaire, j'ai un plantage dans le OnMouseUp du .pas ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      if (Button = mbLeft) and
         (Cell.X >= IndicatorOffset) and
         (ACol <= FixedCols) and
         (Cell.Y >= TitleOffset) then
        CellClick(Columns[ACol])
    Ca se produit parfois lorsque je passe d'une grille à l'autre en cliquant un élément.

  7. #7
    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
    Quel est l'erreur ?
    Modérateur Delphi

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

  8. #8
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 37
    Par défaut [d7]
    Voici l'erreur :
    Violation d'accès à l'adresse 00491D23 dans le module 'monProjet.exe'. Lecture de l'adresse 0000000.
    ?
    Tu as essayé de reproduire le cas?

    Enfin, du coup, je change encore de composant. J'opte pour les DBCtrlGrid en insérant un CheckBox et un DBLabel. Je suis en train de tester cette solution...

  9. #9
    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
    Citation Envoyé par celine33
    Tu as essayé de reproduire le cas?
    Non, car je sais pas ce que tu fais sur le onMouseUp
    Modérateur Delphi

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

  10. #10
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 37
    Par défaut
    Cet événement se déclenche mais il est codé dans SMDBGrid.pas, ça n'est pas mon code qui génère cette erreur. Je n'ai rien sur le OnMouseUp dans mon code.

  11. #11
    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
    Bin je n'ai pas cette erreur avec ma version du smdbgrid (3.48), j'ai vérifié j'en ai 7 dans un programme (dans des onglets séparés)
    Modérateur Delphi

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

  12. #12
    Membre Expert Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894

  13. #13
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 37
    Par défaut
    Salam Edam, merci pour ton code! Je m'en inspirerais si besoin.

    La solution que je teste avec les CtrlGrid ne fonctionne pas encore. Je dois gérer un champ calculé sur le checkbox, j'espère avancer sur ce point!
    a+

Discussions similaires

  1. Comment désactiver une touche ?
    Par touff5 dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 06/02/2007, 21h31
  2. Réponses: 1
    Dernier message: 01/11/2005, 02h29
  3. Cmt Désactiver une touche du KB ?!
    Par microzen dans le forum C++
    Réponses: 6
    Dernier message: 17/10/2005, 23h57
  4. [Débutant] [JTextArea] Désactiver une touche
    Par picomz dans le forum Composants
    Réponses: 2
    Dernier message: 09/06/2005, 16h52
  5. comment désactiver la touche windows ?
    Par mAdY dans le forum Bibliothèques tierces
    Réponses: 2
    Dernier message: 13/04/2005, 10h24

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