Comment obtenir le temps de pression d'un bouton qu'on maintient enfoncé ?

korf Messages postés 5 Date d'inscription samedi 24 septembre 2005 Statut Membre Dernière intervention 31 décembre 2005 - 26 déc. 2005 à 03:06
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 1 janv. 2006 à 02:40
bonjour à vous nombreux delphistes, je suis un newbie en delphi et la solution à mon problème est certainement très simple mais j'ai vraiment besoin de savoir faire ça pour réaliser mon projet. Merci de votre aide

www.korf.c.la

12 réponses

moldov Messages postés 165 Date d'inscription mercredi 8 octobre 2003 Statut Membre Dernière intervention 10 novembre 2008
26 déc. 2005 à 11:15
Salut,

Grace aux evenements OnMouseDown et OnMouse Up.
Tu peux par exemple recupérer l'heure en milliseconde lorsque que l'evenement OnMouseDown a lieu et recupérer l'heure lorsque que l'evenement OnMouseUp intervient et en Faisant la différence des deux temps, tu recupère le temps d'appui du bouton.

Bonne Prog
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
27 déc. 2005 à 22:22
un exemple :

var PressTime : cardinal;

procedure TForm1.Button1MouseDown();

begin

PressTime := GetTickCount;

end;

procedure TForm1.Button1MouseUp();

begin

PressTime := GetTickCount - PressTime;

end;

procedure Tform1.Button1Click();
begin
Button1.Caption := format('%d ms',[PressTime]);
end;

<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
28 déc. 2005 à 00:04
Salut,



Il me semble, sauf erreur, que GetTickCount se produit tout au long de Button1MouseDown, ce qui fausse le calcul, lol...



Solution vite fait :



var StartTime: DWord;

StopCount: Boolean;



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

Shift: TShiftState);

begin

if not StopCount then

begin

StartTime := GetTickCount;

StopCount := True;

end;

Label1.Caption := '';

end;



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

Shift: TShiftState);

var ElapsedTime: DWord;

begin

if StopCount then

begin

ElapsedTime := (GetTickCount - StartTime);

Label1.Caption :=

Format('La touche a été pressée pendant %d milliseconde(s)', [ElapsedTime]);

StopCount := False;

end;

end;



Mais à mon avis, il doit être possible de faire mieux, ça me plait pas trop...



Bonne prog'



japee
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
28 déc. 2005 à 00:10
Désolé, j'avais sans doute mal compris la question.

Ce qui semble vrai pour FormKeyDown ne l'est pas pour FormMouseDown...

Les solutions de fOxi et de moldov restent donc tout à fait valables !



Bonne prog'



japee
0

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

Posez votre question
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
28 déc. 2005 à 17:15
non non, tu as raison japee! il faut controler un minimum.
voici donc une version fonctionnelle :

var
presstime : cardinal = 0;
clicktime : boolean = false;

implementation

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ClickTime = false then begin
presstime := GetTickCount;
ClickTime := true;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if ClickTime then begin
presstime := GetTickCount - presstime;
button1.Caption := format('%d ms',[presstime]);
ClickTime := false;
end;
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
// MouseUp intervient aprés MouseClick
// Si la souris est relachée en dehors du boutton
// on renvois 0. en sachant qu'il est humainement
// impossible de faire un temps de 0ms de click
// nous avons testé, il y'a ~15ms minimum de reaction
if ClickTime then begin
PressTime := 0;
button1.Caption := format('%d ms',[presstime]);
ClickTime := false;
end;
end;

end.

<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
0
korf Messages postés 5 Date d'inscription samedi 24 septembre 2005 Statut Membre Dernière intervention 31 décembre 2005
29 déc. 2005 à 03:54
Merci beaucoup ça marche impec
(bon maintenant dans mon prog j'ai un blem de rafraichissement d'image (ça clignote quand je déplace un Timage dans une boucle Timer) et pi j'arrive pas a charger des gifs avec un effet transparence mais tout ça c'est une autre histoire ..

www.korf.c.la
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
29 déc. 2005 à 22:14
Marrant, j'aurais mis un code dans mouseDown du genre

var TimeElapsed:cardinal;

begin
TimeElapsed := GetTickCount;
while (ssleft in Shift) repeat Application.ProcessMessage ;
TimeElapsed:=TimeElapsed - GetTickCount;
end;

Quelque chose dans le genre quoi...
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
30 déc. 2005 à 01:40
Salut,
pour le clignotement de l'image ajoute un
DoubleBuffered := True;
dans l'évènement OnCreate de ta Form



@+
Cirec
0
korf Messages postés 5 Date d'inscription samedi 24 septembre 2005 Statut Membre Dernière intervention 31 décembre 2005
31 déc. 2005 à 17:37
YYYYYEES merci!! (clignotement disparu la ligne de code magique DoubleBuffered := True; est parfaite!)

www.korf.c.la
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
31 déc. 2005 à 17:53
ok, ça me fait plaisir mais le spécialiste du DoubleBuffered c'est Japee (c'est grace à lui que je connais cette astuce) il faut rendre Caesar ce qui lui appartient



Je vous souhaite à toutes et à tous une bonne fin d'année 2005 et un bon début pour l'année 2006


Et pour éviter ce genre de désagrément il faut boire avec modération



@+
Cirec
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
31 déc. 2005 à 23:55
Ouaip...

Dès que je vois un DoubleBuffered à placer quelque part, je peux pas résister, c'est plus fort que moi...



Bonne année 2006 à toi aussi, Cirec, et bonne
année à toutes et à tous, vu l'heure, j'va p'têt ben être le premier à
dégainer, lol



japee
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
1 janv. 2006 à 02:40
Pourquoi s'en priver c'est tellement mieux avec

ben moi vu l'heure, je serais pas le dernier sur ce je vous souhaite à toutes et à tous une
Bonne et heureuse année 2006 et une bonne santé et beaucoup de codes sources utiles et inventifs.

Bonne nuit
@+
Cirec
0