Evenement clavier [Résolu]

Signaler
Messages postés
54
Date d'inscription
lundi 27 mars 2006
Statut
Membre
Dernière intervention
26 juin 2009
-
Messages postés
12
Date d'inscription
lundi 29 décembre 2008
Statut
Membre
Dernière intervention
18 février 2009
-
bjr;
comment peut on savoir que la touche "Ctrl" est enfoncée?
merci.

19 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
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.
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
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
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
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.
Messages postés
54
Date d'inscription
lundi 27 mars 2006
Statut
Membre
Dernière intervention
26 juin 2009

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;

???
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Salut,

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

  Shift: TShiftState);

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

end;
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
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
Messages postés
54
Date d'inscription
lundi 27 mars 2006
Statut
Membre
Dernière intervention
26 juin 2009

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];
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
Eh, faut lire !!!
OnKeyUp

Simon
Messages postés
54
Date d'inscription
lundi 27 mars 2006
Statut
Membre
Dernière intervention
26 juin 2009

OnKeyUp !!!
mais comment peut on savoir que c'est la touche CTRL qui a été relaché et pas une autre???
Messages postés
54
Date d'inscription
lundi 27 mars 2006
Statut
Membre
Dernière intervention
26 juin 2009

bCtrlWasPressed ???
ça passe en delphi 5 pro ???
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
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;
Messages postés
54
Date d'inscription
lundi 27 mars 2006
Statut
Membre
Dernière intervention
26 juin 2009

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.
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
Et n'oublie pas de cliquer sur "Réponse acceptée", ça peut servir à d'autres...

Simon
Messages postés
54
Date d'inscription
lundi 27 mars 2006
Statut
Membre
Dernière intervention
26 juin 2009

sans faute! je l'ai deja fait.
@+
Messages postés
12
Date d'inscription
lundi 29 décembre 2008
Statut
Membre
Dernière intervention
18 février 2009

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
Messages postés
12
Date d'inscription
lundi 29 décembre 2008
Statut
Membre
Dernière intervention
18 février 2009

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
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
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
Messages postés
12
Date d'inscription
lundi 29 décembre 2008
Statut
Membre
Dernière intervention
18 février 2009

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
Messages postés
12
Date d'inscription
lundi 29 décembre 2008
Statut
Membre
Dernière intervention
18 février 2009

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