Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Delphi.Нехитрый графический эффект. Проблемы.

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Delphi.Нехитрый графический эффект. Проблемы.
Имя
Сообщение << Старые топики   Новые топики >>
Delphi.Нехитрый графический эффект. Проблемы. - 2010-04-02 22:19:40.560000   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
Понадобилось мне сделать довольно простой графический эффект - при появлении формы нечто рисуется медленно,по частям (видно как программа прорисовывает это), а потом картинка торчит на форме и дальше, уже нормально. Ну я как подумал: соответственно, чтобы она там торчала, в FormPaint надо поместить рисование её,но вот задержки делать только после первой отрисовки.
if FirstDraw then begin // inherited; - со злости даже так написать попробовал Sheets.DrawSelfSlow(....); //медленно рисую FirstDraw:=false; end else Sheets.DrawSelf(....); //рисунок без Sleep-ов
Результат : Форма висит ненарисованная *ровно столько,сколько длится эффект*. потом картинка стоит на месте.

Ещё пробовал вариант "быстрое" рисование одно совать в FormPaint, а "медленное" - в другие события.
(чтобы сначала была анимация,в OnActivate/OnShow например,потом уже картинка оставалась). Естественно,FormPaint попадает на выполнение первым и "анимация" рисуется на фоне картинки.

Вроде бы совсем простая мура,но застрял. Помогите советом,у кого идеи есть,пожалуйста.

Ах,да. Почему я не могу стирать картинку как белый человек - к форме применен хитрый скин, "затереть" картинку при необходимости не вариант,ибо рисую на форме. Рисование на TImage,конечно, решит проблему,но наложит определенные ограничения(не суть какие). Есть ли другие варианты или "Image" и не пудрить себе мозг?
Post #: 1
RE: Delphi.Нехитрый графический эффект. Проблемы. - 2010-04-03 00:35:53.290000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
Эвентуальное программирование. Event driven programming.
Все события обрабатываются последовательно. Пока не обработалось одно, программа не начнёт обрабатывать другое. Поэтому использование Sleep и тому подобных функций недопустимо в обработчике событий. Хуже того, недопустимо использовать, скажем, функции синхронного ввода/вывода, поскольку они могут выполняться в течение неопределённого промежутка времени. Это чем-то напоминает real-time программирование. А почему, как ты думаешь броузер иногда подвисает, когда ему до сайта не достучаться? Просто потому, что разработчики так и не смогли написать действительно неблокируемый код, то есть код, который выполняется фиксированное время. Вот учись писать неблокируемый код, может напишешь когда-нибудь броузер, который не будет замирать. :D

Повесь обработчик событий таймера. На каждое событие увеличивай специально заведённый для этого дела счётчик и инициируй перерисовку формы. Повесь ещё обработчик отрисовки, в нём в рисуй, учитывая значение счётчика.
То есть идея с FirstDraw – это близко, но недостаточно. Вместо FirstDraw надо завести счётчик отрисовок, который будет считать сколько раз отрисовали, и в зависимости от значения счётчика выводить разное количество графических элементов картинки. Но считать количество отрисовок – тоже не совсем хорошо. Скорость анимации будет зависить от мощности компьютера, да и анимация такая будет кушать 100% времени. Поэтому нужен таймер, и считать надо сколько раз он тикнул.
Post #: 2
RE: Delphi.Нехитрый графический эффект. Проблемы. - 2010-04-03 01:49:09.160000   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
Блиин!! Да что ж такое со мной сегодня!(( Столько мучаться над ерундой(. [sm=bu.gif][sm=bu.gif] Таймер - самое то оказался,только в моем случае всё ещё проще - анимация нужна только при запуске,потому по таймеру стал запоминать чистый кусок формы, выводить красивость,а потом этот самый таймер выключать)) Ну и плюс в нем FirstDraw:=false , рисовать же в OnPaint только при отсутствии этого флага.

Спасибо большое за наводку *ну и за экскурс в теорию вопроса)* !!
Post #: 3
RE: Delphi.Нехитрый графический эффект. Проблемы. - 2010-04-03 12:32:32.926666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
rgo всё написал. Добавлю только то, что момент, когда нужно "перерисовываться" по-хорошему должна выбирать ОС. Ты лишь можешь намекнуть ей, что хочешь "перерисоваться" путём вызова какой-нить InvalidateRect.
Post #: 4
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Delphi.Нехитрый графический эффект. Проблемы.







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.