Détecter l'appui sur les touches de direction

Signaler
Messages postés
10
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
24 juillet 2006
-
cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
-
Bonjour à tous,

comment peut-on détecter l'appui sur les touches F1 à F10?
j'ai trouvé une solution sur http://pascal.developpez.com/faq/?page=Pg_FAQ_Kbd#TouchesDirection mais delphi ne reconnait ni ctr ni readkey.

11 réponses

Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
27
autre solution qui consiste a utiliser un timer regler a 25ms

et mettre :

begin
if GetAsyncKeyState(VK_LEFT) < 0 then ...
if GetAsyncKeyState(VK_RIGHT)< 0 then ...
if GetAsyncKeyState(VK_UP) < 0 then ...
if GetAsyncKeyState(VK_DOWN) < 0 then ...


if GetAsyncKeyState(VK_F1) < 0 then ...

if GetAsyncKeyState(VK_F2) < 0 then ...

if GetAsyncKeyState(VK_F3) < 0 then ...

if GetAsyncKeyState(VK_F4) < 0 then ...

if GetAsyncKeyState(VK_F5) < 0 then ...

if GetAsyncKeyState(VK_F6) < 0 then ...

if GetAsyncKeyState(VK_F7) < 0 then ...

if GetAsyncKeyState(VK_F8) < 0 then ...

if GetAsyncKeyState(VK_F9) < 0 then ...

if GetAsyncKeyState(VK_F10) < 0 then ...

if GetAsyncKeyState(VK_F11) < 0 then ...
if GetAsyncKeyState(VK_F12) < 0 then ...

end;

ou encore :

function KeyPressed : Integer;
var
i : Integer;
buffer : TKeyboardState;
begin
Result := -1;
if GetKeyboardState(buffer) then begin
for i := 0 to High(buffer) do begin
if (buffer[i] and $80) <> 0 then begin
Result := i;
Exit;
end;
end;
end;
end;

et comme je suis sympa je te donne ma fonction magique :

type
TByteSet = Set of byte;

function KeyboardState : TByteSet;
var K : byte;
begin
result := [];

// caps lock
if GetKeyState(144) = 1 then result := result + [144];
// scroll lock
if GetKeyState(145) = 1 then result := result + [145];
// Num lock
if GetKeyState(20) = 1 then result := result + [20];
// pause
if GetKeyState(19) = 1 then result := result + [19];

for K := 0 to 255 do
if windows.GetAsyncKeyState(K) < 0 then begin
result := result + [K];
case K of
// correction of Ctrl, Alt, Shift
17,16,18 : result := result - [K];
// correction of AltGr
165 : result := result - [162];
end;
end;
end;

utilisation :

procedure TForm1.Timer1Timer(Sender: TObject);
var N : integer;
begin
Label1.Caption := '';
for N := 0 to 255 do
if N in KeyboardState then begin
label1.Caption := Label1.Caption + inttostr(N) +' ';
end;
end;

grace a celle ci, tu peu connaitre l'etat de n'importe qu'elle touche et surtout les combinaisons de touche en cours (CTRL+ALT, CTRL Gauche, CTRL Droit, VerrNum, CapsLock ect...)
beaucoup plus pratique que la lecture d'une variable ne donnant que la derniere touche appuyée et encore...

il suffit de tester la presence des touches dans KeyboardState et hop ... on as le resultat.

si on doit tester plusieurs touche, afin d'eviter plusieurs appel a KeyboardState il suffirat de stocker le resultat dans une variable TByteSet :

var BS : TByteSet;
begin
BS := KeyboardState;
if VK_LEFT in BS then ... {fleche gauche}
if VK_ESCAPE in BS then ... {touche echape}
if [VK_LCTRL,VK_LMENU,82] <= BS then ... {combinaison Ctrl+Alt+R}
end;
Messages postés
304
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
10 mars 2012

C'est normal petit scarabé !!! tu es allé voir un code pour Turbo Pascal !!!
hors si je n'abuse tu bosse sous Delphi ?
dans ce cas il faut proceder comme suit

1) toi mettre la propriété de la fiche "KeyPreview" à True
2) dans ta fiche il existe un évènement "FormKeyDown" toi cliquer dessus

maintenant tu dois avoir une déclaration de ce genre :

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: ShiftState);
begin
Case Key of
VK_F1 : Caption :'touche pressée F1';
VK_F10 : Caption :'touche pressée F10';
end;//Case Key Of
biensur c'est un exemple j'ai mis Caption, mets à la place ton code tout Simplement


end;

et n'oubli pas petit scarabé "Si tu ne te plantes pas ..., tu ne poussera jamais" ;)
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
Salut,
c'est normal que Crt et ReadKey ne soient pas reconues :
Crt est une unité du Turbo Pascal
et ReadKey en est un mot reservé

sous Delphi il faut mettre la propriété KeyPreview de la Form à True (avec l'inspecteur d'objets) et en suite dans l'évènemet OnKeyUp :

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (key = vk_F10) and (ssCtrl in Shift) then ShowMessage('ok'); // Ctrl + F10 Montre un message
if key = vk_Escape then Close; // Echape Ferme la Formif (key vk_Up) and (ssCtrl in Shift) <gras>then Top :</gras> Top - 10; // Ctrl + Flèche haut déplace la Form de 10 vers le hautif (key vk_Down) and (ssCtrl in Shift) <gras>then Top :</gras> Top + 10; // Ctrl + Flèche bas déplace la Form de 10 vers le basif (key vk_Left) and (ssCtrl in Shift) <gras>then Left :</gras> Left - 10; // Ctrl + Flèche gauche déplace la Form de 10 vers la gaucheif (key vk_Right) and (ssCtrl in Shift) <gras>then Left :</gras> Left + 10; // Ctrl + Flèche droite déplace la Form de 10 vers la droite
end;

@+
Cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
Désolé Shining mais encore un fois je n'ai pas rafraîchit avant de poster.
D'ailleur en vérité j'évite de le faire puisque 4 fois sur 5 mon navigateur me bouffe ce que j'avais écris (et c'est asser énervant)

l'avantage c'est qu'il aura eut deux méthodes pour le prix d'une

@+
Cirec
Messages postés
304
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
10 mars 2012

ptdr Cirec, ouep ça m'es déja arrivé également j'avais fait un roman en plus lol, après j'ai laissé tomber le post !!!
ton exemple un est peu plus détaillé que le mien néanmoins "FormKeyUp" attend qu'on relache la touche tandis que "FormKeyDown" se déclenche aussitôt à l'appuie de la touche petite nuance donc !!!

enjoy !!
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
oui c'est vrai petite nuance,
l'avantage que j'y trouve avec FormKeyUp c'est que si tu change d'avis en cour de route il te suffit d'appuyer sur une touche supplémentaire ce qui a pour effet d'annuler (en quelque sorte) la frappe.
Par contre avec FormKeyDown dès que la touche est pressé "le coup part" (trop dangereux)
@+
Cirec
Messages postés
304
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
10 mars 2012

tant que le soft n'integre pas une fonction dangereuse F10="Auto destruction de l'ordinateur", dans ce cas il suffirait de mettre un MessageDlg avec "êtes-vous sûr de vouloir détruire votre PC ?.. ouverture d'internet Exploseur en cours..."
mais là j'arrête on sort du context lol
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
27
ah, petit rappel pour mes methodes, meme si la fenetre n'a pas le focus, les touches sont detectées, il faut donc activer/desactiver en consequence le timer selon si la fiche a le focus ou non.

sinon, pour eviter cela, placer le code du timer dans l'evenement OnKeyPress de l'objet ou OnChange...
Messages postés
10
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
24 juillet 2006

merci à vous!
et merci pour les idées
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
@+
Cirec
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
26
Tsiky : merci de bien vouloir valider les réponses qui conviennent

May Delphi be with you !
<hr color="#008000">