2009-03-30 2 views
3

Я пытаюсь сделать индикатор выполнения, который начинается с 0%, и занимает 5 секунд, чтобы добраться до 100%. Индикатор выполнения начнет расти, как только щелкнет Button1. Любой совет? Я посмотрел на Google, но это не помогло мне в этом ничего хорошего.Delphi Progress Bar

Кроме того, при 0%, должен быть ярлык, который говорит Waiting..., когда начинается прогресс бар, он должен идти к Working..., и когда это будет сделано, он должен сказать Done!.

ответ

5

Использование GetTickCount() и инициализация переменных:

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

Хорошо. У вас было несколько ошибок, но я могу их исправить. Однако по какой-то причине, когда я нажимаю кнопку, ярлык меняется на «Работать» ... но после этого ничего не происходит. Я посмотрел, хотя, чтобы увидеть, было ли что-то не так, может ли это быть вызвано: starttime: = GetTickCount(); (читайте следующий комментарий) – PuppyKevin

+0

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

+0

@PuppyKevin: Вы на правильном пути; если вы не видите ошибку, используйте отладчик, и вы его найдете. Кроме того, Timer1 не отключается, когда это делается ... – mghie

9

Вы можете использовать таймер с интервалом 50 и сначала установить значение 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

Одна из проблем, с помощью таймеров является то, что нет никакой гарантии, что это займет 5 секунд (2,5 в вашем примере кстати). В большинстве случаев это будет очень близкое совпадение. В стрессовой обстановке он может составлять несколько секунд. –

+0

@ Lieven: Вы правы, но влияние этого можно свести к минимуму с помощью менее тупых алгоритмов: не считайте отметки таймера, но вычисляйте прошедшее время с момента запуска в обработчике событий. Для более высокого приоритета сообщения отправляйте WM_USER каждые 100 мс вместо фонового потока. – mghie

+0

Да. Это не идеальное решение, но основная идея правильная. –