Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.06.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.021 c
2-1148801707
Вася
2006-05-28 11:35
2006.06.11
день недели


15-1147658354
Arazel
2006-05-15 05:59
2006.06.11
Пойск похожех слов по файлу (Как в DELPHI по CTRL+SPACE)


2-1148732567
Revan
2006-05-27 16:22
2006.06.11
Настройка громкости


2-1148449496
pavel_guzhanov
2006-05-24 09:44
2006.06.11
FastReport 3 и Delphi7


15-1147763288
Kolan
2006-05-16 11:08
2006.06.11
Где взять про объектное связывание?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский