Перейти к содержимому

Фото
- - - - -

Delphi. Свойства объектов в цикле.


  • Вы не можете создать новую тему
  • Please log in to reply
10 ответов в этой теме

#1 BiHiTRiLL

BiHiTRiLL
  • Пользователь
  • 370 сообщений

Отправлено 26 Август 2014 - 09:10

Вот такой код:

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i:= 10 to 5000 do
  begin
1.   Button1.Caption:=IntToStr(i);
2.   Form1.Color:=Random($FFFFFF);
3.   Button1.Width:=i;
4.   Form1.Width:=i;
  end;


end;

Для удобства объяснения пронумеровал строчки внутри цикла.

 

Суть вопроса: Не могу добиться изменения свойств элемента внутри цикла.

 

В примере выше все работает, но если оставить только строки 1 и 2 то счетчик на кнопке работает а фон формы не меняется, точнее меняется один раз после окончания цикла. Если добавить строчку 3 или 4 то все работает. Так же не работает нормально если оставить только строку 3, т.е. ширина кнопки изменится на 5000 после окончания цикла, динамики не будет. 

 

Складывается впечатление что если нет каких-то изменений внутри объекта, то его состояние не обновляется. Может кто нибудь объяснить суть происходящего? Есть ли какие либо нормы или правила на этот счет для конструкций языка, и как это можно заставить работать нормально? Поиски в гуглояндексах ничего вразумительного не дали к сожалению...


  • 0

¡ʁɐнεɐd ɐно - ɐɓʚɐdu


#2 Vitalts

Vitalts
  • Постоялец
  • 1 842 сообщений

Отправлено 26 Август 2014 - 09:37

Дай бог памяти, ProcessMessages().
Изменения ширины принудительно вызывает перерисовку формы, вот вы и видите изменения. Если никаких принудиловок перересовки не будет, цикл возмет на себя все процессорное время и форма "подвиснет". ProcessMessages как бы приостанавливает цикл, принудительно вызывая обработку откликов формы. Она перересуется, если в этом есть необходимость, ее можно спокойно таскать, изменять, работа в цикле для пользователя станет незаметной. Однако, не стоит ProcessMessages выполнять на каждой итерации, ибо каждый ее вызов приостанавливает работу цикла. Как следствие объемный цикл сильно замедлится. Ставьте счетчик и вызывайте ProcessMessages, скажем, на каждой 1000-й итерации. Цифру подбирите практическим методом в зависимости от потребностей.
По дельфям очень советую сей ресурс. В свое время не один год там провел.

Сообщение изменено: Vitalts (26 Август 2014 - 09:42 )

  • 2

#3 BiHiTRiLL

BiHiTRiLL
  • Пользователь
  • 370 сообщений

Отправлено 26 Август 2014 - 09:46

Vitalts

 

Всё понял. Прикрутил Application.ProcessMessages(); 

Заработало как и хотел. Спасибо.

 

Отдельное спасибо за ссылку на Дельфи-Мастерс


Сообщение изменено: BiHiTRiLL (26 Август 2014 - 09:55 )

  • 0

¡ʁɐнεɐd ɐно - ɐɓʚɐdu


#4 ParadoxL

ParadoxL
  • Постоялец
  • 4 756 сообщений
  • Откуда:Edinburg

Отправлено 26 Август 2014 - 11:16

Моргать надо быстрее :D


  • -1
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...

#5 Zero

Zero

    TRUST NO ONE

  • Постоялец
  • 9 132 сообщений
  • Откуда:Таллин

Отправлено 26 Август 2014 - 12:03

Однако, не стоит ProcessMessages выполнять на каждой итерации, ибо каждый ее вызов приостанавливает работу цикла.

Также будьте осторожны с многопоточными приложениями, ProcessMessages может выкинуть куда не ждешь.


  • 0
Моя Родина - СССР! Пролетарии всех стран, соединяйтесь!
-----------------------------------------------------------------------
Ясность - одна из форм полного тумана. Форумчане, давайте жить дружно!

#6 BiHiTRiLL

BiHiTRiLL
  • Пользователь
  • 370 сообщений

Отправлено 26 Август 2014 - 12:26

Zero, таких глубин, как многопоточные приложения,  я еще не достиг, но замечание принял. Буду иметь ввиду когда стану опытнее.


  • 0

¡ʁɐнεɐd ɐно - ɐɓʚɐdu


#7 Zero

Zero

    TRUST NO ONE

  • Постоялец
  • 9 132 сообщений
  • Откуда:Таллин

Отправлено 26 Август 2014 - 21:37

BiHiTRiLL, если надо, обращайся; на Delphi постоянно пишу по работе. Правда, не гуёвыми вещами занят.


  • 1
Моя Родина - СССР! Пролетарии всех стран, соединяйтесь!
-----------------------------------------------------------------------
Ясность - одна из форм полного тумана. Форумчане, давайте жить дружно!

#8 Вырвиглаз

Вырвиглаз

    Убийца травы

  • Постоялец
  • 15 501 сообщений
  • Откуда:Эстония, Таллин

Отправлено 27 Август 2014 - 10:42

Если требуется анимация, то помимо передачи управления в другой поток надо еще внедрить паузу. Иначе скорость анимации будет зависеть от загрузки ОС и возможностей железа.


  • 0
Кто живет и грешит в Эстонии, тот опять родится в Эстонии.

#9 Vitalts

Vitalts
  • Постоялец
  • 1 842 сообщений

Отправлено 27 Август 2014 - 11:55

Это справедливо и для однопоточных приложений. И если речь не о анимации со статичным FPS, а скажем о рендеринге высокобитрейтной сцены аля игрушка, то паузить нужно не обновление изображения, а рассчеты положения объектов сцены.

Что-то мы с вами сильно отклонились от темы...


  • 0

#10 BiHiTRiLL

BiHiTRiLL
  • Пользователь
  • 370 сообщений

Отправлено 28 Август 2014 - 11:43

Эй, гуру, полегче!!! Я понимаю что вы недавно закончили  Мегапроект и вам нужно куда-то деть кипучую энергию, но я пока ещё дописываю свой "Hello World"...   

:D


  • 0

¡ʁɐнεɐd ɐно - ɐɓʚɐdu


#11 BiHiTRiLL

BiHiTRiLL
  • Пользователь
  • 370 сообщений

Отправлено 04 Сентябрь 2014 - 14:46

...


Сообщение изменено: BiHiTRiLL (04 Сентябрь 2014 - 14:46 )

  • 0

¡ʁɐнεɐd ɐно - ɐɓʚɐdu