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;
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;
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.
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;
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...
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];
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;
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.
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]
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;
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...
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...
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...