2009-03-30 9 views
3

J'essaie de faire une barre de progression qui commence à 0%, et prend 5 secondes pour arriver à 100%. La barre de progression commencera à monter dès que Button1 sera cliqué. Aucun conseil? J'ai regardé sur Google, mais cela ne m'a rien donné de bien sur ce genre de chose.Barre de progression Delphi

En outre, à 0%, il devrait y avoir une étiquette qui dit Waiting..., lorsque la barre de progression démarre, il devrait aller à Working..., et quand il est fait, il faut dire Done!.

Répondre

5

Utilisation GetTickCount() et les variables INITIALISATION:

uses Windows; 

var mseconds, starttime: integer; 


procedore TForm1.FormCreate() 
begin 
    starttime := GetTickCount(); 
    mseconds := 0; 
    Timer1.Enabled := false; 
    Label1.Caption := ''; 
    ProgressBar1.Position := 0; 
    Label1.Caption := 'Waiting...'; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ProgressBar1.Min := 0; 
    ProgressBar.Max := 100; 
    ProgressBar1.Position := 0; 
    timer1.Enabled := True; 
    Label1.Caption := 'Working...'; 
end; 

procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
    mseconds := GetTickCount() - starttime; 
    if mseconds < 5000 then 
    ProgressBar1.Position := Trunc(mseconds/50) 
    else begin 
    ProgressBar1.Position := 100; 
    Label1.Caption := 'Done!'; 
    Timer1.Enabled := false; 
    end; 
end; 
+0

Ok. Vous avez eu quelques erreurs, mais je suis capable de les réparer. Pour une raison quelconque, quand j'appuie sur le bouton, l'étiquette devient Working ..., mais elle ne fait rien d'autre après. J'ai regardé cependant pour voir si quelque chose n'allait pas, pourrait-il être provoqué par: starttime: = GetTickCount(); (lire le commentaire suivant) – PuppyKevin

+0

et mseconds: = starttime - GetTickCount() ;? – PuppyKevin

+0

@PuppyKevin: Vous êtes sur la bonne voie; Si vous ne voyez pas l'erreur, utilisez le débogueur, et vous le trouverez. En outre, Timer1 n'est pas désactivé lorsque vous avez terminé ... – mghie

9

Vous pouvez utiliser une minuterie avec l'intervalle 50 et tout d'abord activer à false.

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

procedure TForm1.Timer1Timer(Sender: TObject); 
const 
    cnt: integer = 1; 
begin 
    ProgressBar1.Position := cnt; 
    if cnt = 1 then Label1.Caption := 'Waiting...' 
    else if cnt = 100 then begin 
    Label1.Caption := 'Done!'; 
    Timer1.Enabled := False; 
    end else 
    Label1.Caption := 'Working...'; 
    Inc(cnt); 
end; 
+0

Un problème avec l'utilisation de minuteries est qu'il n'y a aucune garantie que cela prendra 5 secondes (2.5 dans votre exemple BTW). La plupart du temps, ce sera un match très serré. Dans un environnement stressant, il pourrait être d'une magnitude de secondes. –

+0

@Lieven: Vous avez raison, mais l'influence de ceci peut être minimisée par un algorithme moins bête: ne comptez pas les ticks de la minuterie, mais calculez le temps écoulé depuis le début dans le gestionnaire d'événements. Pour une priorité de message plus élevée, postez un WM_USER toutes les 100 ms à partir d'un thread d'arrière-plan. – mghie

+0

Oui. Ce n'est pas une solution parfaite, mais l'idée de base est correcte. –

Questions connexes