Просмотр полной версии : Копирование чайлда
Всем привет. Потратил полночи и так не втыкнул в чем баг, а разрешить его надо просто позарез
<?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. Что я упустил ри такой казалось бы простой операции???
У меня проект в котором типа такого механизма надо использовать - а приведенный код это обычное MXML приложение.
Знаешь, вот проблема в том, что я не могу твой код скопировать, вставить и чтобы он работал…
ибо Could not resolve <mx:Application> to a component implementation.
UPD: Нашел косяк, щас посмотрю.
У тебя по дефолту стейт — partview, жмем на button1, попадаем в fullview и видим там нашу панельку, скопированную из предыдущего стейта. Ты это хотел сделать? Оно работает.
Или я тебя не до конца понял… Зачем тебе при возврате в partview копировать Panel, если он уже там есть?
У тебя по дефолту стейт — 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>
все равно таже ошибка :(
Толку от этого мало, машина падает при переходе в partview. Ща мучаю Nirth-а на эту тему…
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("booooo")}"/>
</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 (при всем уважении к нему) подменил уже цель - цель в динамическом переносе объекта из одного стейта в другой - здесь же мы имеем статическое определение стейтов. Даже вот такое писать не надо было
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>
Перенос панельки все равно не проходит
Если честно я не понимаю что нужно в конечном счете...
Очень нужно сделать чтобы из одного VBox можно было переносить панельку в другой VBox, причем первый VBox находиться в одном стейте, а второй в другом стейте. Пример того что я пытался сделать в первом посте топика.
тоесть тебе нужно менять родителя одной и той же панели.
сейчас посмотрю
Нет, не сегодня.
Стейтами я это сделать не сумел, я бы посоветовал сделать контейнер, который бы создавал в себе то что тебе нужно, и пасовал бы панель от одного контейнера к другому.
жаль - а мне так срочно надо было :(((( - просто я таким образом пытался сделать раскрывающееся на полную окно размеры которого задаются контейнером, а теперь и не знаю что делать
жаль - а мне так срочно надо было (((
Не надо давить на жалость, когда надо делают а не на форумы идут.
просто я таким образом пытался сделать раскрывающееся на полную окно размеры которого задаются контейнером, а теперь и не знаю что делать
У вас вопрос меняется с каждым постом, то вам нужно родителя менять, то вам нужно размеры менять, для смены размеров можно использовать <mx:SetProperty/> непонятно зачем все это.
а я и не давлю - мене на моск уже эта проблема давит. Я просто пытался объяснить зачем мне это надо было. Извини гением не родился - поэтому как нормальный человек иду на форум за помощью.
Я об этом и говорю, номальные люди на форум идут общатся, а не задавать срочные вопросы
Фо́рум (от лат. 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>
как оказалось можно еще просче -
playout2.addChild(playout.removeChild(playout.getChildAt(0)));
)) - подсказал кстати человек который флекса никогда и не видел )))
ex.image
12.01.2007, 18:48
Ну видать проблема в том что при отбирании у контейнера чайлда таким способом, в контайнере сбиваеться лист чайлдов.
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>
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.