Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   TGetProperty() в Делфи (http://www.flasher.ru/forum/showthread.php?t=174411)

XilDen 25.01.2012 00:09

TGetProperty() в Делфи
 
Люди! Огромная просьба, подскажите мне!
Проблема такая. Использую в Delphi компонент ActiveX Shockwave Flash. Пытаюсь на его основе сделать свой компонент, добавив в него свойство AutoSize и прочие надстройки. Но столкнулся с тем, что не могу определить ширину и высоту загружаемого Swf ролика.
Воспользовался функцией TGetProperty(). В неё нужно передавать 2 параметра - имя объекта, и номер свойства. 8 и 9 свойствам соответствуют ширина и высота. В качестве объекта я передаю _root. Таким образом, код выглядит следующим образом:
Код:

edt1.Text:=flash.TGetProperty('_root', 8);
edt2.Text:=flash.TGetProperty('_root', 9);

Однако, возвращаемые значения не совсем соответствуют тем, что мне необходимы. Потому что он определяет ширину и высоту с учётом объектов, которые находятся за пределами области видимости. А как вы понимаете, во многих мультиках, да и программах, очень часто за пределами зоны видимости могут располагаться объекты, чтобы в определённый момент времени "выскочить" на экран.
К тому же, если на сцене объект меньше, чем видимая область, и в кадре не присутствует больше ничего, возвращаются не размеры видимой области, а размеры этого объекта.

Подскажите, какое имя объекта нужно передать в функцию TGetProperty(), чтобы узнать ширину и высоту видимой области сцены swf файла? Размер того самого белого прямоугольника, ширина и высота которого задаётся в свойствах документа во Флеше.
В PHP есть функция Getimagesize(), которая умеет определять ширину и высоту этой области, но на Делфи мне этого сделать до сих пор не удаётся... Читал, что в ActionScript можно обращаться через Stage.Width, но передать Stage в качестве имени объекта в функции не получается, выскакивает ошибка...
Буду очень признателен за помощь!

mooncar 25.01.2012 00:13

Код в сообщении необходимо выделять соответственными тегами.

usacha 25.01.2012 21:26

Цитата:

имя объекта, и номер свойства.
Раз уж там свойства пронумерованы (!!!! ну бред же. Не на асме же пишут.) значит на стороне флеша они могут называться как угодно.
По идее во флеше надо брать stage.stageHeight / stage.stageWidth, а афтары компонента берут stage.height / stage.width.

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

XilDen 25.01.2012 22:37

Нет, размер сцены я менять не собираюсь. Проблема в том, чтобы размер флеш-контейнера был равен размеру ролика при 100%-ом масштабе. Иначе, ролик либо не влезает в контейнер, выходя за его пределы, либо масштабируется под размеры контейнера (в зависимости от значения одного атрибута). Разумеется, подогнать для конкретного swf ролика размер контейнера руками - совершенно не проблема, и минутное дело. Но моя задача автоматизировать этот процесс на уровне компонента, в момент подгрузки в контейнер ролика. Ну а также и другими функциями наделить его. например, поверх контейнера создавать невидимую прозрачную загрушку, которая заблокирует возможность нажатия мышкой на сам контейнер. Типо витрина магазина - смотреть можно, трогать нельзя. Нельзя нажимать на кнопки в swf если они есть. нельзя нажимать правую кнопку мыши, управлять качеством ролика, зумом. Просто графический компонент аля "картинка". Хочу создать аналог TGIFImage, но только вместо убогой gif анимации с 256 цветами, чтобы была возможность подгружать в программу хорошую flash анимацию.

Узнал, что необходимый мне размер ролика хранится в сигнатуре swf файла в начальных байтах. Но достать её можно только если не выполнена компрессия файла. Однако, почти все современные swf файлы сжимаются, поэтому первоначально нужно их декомпрессировать с помощью функционала библиотеки zlib.dll. С этим конечно гемор... Нашёл исходник такой проги на С++, но чтобы переписать её в Делфи, придётся попотеть..((

alatar 26.01.2012 13:03

Внутри флешки, после загрузки, размеры заданные при компиляции можно узнать у LoaderInfo (width / height) рута.

Добавлено через 7 минут
Цитата:

Однако, почти все современные swf файлы сжимаются, поэтому первоначально нужно их декомпрессировать с помощью функционала библиотеки zlib.dll
Плеер 11.1 поддерживает новый вид компресии LZMA, если планируете загрузку разных флешек, проверьте поддержку в zlib.

XilDen 26.01.2012 17:01

Слышал ещё, что возможно как то взломать flash.ocx и переписать его под свои нужды. Кому нибудь что то об этом известно?


Часовой пояс GMT +4, время: 07:43.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.