Evenement clavier [Résolu]

impossibleok 55 Messages postés lundi 27 mars 2006Date d'inscription 26 juin 2009 Dernière intervention - 1 déc. 2008 à 08:15 - Dernière réponse : eole15 12 Messages postés lundi 29 décembre 2008Date d'inscription 18 février 2009 Dernière intervention
- 3 janv. 2009 à 22:42
bjr;
comment peut on savoir que la touche "Ctrl" est enfoncée?
merci.
Afficher la suite 

19 réponses

Répondre au sujet
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 2 déc. 2008 à 09:18
+3
Utile
Bin tu peux pondre un truc dans ce genre là, en ajoutant une booléenne private à ta Form... Mais bon c'est le genre de code qui a tendance à faire n'importe quoi : si la orm perd le focus alors que ctrl est appuyé, le relachement de ctrl n'est pas pris en compte.

C'est là que le hook proposé par JulioDelphi peut s'avérer plus efficace.
<hr size="2" width="100%" />unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormCreate(Sender: TObject);
  private
    { Déclarations privées }
    bCtrlWasPressed: Boolean;
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (ssCtrl in Shift) and (not bCtrlWasPressed) then
  begin
    memo1.Lines.Add('Touche ctrl appuyée');
    bCtrlWasPressed:= True;
  end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (not (ssCtrl in Shift)) and (bCtrlWasPressed) then
  begin
    memo1.Lines.Add('Touche ctrl relachée');
    bCtrlWasPressed:= False;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  memo1.ReadOnly:= True;
  KeyPreview:= True;
end;

end.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_rt15
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 1 déc. 2008 à 09:19
0
Utile
Bonjour,

Sur ta form, passe la propriété KeyPreview à true. Ça permet d'intercepter toutes les touches pressées. Ensuite, tu n'as plus qu'à gérer le OnKeyDown de ta form.

En espérant que ça répondra à ta demande

Simon
Commenter la réponse de sp40
JulioDelphi 2354 Messages postés dimanche 5 octobre 2003Date d'inscription 18 novembre 2010 Dernière intervention - 1 déc. 2008 à 09:35
0
Utile
Si tu dois connaitre le statut d'une touche sans que ton programme sois en focus ou visible, il te faudra passer par un HOOK.
Commenter la réponse de JulioDelphi
impossibleok 55 Messages postés lundi 27 mars 2006Date d'inscription 26 juin 2009 Dernière intervention - 1 déc. 2008 à 09:57
0
Utile
la propriété KeyPreview de la form est à true
mais le code si dessous ne repond pas !!!

procedure TForm16.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (GetKeyState(VK_CONTROL) = 1) then
DBGrid1.Options := DBGrid1.Options + [dgMultiSelect];
end;

???
Commenter la réponse de impossibleok
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 1 déc. 2008 à 13:52
0
Utile
Salut,

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;

  Shift: TShiftState);

begin
   if ssCtrl in Shift then
    ShowMessage('Kikoo !');

end;
Commenter la réponse de cs_rt15
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 1 déc. 2008 à 14:12
0
Utile
L'inconvénient de ma méthode par rapport à celle de Julio, c'est qu'il te faut également penser à gérer le onKeyUp pour enlever l'option MultiSelect quand tu relâche Ctrl... Celle de Julio est plus juste mais plus dure à piger aussi...

Simon
Commenter la réponse de sp40
impossibleok 55 Messages postés lundi 27 mars 2006Date d'inscription 26 juin 2009 Dernière intervention - 1 déc. 2008 à 16:36
0
Utile
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if ssCtrl in Shift then
DBGrid1.Options := DBGrid1.Options + [dgMultiSelect];
end;


quelle est la procedure qui fait le contraire quand on relache la touche CTRL ???
DBGrid1.Options := DBGrid1.Options - [dgMultiSelect];
Commenter la réponse de impossibleok
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 1 déc. 2008 à 17:41
0
Utile
Eh, faut lire !!!
OnKeyUp

Simon
Commenter la réponse de sp40
impossibleok 55 Messages postés lundi 27 mars 2006Date d'inscription 26 juin 2009 Dernière intervention - 1 déc. 2008 à 22:44
0
Utile
OnKeyUp !!!
mais comment peut on savoir que c'est la touche CTRL qui a été relaché et pas une autre???
Commenter la réponse de impossibleok
impossibleok 55 Messages postés lundi 27 mars 2006Date d'inscription 26 juin 2009 Dernière intervention - 2 déc. 2008 à 13:40
0
Utile
bCtrlWasPressed ???
ça passe en delphi 5 pro ???
Commenter la réponse de impossibleok
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 2 déc. 2008 à 13:48
0
Utile
Ce n'est pas une variable proposée par Delphi ! C'est un membre de classe que j'ai ajouté à ma Form.
<hr size="2" width="100%" />
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormCreate(Sender: TObject);
  private
    { Déclarations privées }
    bCtrlWasPressed: Boolean;
  public
    { Déclarations publiques }
  end;
Commenter la réponse de cs_rt15
impossibleok 55 Messages postés lundi 27 mars 2006Date d'inscription 26 juin 2009 Dernière intervention - 2 déc. 2008 à 14:48
0
Utile
bin! j'ai mal pigé!
sinon ça m'a ete d'une grande utilité. merci.

j'ai méme usé de cette var: bCtrlWasPressed dans les clics sur dbgrid1, histoire de desactiver le multiselect si (not bCtrlWasPressed) ce qui fait discparaitre l'effet de deux lignes selectionnées apres le scroll avec gestion de la molette biensur.

merci encor une fois.
Commenter la réponse de impossibleok
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 2 déc. 2008 à 15:44
0
Utile
Et n'oublie pas de cliquer sur "Réponse acceptée", ça peut servir à d'autres...

Simon
Commenter la réponse de sp40
impossibleok 55 Messages postés lundi 27 mars 2006Date d'inscription 26 juin 2009 Dernière intervention - 2 déc. 2008 à 19:42
0
Utile
sans faute! je l'ai deja fait.
@+
Commenter la réponse de impossibleok
eole15 12 Messages postés lundi 29 décembre 2008Date d'inscription 18 février 2009 Dernière intervention - 2 janv. 2009 à 17:39
0
Utile
bonjour a tous malgres vos post je n'arrive pas a faire que lorsque j'appuie sur la touche echap cela ferme mon application...je suis vraiment un noob donc un petit coup de main serais pas de refus...
En fait mon probleme est que je ne suis pas sur si mon programme vois ce qui se passe sur mon clavier, pourtant j'ai bein mis KeyPreview := true dans ma fiche est egalement dans ma partie conception...j'ai egalement creer une var Key : word dans une procedure...
Je ne sais pas si je me suis fait bien comprendre, en tout cas merci a ceux qui me donne un petit coup de main.
Mon adresse msn :)
[mailto:eole15@live.fr eole15@live.fr]

EoLe15
Commenter la réponse de eole15
eole15 12 Messages postés lundi 29 décembre 2008Date d'inscription 18 février 2009 Dernière intervention - 2 janv. 2009 à 17:54
0
Utile
dsl du double post mais voici mon programme pourriez-vous me dire ce qui va pas?

unit fin_programme_by_VV;


interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls ;


type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure Formkeydown(Sender : TObject ; var Key : Word; Shift: TShiftState);


  private
    { Déclarations privées }
    escape : boolean;
  public
    { Déclarations publiques }
  end;


var
  Form1 : TForm1;
  escape : boolean;




implementation


{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
    begin;
      KeyPreview := true;
      escape := false;
    end;


 


procedure TForm1.FormKeyDown(Sender : TObject ; var Key : word ; Shift: TShiftState);
begin
 while (escape <> true ) do
 begin
  ShowMessage('Ca marche?');
              if (Key = VK_ESCAPE) then
               begin
                escape := true;
               end
 end;
 Application.Terminate;
end;


end.

EoLe15
Commenter la réponse de eole15
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 3 janv. 2009 à 11:17
0
Utile
Bonjour,

Là, j'ai l'impression que quelle que soit la touche que tu appuies, ton programme se ferme, non ? (Le "Application.Terminate" est mal placé)

Je ne pense pas que tu aies besoin de ta variable "escape". Il te suffit juste de gérer le OnKeyDown de ta form avec un truc genre :
procedure TForm1.FormKeyDown(Sender : TObject ; var Key : word ; Shift: TShiftState);
begin
     if Key = VK_ESCAPE
       then Application.Terminate;
end;
Ça devrait marcher...

Simon
Commenter la réponse de sp40
eole15 12 Messages postés lundi 29 décembre 2008Date d'inscription 18 février 2009 Dernière intervention - 3 janv. 2009 à 22:42
0
Utile
Merci de ton aide mais justement malgre les touches que j'utilise il ne se ferme pas on dirais qu'il ne sais pas que j'appuie sur une touche ...d'ou mon probleme...

EoLe15
Commenter la réponse de eole15
eole15 12 Messages postés lundi 29 décembre 2008Date d'inscription 18 février 2009 Dernière intervention - 3 janv. 2009 à 22:42
0
Utile
Merci de ton aide mais justement malgre les touches que j'utilise il ne se ferme pas on dirais qu'il ne sais pas que j'appuie sur une touche ...d'ou mon probleme...

EoLe15
Commenter la réponse de eole15

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.