Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.11;
Скачать: CL | DM;

Вниз

Анимация   Найти похожие ветки 

 
boalse ©   (2006-05-15 12:56) [0]

Надеюсь, кому-нибудь пригодится.  Класс для воспроизведения анимации в Windows-приложениях, хранящейся в одном bmp-файле (потоке).
Воспроизведение идёт на любом канвасе без всяких там таймеров. Предусмотрены достаточно большие возможности по управлению анимацией.

http://boalse.narod.ru/TAnimation.rar

Естественно, буду рад, если укажете на ошибки.


 
API ©   (2006-05-15 14:20) [1]

1. Лучше реализовать в виде компонента.
2. PAnimation = ^TAnimation; - и иже с ними - это что это?
3. "Душевно":
case FLoopType of
 lpUpDown: FUp:=true;
 lpDownUp: FUp:=false;
end;
:-)
4. Много участков кода с блокированием/разблокирование канвы - но без try..finally
5. На мой взгляд - многовато логических флажков в классе (и по коду), отображающих разные состояния.

А вообще - как-то подозрительно много кода для такого простого класса.


 
boalse ©   (2006-05-15 14:27) [2]

> case FLoopType of
>  lpUpDown: FUp:=true;
>  lpDownUp: FUp:=false;
> end; :-)


Там есть ещё третий вариант (lpUpDownUp), при котором FUp не должно менятся. Можно реализовать более красиво?

PAnimation = ^TAnimation; - и иже с ними - это что это?
Там ниже идёт:
TSimpleProc=Procedure(AAnimation:PAnimation);
А ещё ниже сам класс TAnimation в котором есть переменные типа TSimpleProc. Как ещё можно реализовать передачу параметра в TSimpleProc?
Просто TSimpleProc=Procedure(AAnimation:TAnimation); не прокатит


 
API ©   (2006-05-15 14:30) [3]

Ах да... конструктивизм же проявить надо... :-)

1. Почему не используете TImageList? Там и загрузка из файла, потока, разбитие на кадры, и прозрачность и прочее, прочее, прочее.

2. Класс лучше породить от TComponent, а поток инкапсулировать в классе.

3. На каждый экземпляр класса свой поток - так можно делать, конечно. Но лучше бы сделать некий мастер-класс, который будет обрабатывать временнЫе интервалы и отрисовку всех TAnimation. Создавать/уничтожать единственный экземпляр этого класс в initialization/finalization, плюс оптимизировать, чтобы поток не крутился, когда нету присоединенніх анимаций, ну и все такое...

Если еще что-нибудь придумаю - сообщу дополнительно... :-)


 
boalse ©   (2006-05-15 14:32) [4]

>Много участков кода с блокированием/разблокирование канвы - но без try..finally

А надо? Как это должно выглядить?

lock
try
 Draw
finally
 UnLock
end;
Так???

>А вообще - как-то подозрительно много кода для такого простого класса
Это всё комменты:)
>А вообще - как-то подозрительно много кода для такого простого класса.
Я не представляю, как это может выглядеть иначе. Сколько смотрел в код, ничего лишнего не нашел.


 
API ©   (2006-05-15 14:36) [5]

Там есть ещё третий вариант (lpUpDownUp), при котором FUp не должно менятся.

Понятно.

Как вариант:

if (FLoopType <> lpUpDownUp) then
 FUp := FLoopType = lpUpDown;


P.S. Но это так, к слову... :-)

Просто TSimpleProc=Procedure(AAnimation:TAnimation); не прокатит

Почему? Что мешает? Может, я чего не доглядел?


 
Zeqfreed ©   (2006-05-15 14:36) [6]


> > case FLoopType of
> >  lpUpDown: FUp:=true;
> >  lpDownUp: FUp:=false;
> > end; :-)
>
>
> Там есть ещё третий вариант (lpUpDownUp), при котором FUp
> не должно менятся. Можно реализовать более красиво?

По всей видимости так:
FUp := (FLoopType = lpUpDown);


 
boalse ©   (2006-05-15 14:39) [7]

>Лучше реализовать в виде компонента.
Не люблю я компоненты, предпочитаю отдельные классы
>TComponent
Не понял зачем это? Какие от этого возможности появятся? Что ускорится? Не вижу смысла, просветите.

>Но лучше бы сделать некий мастер-класс
Тоже вариант, но это уже будет слишком громоздко для программ, где нужно отобразить пару красивых анимаций в окне.

>Почему не используете TImageList?
Учтёмсс.


 
Zeqfreed ©   (2006-05-15 14:40) [8]

В [6] имел в виду FUp := (FLoopType = lpUpDown) and not (FLoopType = lpUpDownUp); :)


 
Zeqfreed ©   (2006-05-15 14:42) [9]

Ой, блин. :)
Все, я посыпаю голову пеплом. В [5] правильный вариант. А я чего-то не то подумал как обычно.


 
boalse ©   (2006-05-15 14:44) [10]

>Как вариант:
Да, точно, спасибо.

>По всей видимости так:
>FUp := (FLoopType = lpUpDown);
неееааа!

>Почему? Что мешает? Может, я чего не доглядел?

TSimpleProc=Procedure(AAnimation:TAnimation);

TAnimation=class(TThread)
...
P1: TSimpleProc;
...
Компилятор ругнётся, потому что на момент объявления типа TSimpleProc он не будет знать о существовании TAnimation. Но почему-то, при объявлении указателя на TAnimation не ругается.


 
API ©   (2006-05-15 14:47) [11]

Не люблю я компоненты, предпочитаю отдельные классы.
Какие от этого возможности появятся? Что ускорится? Не вижу смысла, просветите.


Вы, насколько я понимаю, выложили свой класс на всеобщее обозрение, и, возможно, всеобщее использование. Начальная идеология Delphi - компонентная. То есть, просто... эээ... компонент - это так принято. :-)

Плюс к тому же, "настраивать" анимации в дизайн-тайм, загружать растры (в тот же DFM) - удобнее при работе с компонентами. Тем и хороша Delphi IDE, что можно почти все увидеть на этапе разработки.

>Но лучше бы сделать некий мастер-класс
Тоже вариант, но это уже будет слишком громоздко


А это уже как Вы реализуете - так и будет. ;-)


 
Zeqfreed ©   (2006-05-15 14:49) [12]

I>
> Компилятор ругнётся, потому что на момент объявления типа
> TSimpleProc он не будет знать о существовании TAnimation.
> Но почему-то, при объявлении указателя на TAnimation не
> ругается.

Можно добавить строку TAnimation = class; перед объявлением TSimpleProc и компилятор будет знать что далее должно будет встретиться объявление TAnimation.


 
API ©   (2006-05-15 14:49) [13]

TAnimation = class;

TSimpleProc=Procedure(AAnimation:TAnimation);

TAnimation=class(TThread)
...
P1: TSimpleProc;


 
antonn ©   (2006-05-15 14:49) [14]

тоже писал когда то подобное... имхо, лучше в классе иметь TList, для кадров создавать битмапы ипомещать на них указатели в TList. Плюс - битмапы могут быть разных габаритов. Но это - если нужно подобное...


 
API ©   (2006-05-15 14:55) [15]

имхо, лучше в классе иметь TList, для кадров создавать битмапы ипомещать на них указатели в TList

Я бы ограничился TImageList...
Плюс, не инкапсулировать бы его в класс аниматора, а сделать опубликованное свойство типа TImageList, и привязывать это свойство к любому ImageList"у, при необходимости "на лету" меняя анимацию. Кроме того, при необходимости воспроизвести анимации с одинаковыми наборами кадров в нескольких местах, будут беречься ресурсы - так как сами растры будут хранится только в одном месте.
Ну и все такое...


 
boalse ©   (2006-05-15 15:06) [16]

API ©   (15.05.06 14:49) [13]
Кррруто! Не знал такого! Спасибо!


 
liven ©   (2006-05-15 15:10) [17]


> Надеюсь, кому-нибудь пригодится.  Класс для воспроизведения
> анимации в Windows-приложениях, хранящейся в одном bmp-файле
> (потоке).
> Воспроизведение идёт на любом канвасе без всяких там таймеров.
>  Предусмотрены достаточно большие возможности по управлению
> анимацией.
>
> http://boalse.narod.ru/TAnimation.rar
>
> Естественно, буду рад, если укажете на ошибки.
>

хорошая вешь! посиба!


 
boalse ©   (2006-05-15 15:11) [18]

Хотелось бы получить ответ на это:

>>Много участков кода с блокированием/разблокирование канвы - но без
>>ry..finally

>А надо? Как это должно выглядить?

>lock
>try
> Draw
>finally
> UnLock
>end;
>Так???


 
boalse ©   (2006-05-15 15:13) [19]


> хорошая вешь! посиба!

Рад, что понравилось.


 
API ©   (2006-05-15 15:22) [20]

Так???

Так.
А что не нравится?



Страницы: 1 вся ветка

Текущий архив: 2006.06.11;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.044 c
2-1148385586
skandri
2006-05-23 15:59
2006.06.11
Вырезание части bmp


15-1147868546
syte_ser78
2006-05-17 16:22
2006.06.11
зачем нужна клавиша scroll lock?


1-1146570566
zhegulov
2006-05-02 15:49
2006.06.11
Проблемка с XML-файлом


2-1148540655
rra
2006-05-25 11:04
2006.06.11
Ошибка закрытия основной формы из другой...


2-1148379837
VitV
2006-05-23 14:23
2006.06.11
DBDatetimeEditEh.text:=datetostr(now);-проблема.