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 :

comparer un code key à un mot (word)


Sujet :

Delphi

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Points : 628
    Points
    628
    Par défaut comparer un code key à un mot (word)
    Salut
    J'ai un tableau de mots (word) qui sont les codes de touches du OnkeyDown :
    (VK_LEFT, VK_CONTROL, etc....)

    Lors de la détection du OnkeyDown je voudrais utiliser un case of pour savoir si le key détecté correspond à un des mots du tableau, mais "case..of" n'accepte que des types ordinaux, alors je ne vois pas comment faire.

    Ce tableau est en fait le tableau de configuration des touches de mon programme.
    Cliquez ici et reprenez le pouvoir !
    A bas IE !, Google, et le pistage du net, testons DuckDuckGo.com
    Lords Of The Realm II Download : Lords of the realm 2
    Infos en anglais :Ici

  2. #2
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    Si ça peut t'aider... pour le case of en string... la solution est dans la faq :
    Etant donné que la structure Case Of requiert une donnée de type ordinal, il est impossible de faire un Case Of directement avec des String.
    L'astuce consiste à utiliser la fonction AnsiIndexStr de l'unité StrUtils :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    uses StrUtils;
    ...
    case AnsiIndexStr(Str, ['Chaîne1', 'Chaîne2', 'Chaîne3']) of
      0 : // Str = 'Chaîne1'
      1 : // Str = 'Chaîne2'
      2 : // Str = 'Chaîne3'
      -1 : // Str ne vaut aucune de ces trois chaînes
    end;

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Points : 628
    Points
    628
    Par défaut
    un type word c'est comme un type string ?
    Cliquez ici et reprenez le pouvoir !
    A bas IE !, Google, et le pistage du net, testons DuckDuckGo.com
    Lords Of The Realm II Download : Lords of the realm 2
    Infos en anglais :Ici

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    la réponse d'Archimède est sans rapport à la question

    si je comprend bien ta question tu as un pb à la compilation de ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    const
      Keys:array[0..1] of Word = (VK_LEFT, VK_CONTROL);
     
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      case Key of
        Keys[0] : ShowMessage('VK_LEFT');
        Keys[1] : ShowMessage('VK_CONTROL');
      end;
    end;
    je suis assez d'accord, ça devrait compiler...

    si tu as besoin de ton tableau en plus des constantes, je te propose un workaround
    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
     
     
    const
      Key0 = VK_LEFT;
      Key1 = VK_CONTROL;
      Keys: array[0..1] of Word = (Key0, Key1);
     
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      case Key of
        Key0 : ShowMessage('VK_LEFT');
        Key1 : ShowMessage('VK_CONTROL');
      end;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    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
    @Salut,

    Une autre proposition avec un tableau retournant un boolean, l'avantage tu peux tester si plusieur touche sont utilisées :

    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
    Type
     
        procedure ProcMess(var msg: TMsg; Var Handled: Boolean);
     
    // ...
     
       Var Etatkb:Array[0..255]of Boolean;
     
    Implentation
     
    procedure TForm1.FormActivate(Sender: Tobject);
    begin
      Application.OnMessage:=ProcMess; // C'est partie moin kiki
    end;
     
    procedure TForm1.ProcMess(Var msg: TMsg; Var Handled: Boolean);
    Begin
     
      If (msg.Message=WM_KEYDOWN) THEN Etatkb[msg.wparam]:=True; // MessageWindows reçu
      If (msg.Message=WM_KEYUP) THEN Etatkb[msg.wparam]:=False; 
     
    //
    // exemple si ESC + SHIFT + Control enfoncé
    //
      If (Etatkb[VK_ESCAPE])
        And (Etatkb[VK_SHIFT])
          And (EtatKb[VK_CONTROL]) THEN
            Begin
              Showmessage('coucou');
            end;
    End;
    Ici tu peux aussi forcer à false Etatkb à l'issu d'une pression de touche.

    Tu peux aussi tester le tableau EtatKb ailleur que dans la procedure ProcMess

    etc..

    Bye

  6. #6
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    Oui, excuse, j'avais lu ton post en travers...
    et j'ai retenu :"case..of" n'accepte que des types ordinaux
    d'où le réflexe avec la conversion en string.
    Si c'est le codage associé aux touches... aucun rapport
    désolé

Discussions similaires

  1. Réponses: 9
    Dernier message: 26/06/2018, 21h35
  2. Comment protéger le code VBA par mot de passe
    Par electrosat03 dans le forum VBA Access
    Réponses: 5
    Dernier message: 12/01/2012, 12h19
  3. Réponses: 3
    Dernier message: 12/06/2011, 20h52
  4. Code en VB pour word
    Par DANIEL PALADINO dans le forum Word
    Réponses: 1
    Dernier message: 30/05/2009, 14h07
  5. code key de F5 : 116 / code key de 't' :116
    Par mappy dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 10/08/2006, 14h13

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