Почему не меняется значение метки?

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Ответить
Lifter
новенький
Сообщения: 21
Зарегистрирован: 19.04.2012 02:17:24

Почему не меняется значение метки?

Сообщение Lifter »

Проблема в Lazarus.

Код: Выделить всё

procedure TForm1.Label1Click(Sender: TObject);
var i: integer;
begin
  for i:=0 to 100 do
   begin
     Label1.Caption := 'Обработано '+IntToStr(i)+' из 100 ';
     Sleep(5);
   end;
end;

Пустая форма, на ней метка Label1. Хочу, чтобы надпись на ней перебирала все значения от 0 до 100.
Программа же задумывается на пару секунд, потом пишет "Обработано 100 из 100", то есть последнее значение.
Т.е. пока крутится в цикле, значение метки не обновляется.
Как сделать, чтоб обновлялось?

UPD
Добавил прогресбар. Он движется от 0 к 100, как надо. А значение метки так и не обновляется. Только через секунду-две после того, как прогрессбар дошел до 100, появляется надпись "Обработано 100 из 100".

Код: Выделить всё

procedure TForm1.Label1Click(Sender: TObject);
var i: integer;
begin
  for i:=0 to 200 do
   begin
     Label1.Caption := 'Обработано '+IntToStr(i)+' из 200 ';
     ProgressBar1.Position := i;
     Sleep(5);
   end;
end;
Последний раз редактировалось Lifter 11.05.2012 19:38:08, всего редактировалось 1 раз.
Аватара пользователя
Little_Roo
энтузиаст
Сообщения: 639
Зарегистрирован: 27.02.2009 18:56:36
Откуда: Санкт-Петербург

Сообщение Little_Roo »

Таймер поможет ?
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Application.ProcessMessage перед/вместо Sleep?
Lifter
новенький
Сообщения: 21
Зарегистрирован: 19.04.2012 02:17:24

Сообщение Lifter »

Но прогресбар то движется! Безо всяких таймеров. А текст метки не меняется. Может какое свойство у метки надо задать?

Добавлено спустя 4 минуты 21 секунду:
Во, Application.ProcessMessage помогло!!! Спасибо!

Добавлено спустя 5 минут 16 секунд:
Ну и чисто из любопытства, почему тогда двигался прогресбар, он вроде тоже не должен был бы обновляться?
Аватара пользователя
Light13
постоялец
Сообщения: 127
Зарегистрирован: 17.07.2009 07:50:10
Откуда: Челябинск

Сообщение Light13 »

Progressbar после изменения позиции делает перерисовку.

ProcessMessage заставляет обработать очередь сообщений.

При этом можно закрыть окно - это тоже обработается.

Можете вызывать Label1.Repaint или перед началом цикла (имхо это правильнее) повесить флаг и проверять его в onCloseQuery формы - если работаем, то не закрываемся.

Обрабатывать очередь сообщений на каждую итерацию слишком дорого. Лучше проверяйте сколько тактов прошло и через 500-1000 вызывайте ProcessMessage.
Ответить