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 :

Ctrl + character vers un composant


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut Ctrl + character vers un composant
    Bonsoir,

    Je sais comment envoyer un caractère simple vers un composant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SendMessage(Edit1.Handle, WM_KEYDOWN, 65, 0);
    Mais j'ai beau fouiller les forums, je ne trouve pas comment passer une séquence comme Ctrl+A

    Certains sites parlent de Keybd_Event mais le problème est qu'il faut appeler cette procédure plusieurs fois pour chaque partie et là les éléments arrivent un par un.
    Donc, impossible de détecter le ctrl et le A en même temps.

    Certains complètent avec tout un tas de code compliqué qui me parait bien lourdingue pour arriver à ça.

    Est-ce que quelqu'un ici aurait une solution simple pour faire ça svp ?

  2. #2
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Certains sites parlent de Keybd_Event mais le problème est qu'il faut appeler cette procédure plusieurs fois pour chaque partie et là les éléments arrivent un par un.
    Donc, impossible de détecter le ctrl et le A en même temps.
    Ca ne fonctionne pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       // donner d'abord le focus au composant.
       Keybd_Event(VK_LCONTROL, 0, 0, 0);
       Keybd_Event(VK_A, 0, 0, 0);
       Keybd_Event(VK_A, 0, KEYEVENTF_KEYUP, 0);
       Keybd_Event(VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0);
    (la constante VK_A est peut-être à définir toi-même)
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  3. #3
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Citation Envoyé par Lung Voir le message
    Ca ne fonctionne pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       // donner d'abord le focus au composant.
       Keybd_Event(VK_LCONTROL, 0, 0, 0);
       Keybd_Event(VK_A, 0, 0, 0);
       Keybd_Event(VK_A, 0, KEYEVENTF_KEYUP, 0);
       Keybd_Event(VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0);
    (la constante VK_A est peut-être à définir toi-même)
    euh si ... merci ..
    Les exemples à base de keybd_event que j'avais trouvés ne devaient pas utiliser les mêmes paramètres.
    Je vois aussi le KEYUP alors que je traquais le résultat dans OnKeyDown. Grosse erreur donc :-(

    En tous cas merci parce ça va m'éviter de reprendre du code en utilisant directement celui du composant.

  4. #4
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Partant de là, si ça peut servir à d'autres ...


    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
    procedure SendChar(Compo: TWinControl; Code: Byte; Avec: TShiftState);
    var
      FAvec: Byte;
    begin
     
      if ssShift in Avec then
        FAvec := VK_SHIFT // Touche Maj
      else if ssAlt in Avec then
        FAvec := VK_MENU // Touche Alt est enfoncée.
      else if ssCtrl in Avec then
        FAvec := VK_CONTROL // Touche Ctrl est enfoncée.
      else
        FAvec := 0;
     
      Compo.SetFocus;
     
      Keybd_Event(FAvec, 0, 0, 0);
      Keybd_Event(Code, 0, 0, 0);
      Keybd_Event(Code, 0, KEYEVENTF_KEYUP, 0);
      Keybd_Event(FAvec, 0, KEYEVENTF_KEYUP, 0);
    end;
     
    procedure TForm11.Button1Click(Sender: TObject);
    begin
      SendChar(Edit1, Ord('A'), [ssShift]);
    end;
     
    procedure TForm11.Edit1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if ssShift in Shift then
        if Key = Ord('A') then
          Caption := 'ok';
    end;

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Clairement pas la meilleure façon de procéder pour une majuscule. Pense que si CAPSLOCK est activé le fonctionnement de SHIFT est inversé. On pourrait aussi maintenir une touche CTRL au clavier, l'edit recevrait Ctrl+Shift+A. Tu dois prendre en considération l'état actuel du clavier avant de procéder.

    Mais pour du texte, mieux vaut passer par de l'unicode.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Keybd_Event(0, ord('A'), KEYEVENTF_UNICODE, 0);
    Keybd_Event(0, ord('a'), KEYEVENTF_UNICODE, 0);
    Enfin si tu comptes envoyer un texte d'une certaine longueur, privilégie SendInput qui remplit le buffer en une passe.

  6. #6
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    D'accord avec toi mais c'est un cas un peu spécial.

    J'utilise un composant qui réagit à des TShortcut définis dans le composant.
    On lui indique par exemple Ctrl+R pour déclencher une action.
    Le but de ma demande est de pouvoir déclencher cette action sur le composant sans taper la composition de touches manuellement.
    Cela ne me sert pas à envoyer réellement du texte dans une zone de saisie.

    Je voulais utiliser un SendMessage qui me paraissait plus simple mais je n'arrive pas à trouver comment le composer.
    Le code pour le Keydown c'est 256 et 257 pour le keyup.
    Mais je n'arrive pas à définir un TWWKey qui comprenne en plus ssctrl

    Vcl.Menus fournit une fonction pour créer un TShortCut à partir d'un message mais pas l'inverse.
    Si non, je composerais directement un record pour le SendMessage.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    impossible de détecter le ctrl et le A en même temps.
    Tu peux tester l'état d'une touche par GetAsyncKeyState ou de toutes les touches par GetKeyboardState.

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

Discussions similaires

  1. Passer des variables d'une Page vers un Composant
    Par zooffy dans le forum ASP.NET
    Réponses: 12
    Dernier message: 15/10/2009, 18h34
  2. [JTextField] Rediriger l'entrée standard vers le composant
    Par elfiestador dans le forum Composants
    Réponses: 6
    Dernier message: 27/06/2008, 15h25
  3. Réponses: 4
    Dernier message: 28/03/2007, 22h29
  4. [JMenu] Probleme Des Evenements du clavier vers les composants des
    Par Nadia_81 dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 05/06/2005, 23h14

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