Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Для новичков > Циклы, sleep(), ProgressBar |
Автор: boobie 3.1.2013, 13:27 | ||||||
Добрый день! Давно заметил такую штуку... Создаем одну кнопку и одну метку. Вешаем вот такое событие на кнопку:
Как я представлял себе работу цикла: i:=0, выводим i, ждем одну секунду; i:=1, выводим, ждем еще одну секунду... и так до 10. Но нет. После нажатия на кнопку программа замирает на 10 секунд (это ожидаемо... ведь у нас sleep() и отсутствие многопоточности)... А уже потом показывается "10". Почему не происходит перерисовка label1? Если немного "усложнить" и добавить ProgressBar, например, так:
"Гусеница" бежит нормально, а надпись 'Форматирование диска C:\' даже не появляется. Если убрать строчку
то надпись 'Форматирование диска C:\' появится после того, как пробежит "гусеница". Почему? Пользуюсь Delphi XE3. |
Автор: Illusion Dolphin 3.1.2013, 14:16 | ||||||||
Потому что
Потому что она обновляется между sleep'ами (SendMessage, а не PostMessage). Есть глупая функция delay, если на неё заменить Sleep то выглядить всё будет красиво:
Пользоваться ею в проектах - крайне не рекомендую, а просто посмотреть - пожалуйста. Application.ProcessMessages обрабатывает все сообщения, которые пришли в программу. В данном случае надо как минимум WM_PAINT и ещё что-нибудь наверное чтобы прорисовать Label. |
Автор: boobie 3.1.2013, 14:28 |
Спасибо! TLabel.Repaint - все как надо... А почему без него не обойтись? |
Автор: Illusion Dolphin 3.1.2013, 14:52 | ||
Без него можно обойтись через потоки или Application.ProcessMessages. Просто Repaint принудительно перерисовывает контрол. |
Автор: northener 4.1.2013, 01:46 | ||
Вам бы стоит почитать что-нибудь про Windows. |