#1 20.04.08 18:50
[Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса)
Есть цикл который считает очень много раз простое выражение.
Можно ли сделать так, что бы пока работает цикл компонент TProgressBar(шкала прогресса) тоже работал, т.е. полоса заполнялась синхронно с работой цикла(показывала время до завершения работы цикла)?
Offline
#2 20.04.08 23:30
Re: [Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса)
можно, а в чем проблема?
максимальное значение цикла знаешь?
установи это значение (-1) как максимальное у прогрессбара.
в цикле устанавливай текущее положение и обновляй форму а которой лежит прогрессбар. (что-то типа update или repaint должно быть у формы, не помню уже)
Offline
#6 29.04.08 16:30
Re: [Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса)
Andron_ написал(а):
поток надо отдельный создавать.
А можно поподробнее, я начинающий))
Есть форма в которой имееться кнопка"ОК" (в программе компонент назывется Ok), поле вывода "мемо" (в программе компонент назывется vivod) и индикатор прогресса (progres). При нажатии на кнопку зпускается процедура
procedure TForm1.OkClick(Sender: TObject);
var i,k:integer;
begin
i:=10000;
for k:=1 to i do vivod.lines.add(' ok');
end;
И вот пока работает цикл нужно что б индикатор работал.
Скажите как что сделать?
Offline
#7 29.04.08 18:56
Re: [Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса)
-=potkot=- написал(а):
А можно поподробнее, я начинающий))
по-подробнее это нужно читать книги...
а если совсем для начинающих, то через жопу, но действенно нужно сделать так:
Код::
procedure TForm1.OkClick(Sender: TObject);
var i,k:integer;
begin
i:=10000;
for k:=1 to i do
vivod.lines.add(' ok');
<увеличиваешь свойство у прогресс бара>
Application.ProcessMessages; //вот это заставит форму обработать сообщения и перерисовать ее
//в-принципе, это можно использовать еще и для отмены процесса
//форма сможет реагировать на действия пользователя
end;Offline
#8 29.04.08 21:46
Re: [Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса)
Andron_ написал(а):
это нужно читать книги
Читаю книгу но там конкретно по этому вопросу не написано. Предложенный тобой вариант попробовал, но индикатор прогресса не работает((
Offline
#9 30.04.08 00:55
Re: [Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса)
procedure TForm1.OkClick(Sender: TObject);
var i:Integer;
n:Integer;
begin
i:=10000;
for n := 1 to i do
begin
// операции в теле цикла
if (n mod (i div (ProgressBar1.Max-ProgressBar1.Min)))=0 then
//вычисляем для пропорционального заполнения ProcessBar-a
begin
ProgressBar1.StepBy(1);
Application.ProcessMessages;
vivod.Lines.Add(IntToStr(ProgressBar1.Position));
end;
end;
end;
-=potkot=-, вот это уже точно рабочая версия, только
вызывать ProcessMessages - извращение.
А если со временем нужно, то можно еще поизвращаться - сделай замер времени работы первого шага цикла, потом посчитай общее время работы и при каждом ProgressBar1.StepBy(1) уменьшай счетчик времени работы, выводимый в vivod
Исправлено Ram3ec (30.04.08 00:56)
Offline
#10 30.04.08 01:04
#11 30.04.08 08:08
Re: [Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса)
Andron_, автор же написал
полоса заполнялась синхронно с работой цикла(показывала время до завершения работы цикла)
ну вот я и предлагаю при первой прогонке цикла (когда n=1) произвести замер времени работы тела цикла (только для этого первого раза), умножить это время на i - получим "предполагаемое" время работы всего цикла (т.е. до i=10000 например). ну и потом это время просто уменьшать при каждом увеличении значения Position у ProgressBar-a.
Andron_, я же только учусь, а ты просто монстр, что на всем этом программируешь. ;) Предложи свой вариант с выводом времени...
Offline
#12 30.04.08 10:27
Re: [Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса)
Ram3ec, Спасибо, работает))
Offline
#13 30.04.08 10:58
Re: [Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса)
Ram3ec, хммммм.... а время то зачем....
Ram3ec написал(а):
Предложи свой вариант с выводом времени...
замечаем момент старта цикла тиками, по завершению, скажем, 1/20 цикла снова замеряем время, получаем время выполнения 1/20, умножаем на 20 - время всего цикла ну а там дальше че хотим, то и делаем.
на свежую голову таки внесу замечание...
Код::
procedure TForm1.OkClick(Sender: TObject);
var i:Integer;
n:Integer;
begin
i:=10000;
for n := 1 to i do
begin
// операции в теле цикла
if (n mod (i div (ProgressBar1.Max-ProgressBar1.Min)))=0 then
//вычисляем для пропорционального заполнения ProcessBar-a
begin
ProgressBar1.StepBy(1);
Application.ProcessMessages;
end;
vivod.Lines.Add(IntToStr(ProgressBar1.Position)); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
end;
end;Исправлено Andron_ (30.04.08 10:59)
Offline

