|
Вопрос # 2 168/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Почему в Delphi 7 изменение в форме её копонетах происходит после завершение процедуры (в Button1 происходят длительные вычисления и по мере вычислений в программе в progressbar заполняется строка загрузки(в программе изменяем Progressbar.position), но строка загрузки быстро заполнится в конце вычислений, во время вычислений никаких изменений в форме не происходит)
 |
Вопрос задал: 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 (статус: 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 обновляться нормально в отличии от других компонентов.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|