IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Comparer des ProgressBar et du "temps"


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 67
    Par défaut Comparer des ProgressBar et du "temps"
    Salut à tous me revoilà pour un nouveau défi .

    Voilà mon pgm :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    procedure TForm1.Timer3Timer(Sender: TObject);
    var c, e : integer;
     
    begin
    randomize;
    offset:=+1;
    ProgressBar3.Min:=0;
    ProgressBar3.Max:=10000;
    Timer3.Interval:=50;
     
    c:=ProgressBar3.Position + random(250) + 1;
    ProgressBar3.Position :=c;
     
    CurrentTime:=IncMillisecond(currentTime, Timer3.Interval);
    Label3.Caption:=FormatDateTime('ss:zzz', CurrentTime);
    e:=ProgressBar3.Position + offset;
    If ProgressBar3.Position = ProgressBar3.Max then Timer3.Enabled :=False;
     
    end;
     
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    var a, c : integer;
     
    begin
     
    randomize;
    offset:=+1;
    ProgressBar1.Min:=0;
    ProgressBar1.Max:=10000;
    Timer1.Interval:=50;
     
    a:=ProgressBar1.Position + random(250) + 1;
    ProgressBar1.Position :=a;
     
    CurrentTime:=IncMillisecond(currentTime, Timer1.Interval);
    Label1.Caption:=FormatDateTime('ss:zzz', CurrentTime);
     
    c:=ProgressBar1.Position + offset;
    If ProgressBar1.Position = ProgressBar1.Max then Timer1.Enabled :=False;
     
    end;
     
     
    procedure TForm1.Timer2Timer(Sender: TObject);
    var b, d : integer;
     
    begin
    randomize;
    offset:=+1;
    ProgressBar2.Min:=0;
    ProgressBar2.Max:=10000;
    Timer2.Interval:=50;
     
    b:=ProgressBar2.Position + random(250) + 1;
    ProgressBar2.Position :=b;
     
    CurrentTime:=IncMillisecond(currentTime, Timer2.Interval);
    Label2.Caption:=FormatDateTime('ss:zzz', CurrentTime);
    d:=ProgressBar2.Position + offset;
    If ProgressBar2.Position = ProgressBar2.Max then Timer2.Enabled :=False;
     
    end;
    Ca c'est ma dernière modification car avant il tourné tout aussi bien mais j'ai essayé autre chose (celui là quoi) et cela marche.

    Donc j'explique le truc j'ai trois ProgressBar 3 Labels et 3 Timer. A la compilation j'ai mes trois ProgressBar qui se lance ainsi que les timer qui m'affiche le temps dans les Labels. mon but serait de créer un Memo pour m'afficher le temps du vainqueur puis du second puis du troisième.

    Or je ne sais comment m'y prendre j'ai essayé avec des comparaisons mais...

    Donc si vous aviez une idée je vous en remercierait.

    P.S : Mais trois ProgressBar, comme vous pouvez le constaté sont identiques (niveau du code) mais je trouve que les écarts de temps final sont faibles à chasue fois et sont tout le temps les même (5/100 de secondes) toujours la 1 puis la 2 puis la 3 qui gagne. Une idée à ce sujet? Merci d'avance++.

    Edit : Je poste ici car je crois que je me suis planté de forum. (Delhpi.net avant).

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bonjour,
    Si tu regardes l'aide Delphi sur la procédure randomize :
    Ne combinez pas l'appel à Randomize dans une boucle avec les appels à la fonction Random. Normalement, Randomize n'est appelée qu'une seule fois, avant tout appel à Random.
    Ton appel à randomize ne doit pas se trouver dans les timer mais plutôt à l'entrée de ton application (ou une fois, au lancement de la course). Tu verras que les écarts sont déjà plus significatifs.
    Maintenant pour savoir qui arrive le premier, tu peux utiliser la fonction CompareDate.
    Bonne course
    Eb.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 67
    Par défaut
    Ok pour les randomize la je vois des écrats ok. Par contre pour la fonction CompareDate c'est à moi de la trouver ou c'est un objet qui existe?

    Moi en fait j'aurais aimé faire en gros ceci dans une procédure associé à un bouton et en fin de course pour :

    If ProgressBar1.Postion > ProgressBar2.Postion then Memo1.Lines.add('La 1 a gangné'); etc etc mais déjà j'ai trois bars donc les comparaisons sont difficiles et voilà quoi.

    Je suis ouvert à d'autres réponses merci.

    Merci à toi ebastien.

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Et pourquoi ne fais-tu pas une procédure appelée dans chacun des timers en fin de course du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Arrivee(Sender : TProgressBar);
    begin
      if Memo1.Lines.Count = 0 then
        Memo1.Lines.Add(Sender.Name + ' a gagné')
      else
        Memo1.lines.Add(IntToStr(Memo1.Lines.Count + 1) + ' : ' + Sender.Name);
    end;
    Et tu l'appelles là pour la ProgressBar1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    var a, c : integer;
    begin
      ...
      ...
      If ProgressBar1.Position = ProgressBar1.Max then
      begin
        Timer1.Enabled :=False;
        Arrivee(ProgressBar1);
      end;
    et tu fais pareil pour les autres ...
    Concernant la fonction CompareDate, autant pour moi, c'est CompareDateTime qu'il faut utiliser. C'est une fonction de l'unité DateUtils qui te permet de comparer deux TDateTime (Aide Delphi).

    Maintenant, est-ce que tu fais ça pour t'amuser ou bien as-tu un but précis ?Parce qu'il faut savoir que les timers ne sont peut-être pas ce qu'il y a de mieux pour faire ce genre de truc. Il faut savoir que le code exécuté dans un timer "bloque" le temps écoulé pour les autres (mets un sleep(2000) dans la procédure Arrivee pour voir). 3 threads seraient peut-être plus appropriés pour ce que tu veux faire .... M'enfin, si le but n'est pas autre chose que ce que tu décris ... va pour les timers ...
    Eb.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 67
    Par défaut
    C'est un cours de conception de logiciels mais le prof est assez ouvert donc sa ou autre chose... je vais voir ce que tu m'as dit merci encore. Je repasserais.

    Dans la procédure Arrivée, la variable Arrivée tu la déclare comment un integer?
    Je vois pas trop non plus que fais Memo.Lines.Count?

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut Balises CODE
    Bonjour,

    A votre place je ne me servirais absolument pas du timer pour chronométrer un truc (ce n'est ni précis, ni fiable) mais plutôt d'un object que l'on peut décliner ensuite sous la forme d'autant de variables que l'on souhaite avoir de chronomètres.

    Exemple de code si l'on se contente d'une précision de l'ordre d'une milliseconde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    type
    oChrono = object 
      TopDepart,Duree : longWord; 
      procedure Top;
      function  Mis(Format : byte) : string;
      // Format=1 renvoie par ex 12h 15m 4s 45ms
      // Format=2 renvoie        12:15:04:045
      // Format=3 renvoie        44104045 ms
    end;
     
    var      monChrono1,monChrono2,monChrono3 : oChrono;
     
    procedure oChrono.Top; // procédure à appeler à l'endroit du code où l'on veut déclencher le Top-Départ
    begin
      TopDepart:=GetTickCount;
    end;
     
    function  oChrono.Mis(Format : byte) : String; // Fonction à appeler à l'endroit du code qui marque la fin du truc à chronémétrer et pour afficher le temps écoulé 
    var       msp,he,mi,se,ms : longWord; s : string; t : shortString;
     
              function calibre(t : shortString; n : byte) : shortString;
              begin
      while length(t)<n do t:='0'+t;
        calibre:=t;
              end;
     
    begin
      Duree:= GetTickCount-TopDepart; // millisecondes passées
      //Duree:=12*60*60*1000 + 15*60*1000 + 4*1000 + 45; //12h 15m 4s 45ms
      msp:=Duree;
      ms:= msp mod 1000; msp:= msp div 1000;
      se:= msp mod 60;   msp:= msp div 60;
      mi:= msp mod 60;   msp:= msp div 60;
      he:= msp mod 60;   s:='';
      if Duree<=1000 then Format:=3;
      case format of
        1 : begin
               if he<>0 then s:=s+intToStr(he)+'h ';
               if mi<>0 then s:=s+intToStr(mi)+'m ';
               if se<>0 then s:=s+intToStr(se)+'s ';
               s:=s+intToStr(ms)+'ms';
             end;
        2 : begin
               t:=intToStr(he); s:=s+t+':'; //12:15:04:045
               t:=intToStr(mi); t:=calibre(t,2); s:=s+t+':';
               t:=intToStr(se); t:=calibre(t,2); s:=s+t+':';
               t:=intToStr(ms); t:=calibre(t,3); s:=s+t;
             end;
        3 : s:=intToStr(Duree)+' ms';
      end;
      Mis:=s;
    end;
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Re-Bonjour,

    Dans mon message précédent la mise en page s'est modifiée de façon inattendue ce qui perturbe la lisibilité.

    Pour mieux piger je dois préciser que la fonction nommée calibre est une sous-fonction-locale interne à la fonction nommée oChrono.Mis.

    Excuses.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Re-bonjour

    Merci beaucoup Pedro-Modérateur-Delphi pour les "balises CODE".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Promis, je ne recommencerai plus
    .
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  9. #9
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Je suis d'accord ! Comme je l'ai dit aussi, le timer n'est pas trop indiqué pour faire ce genre de truc. L'idéal étant un système multi-threads avec des chronos dignes de ce nom comme celui de Gilbert Geyer.
    Ce que j'ai indiqué c'est seulement pour ne pas tout chambouler dans l'idée de A0080.

Discussions similaires

  1. Comparer des ProgressBar et du "temps"
    Par A0080 dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 15/03/2007, 10h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo