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 :

Gauge qui avance en fonction d'un Timer


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Par défaut Gauge qui avance en fonction d'un Timer
    Bonjour

    J'aimerai faire une feuille qui force l'utilisateur à attendre une durée définie par lui, en montrant la progression de l'attente.
    La variable Attendu correspond au temps déjà écoulé en minutes depuis le début du traitement (avant que la feuille d'attente passe en ShowModal).
    La variable IntervalleUser correspond au temps d'attente en minutes entré par l'utilisateur (au tout début).

    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
    var
      FormAttente: TFormAttente;
      Tmp : real ;
      TpsEcoule : real ;
    
    procedure TFormAttente.FormActivate(Sender: TObject);
    begin
      G_TpsRestant.Progress := trunc(Unit1.Attendu*100/Unit1.IntervalleUser) ;
      TpsRestant.Caption := FloatToStr(Unit1.IntervalleEnvoi-Unit1.Attendu) ;
      Tmp := 0 ;
      Timer_DelaiEntr.Interval := 5000 ;
      Timer_DelaiEntr.Enabled := true ;
    end;
    
    procedure TFormAttente.FormDeactivate(Sender: TObject);
    begin
      Timer_DelaiEntr.Enabled := false ;
    end;
    
    procedure TFormAttente.Timer_DelaiEntrTimer(Sender: TObject);
    begin
      if G_TpsRestant.PercentDone < 100 then
         begin
          //Compteur du temps écoulé en % de la duree totale en min
          G_TpsRestant.AddProgress(trunc((Timer_DelaiEntr.Interval/60000)*100/Unit1.IntervalleUser)) ;
          if tmp >=30 then
             begin
                //Temps restant en min
                TpsRestant.Caption := FloatToStr(StrToFloat(TpsRestant.Caption)-0.5) ;
                tmp := 0 ;
             end
             else
             begin
                //Compteur du temps écoulé en s
                tmp := tmp+(Timer_DelaiEntr.Interval/1000) ;
             end ;
          if G_TpsRestant.PercentDone = 100 then FormAttente.close ;
         end
         else
         begin
             FormAttente.close ;
         end ;
    end;
    
    procedure TFormAttente.FormClose(Sender: TObject;
      var Action: TCloseAction);
    begin
      FormAttente.ModalResult := mrOK ;
    end;
    C'est ce qui est en rouge qui pose problème.
    Cela donne une valeur en minute. Du coup tres proche de 0. AddProgress n'accepte que des entiers. Donc il faut arrondir... Mais là trunc renvoie 0...
    Du coup la barre n'avance pas.

    Est-ce que quelqu'un aurait une idée?? Merci d'avance!

  2. #2
    Membre éprouvé
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Par défaut
    Et si tu changeais la durée du timer et que tu le fesait 'tic' qu'une fois par minute ? Alors dans le OnTimer tu fais progresser de '1' la progressbar.

    Et ton progressbar.Max tu le définie au nombre de minutes d'attente demandé.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Par défaut
    Et si tu changeais la durée du timer et que tu le fesais 'tic' qu'une fois par minute ?
    Oui, c'est ce que je me disais mais pour l'utilisateur, l'avance 1 fois par minutes ca risque de lui paraitre treeeeeeees long!
    Bon au pire ca pourrait se faire (tant pis pour lui!! ), sauf que si il s'amuse à rentrer une durée longue (genre 300 minutes) le problème se pose à nouveau.
    Dans l'absolu, le temps d'attente ici pourrait aller facilement à 2 ou 3h. C'est pas dit que ca ne monte pas jusqu'à 5h...

    Et ton progressbar.Max tu le définie au nombre de minutes d'attente demandé.
    Ca aussi ca pourrait être pas mal, mais les % ne ressembleront plus à rien?
    Si l'utilisateur demande 60 minutes d'attente, la fin de la barre sera à 60% ?

    On peut pas enlever le % d'ailleurs??

    merci de ton aide!

  4. #4
    Membre éprouvé
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Par défaut
    Citation Envoyé par Alyx²
    Oui, c'est ce que je me disais mais pour l'utilisateur, l'avance 1 fois par minutes ca risque de lui paraitre treeeeeeees long!
    Bon au pire ca pourrait se faire (tant pis pour lui!! ), sauf que si il s'amuse à rentrer une durée longue (genre 300 minutes) le problème se pose à nouveau.
    Dans l'absolu, le temps d'attente ici pourrait aller facilement à 2 ou 3h. C'est pas dit que ca ne monte pas jusqu'à 5h...


    Ca aussi ca pourrait être pas mal, mais les % ne ressembleront plus à rien?
    Si l'utilisateur demande 60 minutes d'attente, la fin de la barre sera à 60% ?

    On peut pas enlever le % d'ailleurs??

    merci de ton aide!
    Dans ce cas tu calcule la longeur de la barre à nb de minutes * 60 et tu fait 'tic' ton timer tous les secondes et tu fais progresser de 1 à chaque tic

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Par défaut
    tu veux dire que tu mettrais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    barre.width := IntervalleUser*60
    ?

  6. #6
    Membre éprouvé
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Par défaut
    non,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Barre.MaxValue := IntervalleUser*60;

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Par défaut
    S'il y en a que ca intéresse un jour.
    Voici le code final :

    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
    var
      FormAttente: TFormAttente;
      Tmp : real ;
      TpsEcoule : real ;
    
    procedure TFormAttente.FormActivate(Sender: TObject);
    begin
      //Passage de toutes les valeurs en secondes
      G_TpsRestant.MinValue := 0 ;
      G_TpsRestant.MaxValue := IntervalleUser*60 ;
      G_TpsRestant.Progress := Trunc(Attendu*60) ;
      //Initialisations  
      TpsRestant.Caption := FloatToStr(Unit1.IntervalleUser-Unit1.Attendu) ;
      Tmp := 0 ;
      Timer_DelaiEntr.Interval := 1000 ;
      Timer_DelaiEntr.Enabled := true ;
    end;
    
    procedure TFormAttente.FormDeactivate(Sender: TObject);
    begin
      Timer_DelaiEntr.Enabled := false ;
    end;
    
    procedure TFormAttente.Timer_DelaiEntrTimer(Sender: TObject);
    begin
      if G_TpsRestant.PercentDone < 100 then
         begin
          //Compteur du % de temps écoulé (gauge)
          G_TpsRestant.AddProgress(trunc(Timer_DelaiEntr.Interval/1000)) ;
    
          if tmp >=30 then
             begin
                //Temps restant en min
                TpsRestant.Caption := FloatToStr(StrToFloat(TpsRestant.Caption)-0.5) ;
                tmp := 0 ;
             end
             else
             begin
                //Compteur du temps écoulé en s
                tmp := tmp+(Timer_DelaiEntr.Interval/1000) ;
             end ;
          if G_TpsRestant.PercentDone >= 100 then FormAttente.close ;
         end
         else
         begin
             FormAttente.close ;
             Form1.FocusControl(Form1.Button1) ;
         end ;
    end;
    
    procedure TFormAttente.FormClose(Sender: TObject;
      var Action: TCloseAction);
    begin
      FormAttente.ModalResult := mrOK ;
    end;

  8. #8
    Membre confirmé Avatar de djeckelle
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2004
    Messages : 87
    Par défaut
    Bonjour,

    Merci cela m'a été très utile.

    Bye

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction qui cache en fonction d'une selection de liste
    Par AlphonseBrown dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 20/03/2006, 20h53
  2. JProgressbar qui avance depuis une autre classe....
    Par Baptiste Wicht dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 02/02/2006, 21h04
  3. Réponses: 6
    Dernier message: 16/01/2006, 16h24
  4. graphique qui varie en fonction d'une combo box
    Par decour dans le forum Access
    Réponses: 2
    Dernier message: 13/10/2005, 14h52
  5. Variable qui évolue en fonction des choix dans formulaire
    Par stefou007 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/09/2005, 23h40

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