Evenement clavier

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

19 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 14
2 déc. 2008 à 09:18
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.
3
sp40 Messages postés 1284 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 13
1 déc. 2008 à 09:19
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
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Modérateur Dernière intervention 18 novembre 2010 14
1 déc. 2008 à 09:35
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.
0
impossibleok Messages postés 54 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 26 juin 2009
1 déc. 2008 à 09:57
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;

???
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 14
1 déc. 2008 à 13:52
Salut,

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

  Shift: TShiftState);

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

end;
0
sp40 Messages postés 1284 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 13
1 déc. 2008 à 14:12
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
0
impossibleok Messages postés 54 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 26 juin 2009
1 déc. 2008 à 16:36
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];
0
sp40 Messages postés 1284 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 13
1 déc. 2008 à 17:41
Eh, faut lire !!!
OnKeyUp

Simon
0
impossibleok Messages postés 54 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 26 juin 2009
1 déc. 2008 à 22:44
OnKeyUp !!!
mais comment peut on savoir que c'est la touche CTRL qui a été relaché et pas une autre???
0
impossibleok Messages postés 54 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 26 juin 2009
2 déc. 2008 à 13:40
bCtrlWasPressed ???
ça passe en delphi 5 pro ???
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 14
2 déc. 2008 à 13:48
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;
0
impossibleok Messages postés 54 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 26 juin 2009
2 déc. 2008 à 14:48
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.
0
sp40 Messages postés 1284 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 13
2 déc. 2008 à 15:44
Et n'oublie pas de cliquer sur "Réponse acceptée", ça peut servir à d'autres...

Simon
0
impossibleok Messages postés 54 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 26 juin 2009
2 déc. 2008 à 19:42
sans faute! je l'ai deja fait.
@+
0
eole15 Messages postés 12 Date d'inscription lundi 29 décembre 2008 Statut Membre Dernière intervention 18 février 2009
2 janv. 2009 à 17:39
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
0
eole15 Messages postés 12 Date d'inscription lundi 29 décembre 2008 Statut Membre Dernière intervention 18 février 2009
2 janv. 2009 à 17:54
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
0
sp40 Messages postés 1284 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 13
3 janv. 2009 à 11:17
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
0
eole15 Messages postés 12 Date d'inscription lundi 29 décembre 2008 Statut Membre Dernière intervention 18 février 2009
3 janv. 2009 à 22:42
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
0
eole15 Messages postés 12 Date d'inscription lundi 29 décembre 2008 Statut Membre Dernière intervention 18 février 2009
3 janv. 2009 à 22:42
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
0