Индикация процесса (TProgressBar) в Delphi

 

procedure TFormi.ButtonlClick(Sender: TObj ect); var

i:Integer; begin for i:=0 to 20 do begin

//Здесь можно делать какой-то расчет

//После расчета отображаем текущее состояние ProgressBarl.Position:=ProgressBarl.Position+5; Sleep(100); //Делаем задержку в 100 миллисекунд end;

ProgressBarl.Position:=0; end;

 

В данном случае запускается цикл от 0 до 20. На каждом этапе цикла позиция ProgressBar увеличивается на 5 и на двадцатом шаге выполнения цикла будет рав­на своему максимальному значению— 100. В цикле также устанавливается за­держка на 100 миллисекунд, чтобы наша полоска не проскочила слишком быстро, и вы хотя бы увидели иллюзию расчета. В реальных примерах задержка не будет нужна, ведь если расчет выполняется так быстро, что пользователь даже не увидит движение ползунка, ТО нет СМЫСЛа создавать ProgressBar.

 

Приведенный пример не совсем универсальный, потому что требует, чтобы мы заранее знали приращение пяти единиц на каждом шаге. В противном случае есть два варианта решения.

  • Изменить свойство мах компонента ProgressBar на 20 и на каждом шаге при­ращивать только единицу. Это очень удобный способ, потому что позиция ProgressBar будет изменяться от 0 до 20. Цикл тоже действует в этом диапазо­не, так что пример может упроститься и выглядеть так, как показано в листин­ге:

 

procedure TFormi.ButtonlClick(Sender: TObj ect); var

i:Integer; begin for i:=0 to 20 do begin

//Здесь можно делать какой-то расчет

//После расчета отображаем текущее состояние

ProgressBarl.Position:=i;

Sleep(100); //Делаю задержку в 100 миллисекунд end;

ProgressBarl.Position:=0; end;

В данном случае нам не надо делать приращение для ProgressBar, а доста­точно сразу присваивать в свойство позиции значение i, потому что значение позиции и значение i изменяются в одном диапазоне от 0 до 20.

Второй способ заключается в расчете относительного положения состояния ProgressBar. В этом случае позиция ProgressBar должна изменяться от 0 до 100 и нужно воспринимать эти значения как проценты. После этого рассчитывать процент выполнения на каждом шаге цикла. Не пугайтесь, этот расчет очень прост и не затруднителен для машины. Иногда такой способ удобнее:

 

procedure TFormi.ButtonlClick(Sender: TObj ect); var

i:Integer;

begin

for i:=0 to 20 do

begin

//Здесь можно делать какой-то расчет

//После расчета отображаем текущее состояние ProgressBarl.Position:=round(i/20*100); Sleep(100); //Делаем задержку в 100 миллисекунд end;

ProgressBar1.Position:=0;

end;

В этом примере позиция рассчитывается по формуле преобразования чисел в проценты, т. е. текущее значение делится на максимальное и умножается на 100 (в нашем случае 20И и умножить на 100). Результат этих вычислений нужно округлить, потому что среди операций расчета было деление, значит, общий результат будет в любом случае восприниматься как дробное число, да­же если результат явно должен быть целым.

 

В последнем случае есть небольшая погрешность из-за операций деления и округления, но в реальных условиях заметить эту погрешность невозможно, потому что она равна менее половины процента. Все равно при выводе графики всегда бывают погрешности из-за масштабирования.

 

 

dle

Помоги проекту! Расскажи друзьям об этом сайте: