PDA

Просмотр полной версии : Копирование чайлда


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
У тебя по дефолту стейт — 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>
Перенос панельки все равно не проходит

Nirth
10.01.2007, 15:54
Если честно я не понимаю что нужно в конечном счете...

Pablo4d
10.01.2007, 15:57
Очень нужно сделать чтобы из одного VBox можно было переносить панельку в другой VBox, причем первый VBox находиться в одном стейте, а второй в другом стейте. Пример того что я пытался сделать в первом посте топика.

Nirth
10.01.2007, 16:03
тоесть тебе нужно менять родителя одной и той же панели.
сейчас посмотрю

Nirth
10.01.2007, 16:27
Нет, не сегодня.

Стейтами я это сделать не сумел, я бы посоветовал сделать контейнер, который бы создавал в себе то что тебе нужно, и пасовал бы панель от одного контейнера к другому.

Pablo4d
10.01.2007, 16:32
жаль - а мне так срочно надо было :(((( - просто я таким образом пытался сделать раскрывающееся на полную окно размеры которого задаются контейнером, а теперь и не знаю что делать

Nirth
10.01.2007, 16:40
жаль - а мне так срочно надо было (((
Не надо давить на жалость, когда надо делают а не на форумы идут.

просто я таким образом пытался сделать раскрывающееся на полную окно размеры которого задаются контейнером, а теперь и не знаю что делать

У вас вопрос меняется с каждым постом, то вам нужно родителя менять, то вам нужно размеры менять, для смены размеров можно использовать <mx:SetProperty/> непонятно зачем все это.

Pablo4d
10.01.2007, 16:44
а я и не давлю - мене на моск уже эта проблема давит. Я просто пытался объяснить зачем мне это надо было. Извини гением не родился - поэтому как нормальный человек иду на форум за помощью.

Nirth
10.01.2007, 16:57
Я об этом и говорю, номальные люди на форум идут общатся, а не задавать срочные вопросы
Фо́рум (от лат. forum) — это площадь для массового тематического общения.
тут общаются, на тематическую тему Flash Platform'ы, а не вопросы жизни и смерти =)

ex.image
12.01.2007, 18:42
Работает однако! 20 минут проб и ошибок )))

<?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[
import flash.display.DisplayObject

private function onCopyClick(event:MouseEvent):void
{
var child:DisplayObject = playout.getChildAt(0)
playout.removeAllChildren()
playout2.addChild(child);
}
private function onCopyClick2(event:MouseEvent):void
{
var child:DisplayObject = playout2.getChildAt(0)
playout2.removeAllChildren()
playout.addChild(child);
}
]]>
</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:Label text="myPanel"/>
</mx:Panel>
</mx:VBox>
<mx:VBox x="349" y="97" height="365" width="179" id="playout2" creationPolicy="queued">
</mx:VBox>
</mx:Application>

Pablo4d
12.01.2007, 18:46
как оказалось можно еще просче -

playout2.addChild(playout.removeChild(playout.getChildAt(0)));

)) - подсказал кстати человек который флекса никогда и не видел )))

ex.image
12.01.2007, 18:48
Ну видать проблема в том что при отбирании у контейнера чайлда таким способом, в контайнере сбиваеться лист чайлдов.

etc
12.01.2007, 18:51
ex.image, а где у тебя mx:State? :D

ex.image
13.01.2007, 02:23
Слегка потенцевав с бубном вышло только вот что )) но тоже работает:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" currentState="partview">
<mx:Script>
<![CDATA[
private var cp:Panel
private function onCopyClick(event:MouseEvent):void
{
var content:DisplayObject = pnl.getChildAt(0)
application.setCurrentState('fullview')
pnl1.removeAllChildren()
pnl1.addChild(content)
pnl.removeAllChildren()
}
private function onCopyClick2(event:MouseEvent):void
{
var content:DisplayObject = pnl1.getChildAt(0)
application.setCurrentState('partview')
pnl.removeAllChildren()
pnl.addChild(content)
pnl1.removeAllChildren()
}
]]>
</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:Canvas>
<mx:TextInput width="100%"/>
</mx:Canvas>
</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:Panel id="pnl1" width="100%" height="100%" layout="absolute">
<mx:Canvas>
</mx:Canvas>
</mx:Panel>
</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>