Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Копирование чайлда (http://www.flasher.ru/forum/showthread.php?t=90395)

Pablo4d 10.01.2007 14:05

Копирование чайлда
 
Всем привет. Потратил полночи и так не втыкнул в чем баг, а разрешить его надо просто позарез

Код:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx=" http://www.adobe.com/2006/mxml" layout="absolute" currentState="partview" width="100%" height="100%">
<mx:Script>
<![CDATA[
private var cp:Panel
private function onCopyClick(event:MouseEvent):void
{
cp=pnl;
application.setCurrentState('fullview')
fullc.addChild(cp);
}
private function onCopyClick2(event:MouseEvent):void
{
trace(playout+"|"+cp)
playout.addChild(cp);
if (fullc.getChildren().length>0)
{
fullc.removeAllChildren();
}
application.setCurrentState('partview')
}
]]>
</mx:Script>
<mx:states>
<mx:State name="partview">
<mx:AddChild position="lastChild">
<mx:VBox id="playout" x="32" y="88" height="351" width="287">
<mx:Panel id="pnl" width="100%" height="100%" layout="absolute">
</mx:Panel>
</mx:VBox>
</mx:AddChild>
</mx:State>
<mx:State name="fullview">
<mx:AddChild position="lastChild">
<mx:VBox id="fullc" x="0" y="58" width="100%" height="100%">
</mx:VBox>
</mx:AddChild>
</mx:State>
</mx:states>
<mx:ApplicationControlBar x="0" y="0" width="100%" height="50">
<mx:Button label="Button1" click="onCopyClick(event)"/>
<mx:Button label="Button2" click="onCopyClick2(event)"/>
</mx:ApplicationControlBar>
</mx:Application>

пытаюсь копировать чайлда из стейта в стейт и вылетает ошибка RangeError: Error #2006: The supplied index is out of bounds. Что я упустил ри такой казалось бы простой операции???

etc 10.01.2007 14:08

Есть рабочий проект?

Pablo4d 10.01.2007 14:17

У меня проект в котором типа такого механизма надо использовать - а приведенный код это обычное MXML приложение.

etc 10.01.2007 14:30

Знаешь, вот проблема в том, что я не могу твой код скопировать, вставить и чтобы он работал…
ибо Could not resolve <mx:Application> to a component implementation.

UPD: Нашел косяк, щас посмотрю.

etc 10.01.2007 14:47

У тебя по дефолту стейт — partview, жмем на button1, попадаем в fullview и видим там нашу панельку, скопированную из предыдущего стейта. Ты это хотел сделать? Оно работает.
Или я тебя не до конца понял… Зачем тебе при возврате в partview копировать Panel, если он уже там есть?

Pablo4d 10.01.2007 15:13

Цитата:

Сообщение от __etc
У тебя по дефолту стейт — partview, жмем на button1, попадаем в fullview и видим там нашу панельку, скопированную из предыдущего стейта. Ты это хотел сделать? Оно работает.
Или я тебя не до конца понял… Зачем тебе при возврате в partview копировать Panel, если он уже там есть?

В хелпе написано что объект добавленный с помощью addChild не может одновременно существовать в разных контейнерах - поэтому копируя в VBox fullview он насколько я понимаю исчезает из контейнера VBox partview -- и соответственно при возврает нужно обратно его скопировать из fullview в partview

и даже если сделать вот так
Код:

        <mx:Script>
                <![CDATA[
                        private var cp:Panel
                        private function onCopyClick(event:MouseEvent):void
                        {
                                application.setCurrentState('fullview')
                                fullc.addChild(playout.getChildAt(0));
                        }
                        private function onCopyClick2(event:MouseEvent):void
                        {
                                application.setCurrentState('partview')                               
                                //playout.addChild(fullc.getChildAt(0));
                               
                        }
                ]]>
        </mx:Script>

все равно таже ошибка :(

etc 10.01.2007 15:16

Толку от этого мало, машина падает при переходе в partview. Ща мучаю Nirth-а на эту тему…

etc 10.01.2007 15:38

Nirth предложил вариант с внешней панелью:
Код:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" currentState="partView" width="100%" height="100%" verticalAlign="top" horizontalAlign="center">
 <mx:states>
  <mx:State name="fullView">
  <mx:SetProperty target="{panel1}" name="title" value="Full View"/>
  <mx:AddChild relativeTo="{panel1}" position="lastChild">
    <mx:Button label="Click Me" click="{mx.controls.Alert.show(&quot;booooo&quot;)}"/>
  </mx:AddChild>
  <mx:SetStyle target="{panel1}" name="horizontalAlign" value="center"/>
  <mx:SetStyle target="{panel1}" name="verticalAlign" value="middle"/>
  <mx:SetProperty target="{panel1}" name="layout" value="vertical"/>
  </mx:State>
  <mx:State name="partView">
  <mx:SetProperty target="{panel1}" name="width" value="50%"/>
  <mx:SetProperty target="{panel1}" name="title" value="Part View"/>
  </mx:State>
 </mx:states>
 <mx:ApplicationControlBar width="100%">
  <mx:Button label="Part View" id="button2" click="{if (currentState != 'fullView') currentState = 'fullView'}"/>
  <mx:Button label="Full View" id="button1" click="{if (currentState != 'partView') currentState = 'partView'}"/>
 </mx:ApplicationControlBar>
 <mx:Panel width="100%" height="100%" layout="absolute" id="panel1">
 </mx:Panel>
 
</mx:Application>

Судя по всему, ошибка была в том, что mx:AddChild не мог найти внутри себя Panel при переходе обратно в стейт…

Nirth 10.01.2007 15:44

интересно а почему табуляция нафиг сбивается...

Pablo4d 10.01.2007 15:51

Я смотрю Nirth (при всем уважении к нему) подменил уже цель - цель в динамическом переносе объекта из одного стейта в другой - здесь же мы имеем статическое определение стейтов. Даже вот такое писать не надо было
click="{if (currentState != 'fullView') currentState = 'fullView'}
стейты сами по сеье работают нормально , пока дело до динамики не доходит

Самое интересное что даже без стейтов
Код:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="100%" height="100%">
        <mx:Script>
                <![CDATA[
                        private function onCopyClick(event:MouseEvent):void
                        {
                                playout2.addChild(playout.getChildAt(0));
                        }
                        private function onCopyClick2(event:MouseEvent):void
                        {
                                playout.addChild(playout2.getChildAt(0));
                        }
                ]]>
        </mx:Script>
        <mx:ApplicationControlBar x="0" y="0" width="100%" height="50">
                <mx:Button label="Button1" click="onCopyClick(event)"/>
                <mx:Button label="Button2" click="onCopyClick2(event)"/>
        </mx:ApplicationControlBar>
        <mx:VBox id="playout" x="67" y="97" height="272" width="239" creationPolicy="queued">
                <mx:Panel id="pnl" width="176" height="260" layout="absolute">
                </mx:Panel>
        </mx:VBox>
        <mx:VBox x="349" y="97" height="365" width="179" id="playout2" creationPolicy="queued">
        </mx:VBox>               
</mx:Application>

Перенос панельки все равно не проходит


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

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