Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 168

Раздел: Delphi » Прочее
/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Почему в Delphi 7 изменение в форме её копонетах происходит после завершение процедуры (в Button1 происходят длительные вычисления и по мере вычислений в программе в progressbar заполняется строка загрузки(в программе изменяем Progressbar.position), но строка загрузки быстро заполнится в конце вычислений, во время вычислений никаких изменений в форме не происходит)

SKoch92 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: SKoch92 (статус: Посетитель)
Вопрос отправлен: 6 декабря 2008, 23:45
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: Anderson N.N

Здравствуйте, SKoch92!
А вот тебе немного экзотики создай обработчик формы OnPaint
в который вынеси код увеличения Progressbar.Position
А в том месте где ты это делал напиши

form1.Repaint;

Если конечно твой форма называется form1

Ответ отправил: Anderson N.N (статус: 2-ой класс)
Время отправки: 7 декабря 2008, 00:56

Ответ #2. Отвечает эксперт: min@y™

Если нет смысла использовать отдельные потоки, я делаю примерно так:

const
  Count:= 10000000000000000000;
var
  Index, Progress, OldProgress: Integer;
begin
  OldProgress:= 0;
 
  for Index:= 0 to Count - 1 do
    begin
      // <--- Вычисления тут
 
      Progress:= Round(100 * (Index + 1) / Count);
      if OldProgress <> Progress
        then begin
               ProgressBar.Position:= Progress;
               OldProgress:= Progress;
               Application.ProcessMessages();
             end;
    end;
end;

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 7 декабря 2008, 01:05

Ответ #3. Отвечает эксперт: Nasgool

Здравствуйте, SKoch92!
Можно проще:
во время вычислений периодически вызывать метод формы Form1.Repaint.

Ответ отправил: Nasgool (статус: 2-ой класс)
Время отправки: 7 декабря 2008, 06:41


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 7 декабря 2008, 10:18; участников в обсуждении: 2.
Anderson N.N

Anderson N.N (статус: 2-ой класс), 7 декабря 2008, 00:39 [#1]:

Кинь код если не трудно

а пока попробуй вставить вот это в свой код

Application.ProcessMessages;

если не поможет то можешь добавить после того места где ты увеличиваешь свойство
Position у ProgressBar

ProgressBar1.Invalidate;
Вадим К

Вадим К (статус: Академик), 7 декабря 2008, 10:18 [#2]:

Вызывать Paint или Invalidate - очень плохо. дело в том, что при каждом изменении позиции ProgressBar'a он "пересоздает себя на форме" - вот такое странное поведение у него. И как обычно в подобном коде именно обновление ProgressBar занимает до 90 и более процентов времени.
Ответ min@y™ должен натолкнуть в правильную сторону решение. Но дело в том, что никакого кода не было приведено. Возможно у Вас "не линейная зависимость". Так как обычно ProgressBar обновляться нормально в отличии от других компонентов.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 2 апреля 2020, 04:03
Выполнено за 0.02 сек.
Рейтинг@Mail.ru