Официальный сайт студ.городка НГТУ
Программирование и БД » [Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса) 

#1  20.04.08 18:50

[Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса)

Есть цикл который считает очень много раз простое выражение.
Можно ли сделать так, что бы пока работает цикл  компонент TProgressBar(шкала прогресса) тоже работал, т.е. полоса заполнялась синхронно с работой цикла(показывала время до завершения работы цикла)?

Offline

#2  20.04.08 23:30

Re: [Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса)

можно, а в чем проблема?
максимальное значение цикла знаешь?
установи это значение (-1) как максимальное у прогрессбара.
в цикле устанавливай текущее положение и обновляй форму а которой лежит прогрессбар. (что-то типа update или repaint должно быть у формы, не помню уже)

Offline

#3  20.04.08 23:35

Re: [Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса)

процесс надо отдельный создавать.
а перерисовывать форму, или вызывать ProcessMessages - извращение.

Offline

#4  20.04.08 23:35

Re: [Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса)

в-смысле поток, а не процесс, естессна

Offline

#5  20.04.08 23:48

Re: [Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса)

а, да, ProcessMessage...

Andron_, да, поток будет правильнее...

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

Re: [Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса)

Ram3ec, хоть я и программирую на всем, начиная от asm для DSP и заканчивая C#, но из твоего объяснения не понял ровным счетом ни-че-го.

Offline

#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

#14  30.04.08 11:25

Re: [Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса)

Andron_, я пожалуй соглашусь, что тиками будет корректней, а вот замечание несущественно в данном случае, так как мы не знаем контекст использования vivod-а

Offline

#15  30.04.08 11:31

Re: [Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса)

а... ты там че-то другое заносишь... ну так да... так пофигу...

Offline

Программирование и БД » [Delphi] Вопрос связан с компонентом TProgressBar(индикатор прогресса) 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.049 сек.
Выполнено 14 запросов.