cs_tsiky
Messages postés10Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention24 juillet 2006
-
14 avril 2006 à 11:06
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 2013
-
19 avril 2006 à 12:26
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202237 14 avril 2006 à 13:22
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;
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 14 avril 2006 à 11:52
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" ;)
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 14 avril 2006 à 12:01
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és3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 14 avril 2006 à 12:08
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 14 avril 2006 à 12:25
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 !!!
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 14 avril 2006 à 12:38
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
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 14 avril 2006 à 13:09
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
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202237 14 avril 2006 à 13:29
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...