Petit souci d’exécution

Résolu
Signaler
-
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
-
Bonjour !
J'ai un petit souci avec ce code, je voudrais obtenir une sorte de chronomètre(h/m/s)point de départ d'une application censé gérer les postes d'un Cybercafé. Je me suis "comme qui dirait" frotté au composant Ttimer ( mes trois ans passé sans toucher une ligne de code y sont aussi pour quelque chose )

Bref voila le topo



Procedure Onstart;
Begin
 min:=0;
 sec:=0;
 heur:=0;
end;
procedure TForm1.Timer1Timer(Sender: TObject);

//Secondes,minutes,heures
begin
If sec < 59 then
 sec:=sec+1
else
 begin
 sec:=0;
 min:=min+1;
 if min < 59 then
  min :=min+1
 else
  min:=0;
  heur:=heur+1;
 end;

//Changement du caption des labels
Label3.caption:= inttostr(sec);
Label2.caption:= inttostr(min);
Label1.caption:= inttostr (heur);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Timer1.Enabled :=True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.enabled:=false;
end;




Le problème ce situe au moment d’incrémenter la variable min (minutes), au lieu d'ajouter +1 acelle-ci après la 59 eme seconde il me fait +2 et par dessus le marché il incrémente également la variable heure de +1


J'ignore d'où ça peut bien venir et pourtant j'ai essayé pas mal de combines (me connaissant cela doit être un truc tout bête ><)... je sens déjà ma raison vaciller

Merci de votre aide :)

27 réponses

Messages postés
65
Date d'inscription
jeudi 1 septembre 2011
Statut
Membre
Dernière intervention
22 juillet 2014
8
Bonjour,

Tu remplaces avec ce code :

procedure TForm1.Timer1Timer(Sender: TObject);
//Secondes,minutes,heures
begin
  If sec < 59 then
    sec:=sec+1
  else
  begin
    sec:=0;
    if min < 59 then
      min :=min+1
    else
    begin
      min:=0;
      heur:=heur+1;
    end;

  //Changement du caption des labels
  Label3.caption:= inttostr(sec);
  Label2.caption:= inttostr(min);
  Label1.caption:= inttostr (heur);
end;

En fait tu incrémentes ta variable "min" uniquement si elle est inférieure à 59, comme tu l'as fait il l'incrémente deux fois (tu l'incrémentes avant le test < 59, et après)


BinKentsu
Messages postés
265
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
19 juillet 2021
13
salut,
...
if sec < 59 then
  sec := sec+1
else
begin
  sec := 0;
  if min < 59 then
    min := min+1
  else
  begin
    min := 0;
    heur := heur+1;
  end;
end;
...
@+
Messages postés
265
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
19 juillet 2021
13
oups en retard
bon pour info il existe aussi l'unité DateUtils avec IncSecond...
Pour les Format il existe FormatDateTime voir l'aide
Ptit exemple...
var
  Heure : TDateTime;
...
procedure Timer...
  Heure := IncSecond(Heure, 1);
  Label1.Caption := FormatDateTime('hh:nn:ss', Heure);
...
procedure Start...
  Heure := 0;
....
@+
Messages postés
302
Date d'inscription
jeudi 29 septembre 2005
Statut
Membre
Dernière intervention
17 septembre 2013
1
bonjour,

pour moi, ce sera :

var
  h,m,n,s: word;
begin
  DecodeTime(Time,h,m,s,n);
  heure.Caption := IntToStr(h);
  minute.Caption := IntToStr(m);
  seconde.Caption := IntToStr(s);
end;


Pour calculer le temps passé en connexion, tu conserves l'heure de départ dans une variable TDateTime (date_debut). Pour connaître le temps passé pour facturer au client, tu fais heure de fin de connexion (Now) - date_debut : cela te donne une date/heure que tu décodes avec DecodeDate/DecodeTime. Tu obtiens des variables de type word te donnant ce qu'il faut pour calculer ta facturation.

Luc.
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
var
  debut:  TDateTime;

Procedure Onstart;
Begin
 start := Now;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
 heur, min, sec, ms: Word;
begin
DecodeTime(Now - debut, heur, min, sec, ms);
//Changement du caption des labels
Label3.caption:= inttostr(sec);
Label2.caption:= inttostr(min);
Label1.caption:= inttostr (heur);
end;
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
16
'jour,

var
  Start: TTime;

function GetElapsedTime(StartTime, CurrentTime: TTime): string;
begin
  Result := FormatDateTime('tt', CurrentTime - StartTime);
end;

procedure StartCount;
begin
  Start := Now;
  { déclenchement du Timer }
  Form1.Timer1.Enabled := True;
end;


3ème
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
16
heu, avec bien sûr par exemple;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  lblTime.Caption := GetElapsedTime(Start, Now);
end;


déclenché par

procedure TForm1.Button1Click(Sender: TObject);
begin
  StartCount;
end;


c'est plus clair comme ça.
Messages postés
265
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
19 juillet 2021
13
Ben allons y gaiement avec un thread en plus
Trop de choix tu le choix
type

TChThread = class(TThread)
  private
    { Déclarations privées }
    FDep : TDateTime;
  protected
    constructor Create(CreateSuspended: Boolean);
    procedure Execute; override;
    procedure Affichage;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;
  ChThread: TChThread;

implementation

{$R *.dfm}

var
    Stop: boolean = True;

procedure TChThread.Execute;
begin
    while not Terminated do
        Synchronize(Affichage);
end;

procedure TChThread.Affichage;
var
    Heur, Min, Sec, ms: Word;
begin
    DecodeTime(Now - FDep, Heur, Min, Sec, ms);
    Form1.Label4.Caption := FormatDateTime('hh:nn:ss.zzz', Now - FDep);
    Form1.Label3.caption:= IntToStr(Sec);
    Form1.Label2.caption:= IntToStr(Min);
    Form1.Label1.caption:= IntToStr(Heur);
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
    if Assigned(ChThread) then
        if not ChThread.Terminated then
            ChThread.Terminate;
end;

constructor TChThread.Create(CreateSuspended: Boolean);
begin
    inherited Create(CreateSuspended);
    FreeOnTerminate := True;
    FDep := Now;
    Priority := tpNormal;
    if CreateSuspended then
        Resume;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    Stop := not Stop;
    if not Stop then
        ChThread := TChThread.Create(True)
    else
        ChThread.Terminate;
end;

end.
@+
Messages postés
302
Date d'inscription
jeudi 29 septembre 2005
Statut
Membre
Dernière intervention
17 septembre 2013
1
Bonjour,

pour formater, utiliser la fonction SysUtils.Format
a little help here

donc si tu veux 02h 45mn 08sec tu fais :

labelHeure.Caption := Format('%.2d', [variableHeure]);
labelMinute.Caption := Format('%.2d', [variableMinute]);
labelSeconde.Caption := Format('%.2d', [variableSeconde]);


That's all.
Messages postés
302
Date d'inscription
jeudi 29 septembre 2005
Statut
Membre
Dernière intervention
17 septembre 2013
1
re,

le post est parti plus vite que moi...

tu peux aussi formater ainsi :

tempsLabel.Caption := Format('%.2dh %2.dmn %.2dsec', [heures, minutes, secondes]); 


ou ainsi, avec un contrôle sur la validité :

function getTimeString: string;
var
  temps: TDateTime;
begin
  temps := EncodeTime(heure,minutes,secondes,millisecondes);
  // si une des variables contient une valeur erronée, une exception sera lancée
  result := FormatDateTime('hh:mm:ss', temps);  
end;
Messages postés
265
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
19 juillet 2021
13
Salut,
si je pose cette question c'est justement pour savoir si tes variables sont initialisées, car si c'est pas le cas tu auras 0 constamment !
Donc si tu rajoutes OnStart dans Button1Click rien ne change ?
@+
Messages postés
265
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
19 juillet 2021
13
Salut,
pour répondre simplement si la procédure n'est pas lancée une fois dans le programme ben pas initialiser
Donc pour initialiser au démarrage de l'application tes variables, créer des objets etc... plusieurs méthodes
var 
  Form1 : TForm1;
  sec : integer = 0;
  min : integer = 0;
  heur: integer = 0;
  ...

Dans les événements OnCreate,... de la Form
Dans les evenements des boutons etc...
Avec initialization, finalization
Voir l'aide de delphi F1 pour plus d'explications
En fait il faut les initialiser quant ont en a besoin
Pour rendre visible etc les forms il y a Show,Hide,Visible,Enabled...
Il va falloir faire quelques recherches sur le forum car la plupart de tes questions on une réponse
Après pour toutes les autres questions il faut créer de nouveau sujet ce sera beaucoup plus simple de gérer question par question
@+
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
Salut,

Bon à savoir :

- Contrairement aux variables locales, les variables globales sont automatiquement initialisées à zéro, et false pour les Booleans.
Si on désire qu'elles soient initialisées avec une autre valeur, faire ainsi lors de la déclaration :

var
    B : Boolean = true;
    i : Integer = 15;
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
il fallait lire
Procedure Onstart;
Begin
 debut := Now;
end;
Messages postés
302
Date d'inscription
jeudi 29 septembre 2005
Statut
Membre
Dernière intervention
17 septembre 2013
1
@Guillemouze : prem's

Luc
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
@beckerich : t'as pas le droit d'etre plus rapide que moi !
Merci infiniment pour toutes vos réponses
Finalement le pb étais tout simple lol (qu'es qui m'a pris d’incrémenter la variable min deux fois de suite ...) Ralala dure dure la reprise ><
J’étudierais également les les solutions alternatives que vous m'avez proposé avec la plus grande attention (va falloir me mettre au niveau lol)

Maintenant je voudrais que le serveur détecte mon client (ou mes clients ) automatiquement, la détection du client devras aboutir a la création d'une entité (ou objet) au niveau de l'application serveur nommé "poste" (je ne sais pas encre comment aboutir à ce résultat).
Le client devras aussi pouvoir transmettre au serveur les données relatives à la durée de la connexion ( j'ai de très vagues souvenirs quand à l'utilisation des composants Indy) Les données recueillies devront en suite figurer sur l’entité "poste" pour d’éventuels traitements.

Ah ! j'oubliais, j'aimerais formater mes valeurs h,m,s de façons a ce qu'elles s'affichent avec deux chiffres sur le label, par exemple 03:09:04 au lieu de 3:9:4.

Voila, l'idée est là mais je ne sais pas trop par où commencer


Merci encore :)
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
16
"Ah ! j'oubliais, j'aimerais formater mes valeurs h,m,s de façons a ce qu'elles s'affichent avec deux chiffres sur le label, par exemple 03:09:04 au lieu de 3:9:4."
Ben... voir ma réponse (FormatDateTime)...
Merci pour ta réponse


Je viens d'essayer d’intégrer FormatDateTime à mon code, je n'arrive toujours pas a obtenir le résultat voulu j'imagine que ni la syntaxe ni le contexte dans lequel je l'ai utilisés ne sont adéquats

Procedure Onstart;
Begin
 min:=0;
 sec:=0;
 heur:=0;
end;
procedure TForm1.Timer1Timer(Sender: TObject);

//Secondes,minutes,heures
begin
If sec < 59 then
 sec:=sec+1
else
 begin
 sec:=0;
 min:=min+1;
 if min < 59 then
  min :=min+1
 else
  begin
  min:=0;
  heur:=heur+1;
  end;
 end;
//Formatage des variables sec,min,heur en format "DateTime"
formatdatetime('ss',sec);
formatdatetime('mm',min);
formatdatetime('hh',heur);

//Changement du caption des labels
Label3.caption:= inttostr(sec);
Label2.caption:= inttostr(min);
Label1.caption:= inttostr (heur);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Timer1.Enabled :=True;
 Button1.enabled:=false;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.enabled:=false;
Button2.enabled:=False;
showmessage('Merci');
//Remise à Zero du compteur
min:=0;
sec:=0;
heur:=0;
//Remise à Zero des Labels
Label1.Caption:='00';
Label2.Caption:='00';
Label3.Caption:='00';
//Reactivation des boutons
button1.enabled:=true;
button2.enabled:=true;

end;


En ce qui concerne les composants Indy je me remet peu a peu dans le bain

Merci encore ^^
J'ai reposté la même erreur que celle que j'ai commise au départ me semble-t-il

Correction*

//Secondes,minutes,heures
begin
If sec < 59 then
 sec:=sec+1
else
 begin
 sec:=0;
 if min < 59 then
  min :=min+1
 else
  begin
  min:=0;
  heur:=heur+1;
  end;
 end;


Voila ! la c'est tout de suite plus clair

Je n'ai toujours pas réussi à formater correctement mes variables même situation que celle évoqué dans mon précédent message


//Changement du caption des labels
Label3.caption:= inttostr(sec);
Label2.caption:= inttostr(min);
Label1.caption:= inttostr (heur);


J'ai commencer à coder tout ce qui est relatif à la tarification et à travailler un peu l'interface, je n'ai pas encore eu le temps de toucher aux composants Indy à mon grand regret ><

Bref, je ne sais pas si je doit ou non ouvrir un autre Topic pour continuer à poser mes questions ?!(et elles sont nombreuses) le problème de départ a serte été résolu mais il reste toutefois beaucoup d'autres questions en suspend


Merci à vous tous ! you guys rox