2013-12-10 3 views
1

Я хочу заменить мой индикатор выполнения калибром. Вот версия на прогресс бар:Looping TGauge с таймером

procedure TForm1.tmr1Timer(sender: TObject); 
begin 
    pb0.Position := (pb0.Position + 1) mod pb0.Max; 
end; 

И это на манометре

procedure TForm1.tmr1Timer(sender: TObject); 
begin 
    gauge.MinValue := 0; 
    gauge.MaxValue := 100; 
    gauge.Progress := gauge.Progress + 1; 
end; 

Как сделать это начать каждый раз, когда она достигнет 100? Как я пробовал с помощью кнопки для проверки, я не могу заставить ее зацикливаться, как на индикаторе выполнения.

procedure TForm1.btn6Click(sender: TObject); 
begin 
    tmr1.Enabled := not tmr1.Enabled; 
    begin 
    gauge.Progress := 0; 
    tmr1.Enabled := True 
    end; 
    if Form1.gauge.Progress = 100 then // is this correct ? 
    // what to do to make it looping ? 
end; 

Как сделать такую ​​же функцию на калибровке в качестве замены индикатора хода или таймера выше?

ответ

4

Так же. Просто используйте разные имена свойств для TGauge (и удалить настройку MinValue и MaxValue от события таймера):

procedure TForm1.tmr1Timer(sender: TObject); 
begin 
    gauge.Progress := (gauge.Progress + 1) mod (gauge.MaxValue - gauge.MinValue);; 
end; 

@DavidHeffernan указует в комментариях, что мой расчет никогда не достигнет полного 100% значения, и предлагает альтернатива:

gauge.Progress := gauge.MinValue + (gauge.Progress + 1) mod 
      (gauge.MaxValue - gauge.MinValue + 1); 

она имеет различные проблемы: на дисплее прогресс не начинается 0, и он увеличивает с шагом 2. Тем не менее, это действительно действительно достигает 100%.

Как @TLama указал в комментарии, ни одно из указанных выше не работает, если MinValue может быть отрицательным.


Этот расчет не имеет никаких проблем (петли из MinValue в MaxValue, и оба могут быть отрицательными), если MinValue < MaxValue

gauge.Progress := gauge.MinValue + 
        (gauge.Progress + 1 - gauge.MinValue) mod 
        (gauge.MaxValue - gauge.MinValue + 1); 
+0

Awesome! Спасибо Ken White – Bianca

+0

Этот код работает только в том случае, если MinValue равен 0. Он также никогда не будет устанавливать Progress равным MaxValue. Вы хотите, чтобы MinValue + (Progress + 1) mod (MaxValue-MinValue + 1) –

+0

@David: он работал в тестовом приложении XE5 VCL. Я запустил его, точно так же, как и в сообщении, с параметрами «MinValue = 0» и «MaxValue = 100' (я установил таймер на 250 мс для тестирования). Поскольку цель вопроса состоит в том, чтобы обернуться до нуля и начать все заново, никогда не устанавливать прогресс в MaxValue, похоже, не проблема; если он достигнет 100%, это было бы сделано, и не было бы смысла переходить к 0, правильно? Вероятно, вы правы относительно MinValues, кроме 0; Я скоро обножу (в середине чего-то примерно через 2 минуты). –

Смежные вопросы