Timer [Résolu]

Signaler
Messages postés
6
Date d'inscription
mardi 13 janvier 2009
Statut
Membre
Dernière intervention
26 février 2009
-
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
-
Bonjour,

je suis étudiant en première année de DUT Informatique, et je n'arrive pas à faire un exercice qui consiste à créer un Timer... Voici l'énoncé :

"Le temps de départ est fixé par le programmerur. Tant que l'utilisateur n'a pas appuyé sur le bouton Fin, le chronomètre avance.
  Il faut utiliser 3 variables globales (heures, minutes,secondes)."

Et voici ce que j'ai fait :

procedure Tchrono.TimerTimer(Sender: TObject);
var
  i,secondes,minutes,heures: integer;
begin
secondes:=00;
minutes:=00;
heures:=00;
for i:=01 to 3600 do
 secondes:=secondes+01;
 if secondes>59 then
  begin
   secondes:=00;
   minutes:=minutes+01;
   if minutes>59 then
    begin
      minutes:=00;
      heures:=heures+01;
    end;
  end;
  secondes1.caption:=inttostr(secondes);
  minutes1.caption:=inttostr(minutes);
  heures1.caption:=inttostr(heures);
end;
end.

Pouvez-vous me dire où cela coince svp ? et m'indiquer la direction à prendre ? merci bien !

6 réponses

Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
Salut,

Tout est dans l'énoncé :
« Il faut utiliser 3 variables globales ...»

Ca coince parce que tu initialises à zéro tes variables toutes les secondes.
Ensuite, c'est pareil avec ta boucle. Demande-toi à quoi elle sert car elle est parcourue toutes les secondes aussi...

Allez! On te laisse chercher un peu! 
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
unit Unit3;

interface

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

type
  TForm3 = class(TForm)
    Timer1: TTimer;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

var
  Heure   : integer = 0;
  Minute  : integer = 0;
  Seconde : integer = 0;
  TickPrec: cardinal;

procedure TForm3.Button1Click(Sender: TObject);
begin
  Heure := 0;
  Minute := 0;
  Seconde := 0;
  TickPrec := GetTickCount;
  Timer1.Enabled := true;
end;

procedure TForm3.Button2Click(Sender: TObject);
begin
  Timer1.Enabled := false;
end;

procedure TForm3.Timer1Timer(Sender: TObject);
begin
  if (GetTickCount-TickPrec) < 1000 then
    exit;
  TickPrec := GetTickCount;

  Seconde := (Seconde + 1) mod 60;
  if Seconde = 0 then
  begin
    Minute := (Minute + 1) mod 60;
    if Minute = 0 then
      Heure := Heure + 1;
  end;

  Label1.Caption := format('%.2d:%.2d:%.2d',[Heure, Minute, Seconde]);
end;

end.

<hr size="2" width="100%" />
Messages postés
6
Date d'inscription
mardi 13 janvier 2009
Statut
Membre
Dernière intervention
26 février 2009

Merci pour ta réponse cela m'a un peu aidé! Maintenant je ne sais pas comment faire car je pense qu'il ne fait qu'une seule fois l'évènement OnTimer et je ne sais pas comment faire pour lui dire de recommencer....
Si quelqu'un pourrait m'expliquer svp ?

Merci beaucoup pour votre aide
Messages postés
6
Date d'inscription
mardi 13 janvier 2009
Statut
Membre
Dernière intervention
26 février 2009

Merci bcp!
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
... Et c'est pas un chrono homologué J.O. de Beijing... 

    Juste un Timer pour les oeufs à la coque, ok?
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
ha, Foxi nous as fait un très bonne réponse.

Y a just le GetTickCount  qui me chiffone...
#1 : la diff avec 1000 est perdu. ce qui fait que si le timer est appelé tout les 995[ms] tu vas perdre la moitié des secondes... (rapplons que GetTickCount a une résolution de ~16ms)
et si il est appelé tout les 1100[ms] tu vas prendre un retard de 100ms par sec.
 -> faudrait garder la diff restante et la soustraire de TickPrec dans le test.
#2 : pour la version homologué, faudrait utiliser une var local pour au lieu d'appeler deux fois GetTickCount. 
#3 : aussi  l'avance (hmi) peut-être un peu reatrdée (en fct de la fréquence du timer)

je me demande seulement si dbzpunkrocker pourra expliquer à son prof "comment et pourquoi".

Enfin, c'est une bonne occas pour apprendre...

Loda
 
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.