Просмотр полной версии : Таг Inspectable в AS3.
Подскажите пожалуйста, почему при запуске кода
package classes {
import fl.core.UIComponent;
public class C extends UIComponent{
[Inspectable(name="param1", defaultValue="Word")]
var sel:String;
public function C() {
trace("param1="+sel);
}
}
}
я получаю param1=null?
В ComponentInspector-е, как и должен был, появился параметр param1, его значение, как и должно быть, "Word"
--------------------------------------
Если этот таг в AS3 не поддерживается(хелп на сей счет безмолвствует), то почему оболочка нормально его воспринимает и как организовать передачу параметров экземпляру класса?
--------------------------------------
млин. 4 часа гугл мучал - так и не нашел примеров.
помоги, плз, если в курсе - я реально запарился.
По всему выходит, что использовать Inspectable можно, но ни 1 примера в as3 так и не нашел.
у меня тоже не получаетсяь :)
ты указал тип переменной, но это не прибавляет ни убавляет значения (содержания) этой пустой (null) переменной. Читать азы ООП или биться головой об стену.
Стен, уже в процессе изучения AS2, целых не осталось...:)
Указал я не только тип, но и defaultValue(если ты не заметил). В AS2 это на ура работало, про какие-то изменения при переходе к AS3 ничего нигде не нахожу - вот и интересуюсь настойчиво..
Уснул тут не о том речь.
Автор я так понимаю вы делаете ActionScript Project а не Flex? если я прав то тэг [Inspectable] как и [Bindable] работают только при компиляции Flex проектов(или swc библиотек для проектов) где компилятор сам вручную подставляет все что надо, при компиляции ActionScript проектов ничего подобного не происходит.
2 Nirth, 2_etc: Я все понял. Спасибо большое.
-------------------------------------------
тэг [Inspectable] как и [Bindable] работают только при компиляции Flex проектов(или swc библиотек для проектов)
2 Nirth Понять-понял, а сделать все равно не получается.:(
- Компилирую мувик в SWC
- Захожу в Components
- Выкладываю скомпилированный мувик на сцену
1) компонент, как и раньше, игнорит defaultValue, хотя в CompomemtInspector-е оно прописывается верно
2) При попытке изменения параметра в ComponentInspectror-е, получаю ошибку:
ReferenceError: Error #1056: Cannot create property s on C.
at TestC_fla::MainTimeline/TestC_fla::__setProp___id0__Scene1_Layer1_1()
at TestC_fla::MainTimeline$iinit()
Ну во первых [Inspectable] [Event] [Style] прекрассно работают и в компонентах флэша CS3, но вот переменная перед которой ты объявляешь метатаг [Inspectable] должна быть хотя бы public для начала. тут например подобная проблема (http://www.webforumz.com/macromedia-flash/34847-flash-cs3-inspectable-metatags.htm)
во вторых по ошибке "ReferenceError: Error #1056: Cannot create property s on C" - это явно не тот код что ты привел в начале.
Код в студии короче.
Код в прикрепленном ZIP файле.
Вот он:
package {
import fl.core.UIComponent;
public class C extends UIComponent{
[Inspectable(name="param1", defaultValue=true)]
public var s:Boolean;
public var n:Boolean;
public function C() {
trace("Имеем: "+ s+"; "+n); //Выдает "Имеем: false; false"
trace("Нужно: true; false")
}
}
}
После того, как добавил "Public", ошибка выскакивать перестала, однако изменяемый параметр экземпляром на сцене все-равно не воспринимается.
--------------------------------
2 7thsky™: За ссылку спасибо - на эту не натыкался. Там, в принципе, то-же самое, что Nirth ответил...
Я не уверен (не работал с компонентами флэша, все флекс, да флекс...) но я бы попытался сначала бы:
* прописать тип [Inspectable(name="param1", type="Boolean" defaultValue="true")]
* и сделать нормальное свойство через getter | setter
не уверен что поможет
Пробовал - "по нулям".. Не знаю что у того парня на буржуйском форуме заработало, но у меня его код ведет себя так-же как и мой собственный.. то есть никак.:)
*Могу я во флексе перевести as2 компоненты на as3 и, после этого использовать их для работы в cs3? (иными словами: дружат ли flex и cs3?)
Flex и CS3 дружат
Flex и AS2 дружат только через жопу (LocalConnection)
Ладно. Пока на работу с XML все перестрою.. Благо не слишком много перестраивать.. Всем большое спасибо.
flyberok
28.10.2012, 23:17
Вообщем возможно зря подымаю старую тему, но сам боролся с проблемой что и у автора: не присваивались значения заданные в component parametrs.
Параметр задается через тег Inspectable и следующий за ним переменой или set функции. Пример:
[Inspectable(type="Color",defaultValue="#00ff00")]
public var tlColor;
Если наследовать от UIComponent который в свою очередь расширяет Sprite, то все хорошо.
Чтобы напрямую расширять Sprite, например и получать параметры заданный через Flash CS, надо повесить слушатель события stage.addEventListener(Event.ADDED,listener_function);
и когда
private function listener_function(e:Event){
if(getQualifiedClassName(e.target)=="test_fla::MainTimeline"){
trace("tlColor="+tlColor);
}
}
Вообщем я придумал пока только такой способ, может где то уже решена эта проблема, но я не нашел, а расширять UIComponent с множеством не нужных и не понятных вещей пока не хотелось.
Еще как вариант можно повесить на ENTER_FRAME и как только переменная наша начнет существовать, т.е. по логике при первом срабатывании ENTER_FRAME, то удаляем слушателя и дальше действуем в рамках нужд создаваемого компонента. В UIComponent в некоторый момент времени срабатывает Event.RENDER у stage видно оно всплывает при проверке стиля или иная какая радость, но попытавшись отработать это событие у себя я ничего не добился, сработала на ENTER_FRAME ну я еще взял и поэксперементировал и нашел Event.ADDED у Stage.
А у автора пробема решилась бы, если бы он отрабатывал бы изменение параметра в методе draw() или повесил бы обработчик на stage.addEventListener(Event.Render,function(e:Event){});
package classes {
import fl.core.UIComponent;
public class C extends UIComponent{
private _sel:String="";
public function C() {
super();
}
[Inspectable(name="param1", defaultValue="Word")]
public function set sel(s:String):void{
_sel=s;
this.invalidate();
}
public function get sel():String{
return _sel;
}
override protected function draw():void{
// Отрисовка изменений
}
}
}
render не случается сам по себе, его надо форсировать вызвав, например, stage.invalidate().
У меня просто нету Flash CS, но как-то все равно не понятно в чем именно проблема... Неужели сеттер не вызовется, когда свойству с [Inspectable] назначат новое значение? Смысл этой метадаты в том, чтобы программа, которая отображает компоненты в каком-нибудь своем визуальном редакторе знала бы как предложить пользователю способ назначить этим свойствам значения. Собственно и все... Т.е. если у вас есть кнопка, то вы можете создать ей inspectable текст, и в каких-то программах (на самом деле только во Флеше самом, в Флеш Билдере была такая штука, но от нее отказались, в Идее, на сколько знаю - не допилили.) будет создан соответствующий компонент для задания текста.
Сказать по правде - люди очень по-разному к этому относятся, есть такие, кому это помогает. Я не пользовался никогда, и смысла особого не видел...
flyberok
29.10.2012, 13:12
Да, сеттер вызывается, у меня попутно ошибка вылетала и не получалось, а автор set'ом и не пользовался как я понял в этом и была его ошибка, пытался получить свойство прямо из конструктора.
А нужно это для того, чтобы сбацать эффект, которым надо пользоваться дизайнеру.
Смысл компонента таков: берется фигура и она заполняется мелкими звездами, которые анимированы и масштабируются, меняются кое-какие параметры для лучшего заполнения фигуры элементами, поэтому и решил сделать как компонент.
djyamato
29.10.2012, 15:01
сорри, ошибся
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.