Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   не работает addChild (http://www.flasher.ru/forum/showthread.php?t=149346)

xaoc 23.01.2011 15:58

не работает addChild
 
Есть компонент, динамически грузит и прокручивает в себе фотки
Столкнулся с проблемой, что ни динамически, ни руками не создаются и не добавляются компоненты(фото)

Код AS3:

this.addElement(*)

работает если не обращаться внутрь создаваемого компонента, если пытаться что-то сделать там, добавления не происходит
Код AS3:

this.addChild(*)

не работает вообще, ни при каких условиях

код компонента
Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<s:BorderContainer xmlns:fx="http://ns.adobe.com/mxml/2009"
                                  xmlns:s="library://ns.adobe.com/flex/spark"
                                  xmlns:mx="library://ns.adobe.com/flex/mx" width="100%" height="95" initialize="bordercontainer1_initializeHandler(event)" backgroundColor="#000000" backgroundAlpha="0.23" xmlns:ns1="*">
        <fx:Script>
                <![CDATA[
                        import mx.events.FlexEvent;
 
                        protected function bordercontainer1_initializeHandler(event:FlexEvent):void
                        {
                                // TODO Auto-generated method stub
                                var i:Number = 0;
                                for each(var xml:XML in Slides.children())
                                {
                                        var m:Miniature = new Miniature();
                                        m.x = i*100; m.y = 0;
                                        //m.load("ds");
                                        this.addElement(m);
 
                                        i++;
                                }
 
                        }
 
                ]]>
        </fx:Script>
        <fx:Declarations>
                <!-- Place non-visual elements (e.g., services, value objects) here -->
                <fx:XML id="Slides" source="Slideshow.xml"/>
        </fx:Declarations>
 
 
 
</s:BorderContainer>

код Miniature
Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<s:BorderContainer xmlns:fx="http://ns.adobe.com/mxml/2009"
                                  xmlns:s="library://ns.adobe.com/flex/spark"
                                  xmlns:mx="library://ns.adobe.com/flex/mx" width="100" height="95" borderVisible="false">
        <fx:Script>
                <![CDATA[
                        [Embed(source="Cadr.swf")]
                        [Bindable]
                        public var cadr:Class;
                        public function load(url:String):void
                        {
                                txt.text = url;
                        }
                ]]>
        </fx:Script>
        <fx:Declarations>
                <!-- Place non-visual elements (e.g., services, value objects) here -->
        </fx:Declarations>
        <mx:SWFLoader x="0" y="0" width="100" height="95" source="{cadr}"/>
        <mx:SWFLoader id="MiniImg" x="0.9" y="12.8" width="98" height="70" scaleContent="true"/>
        <s:TextArea x="0.9" y="12.8" width="98" height="70" fontSize="10" id="txt"/>
</s:BorderContainer>

Flash Builder 4

UPD: Проблема решена :) Не актуально
Обращаться к созданному компоненту надо после его добавления, а не после объявления в переменной :)

alatar 23.01.2011 16:08

В spark контейнерах нельзя использовать addChild.
Цитата:

работает если не обращаться внутрь создаваемого компонента, если пытаться что-то сделать там, добавления не происходит
Что вы под этим подразумеваете?

xaoc 23.01.2011 16:15

Цитата:

В spark контейнерах нельзя использовать addChild.
Уже дошел опытным путем, спасибо за уточнение

Цитата:

Что вы под этим подразумеваете?
При любой попытке обратиться к объектам/функциям внутри создаваемого компонента до его добавления на сцену, просто ничего не происходит. Добавления тоже.

Уже разобрался, вызов конструктора и инициализация происходит только после добавления на сцену

alatar 23.01.2011 16:27

Цитата:

Уже разобрался, вызов конструктора и инициализация происходит только после добавления на сцену
Вызов конструктора происходит сразу. Вот тут:
Код AS3:

var m:Miniature = new Miniature();

Если под инициализацией вы подразумеваете создание внутренних компонентов объявленных в mxml, то она произойдет не сразу (зависит от нескольких факторов). Но к добавлению на сцену непосредственного отношения не имеет.

Добавлено через 16 минут
В частности внимательно прочитайте вот этот документ.

Добавлено через 22 минуты
Ну и в нагрузку. Это для компонентов Flex3, но для общего понимания полезно, ну и некоторые вещи актуальны и в flex4.

xaoc 23.01.2011 17:39

Странно.
За ссылки спасибо, ознакомлюсь

У меня выше описанный код заработал после замены

Код AS3:

m.load("ds");
this.addElement(m);

на

Код AS3:

this.addElement(m);
m.load("ds");

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

alatar 23.01.2011 17:53

Все правильно, в первом случае createChildren (attachSkin для скинируемых компонентов) еще не вызван. По-сути вам надо было сделать так:

Код AS3:

private var _url:String;
private var _urlChanged:Boolean = false;
 
public function load(url:String):void
{
    _url = url;
    _urlChanged = true;
    invalidateProperties();
}
override protected function commitProperties():void
{
  super.commitProperties();
  if (_urlChanged)
  {
      txt.text = _url;
  }
}


xaoc 23.01.2011 19:01

Благодарю. Разобрался


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

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