Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Циклы, sleep(), ProgressBar 
:(
    Опции темы
boobie
Дата 3.1.2013, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



Добрый день!
Давно заметил такую штуку... 
Создаем одну кнопку и одну метку.
Вешаем вот такое событие на кнопку:
Код

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
label1.Caption:='';
for I := 0 to 10 do
  begin
    label1.Caption:=inttostr(i);
    sleep(1000);
  end;
end;

Как я представлял себе работу цикла: i:=0, выводим i, ждем одну секунду; i:=1, выводим, ждем еще одну секунду... и так до 10.
Но нет. После нажатия на кнопку программа замирает на 10 секунд (это ожидаемо... ведь у нас sleep() и отсутствие многопоточности)...
А уже потом показывается "10". Почему не происходит перерисовка label1?

Если немного "усложнить" и добавить ProgressBar, например, так:
Код

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
label1.Caption:='Форматирование диска C:\';
for I := 0 to 100 do
  begin
    progressbar1.Position:=progressbar1.Position+1;
    sleep(60);
  end;
progressbar1.Position:=0;
label1.Caption:='';
end;

"Гусеница" бежит нормально,  а надпись 'Форматирование диска C:\' даже не появляется.
Если убрать строчку
Код

label1.Caption:='';

то надпись 'Форматирование диска C:\' появится после того, как пробежит "гусеница".
Почему? 
Пользуюсь Delphi XE3.

Это сообщение отредактировал(а) boobie - 3.1.2013, 13:40
PM   Вверх
Illusion Dolphin
Дата 3.1.2013, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 5
Всего: 63



Цитата

Почему не происходит перерисовка label1?

Потому что
Цитата

программа замирает на 10 секунд


Цитата

"Гусеница" бежит нормально,

Потому что она обновляется между sleep'ами (SendMessage, а не PostMessage). 

Есть глупая функция delay, если на неё заменить Sleep то выглядить всё будет красиво:
Код

procedure Delay (Seconds: Real);
var
Later: TDateTime;
begin
Later:= Now + (Seconds / (24.0 * 60.0 * 60.0));
While Now < Later do Application.ProcessMessages;
end; 


Пользоваться ею в проектах - крайне не рекомендую, а просто посмотреть - пожалуйста.
Application.ProcessMessages обрабатывает все сообщения, которые пришли в программу. В данном случае надо как минимум WM_PAINT и ещё что-нибудь наверное чтобы прорисовать Label. 


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
northener
Дата 3.1.2013, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(Illusion Dolphin @  3.1.2013,  14:16 Найти цитируемый пост)
В данном случае надо как минимум WM_PAINT и ещё что-нибудь наверное чтобы прорисовать Label.

Достаточно TLabel.Refresh или TLabel.Repaint


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
boobie
Дата 3.1.2013, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



Спасибо!
TLabel.Repaint - все как надо...

А почему без него не обойтись?

Это сообщение отредактировал(а) boobie - 3.1.2013, 14:32
PM   Вверх
Illusion Dolphin
Дата 3.1.2013, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 5
Всего: 63



Цитата

А почему без него не обойтись?

Без него можно обойтись через потоки или Application.ProcessMessages. Просто Repaint принудительно перерисовывает контрол.


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
northener
Дата 4.1.2013, 01:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(boobie @  3.1.2013,  14:28 Найти цитируемый пост)
Спасибо!
TLabel.Repaint - все как надо...

А почему без него не обойтись?

Вам бы стоит почитать что-нибудь про Windows.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0744 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.