Просмотр полной версии : Доступ к свойствам загруженного SWF
Всем привет.
через SWFLoader загружаю swf-ку, ну например тот же RichTextEditor
Как мне получить доступ к его свойствам??
В мануале наткнулся на такую вот фигню:
Class LoaderInfo:
content property
content:.DisplayObject [read-only]
Не может же быть так, что этой возможности в принципе не существует (((
ну и в чем вопрос ? content и есть твоя сфвка.
http://www.newviewnetworks.com/nvnhome/experiments/avm3flex2/avm3flex2.html
исходник посмотри. там организуется доступ к свойствам и методам загруженного свф через mc = MovieClip(f9.content), где f9 - свф девятой версии. Обращение идет потом следующим образом: mc.boxes_mc.play();
asuri, read-only имелось ввиду, что ты не можешь изменить его у SWFLoader.
Так, ну это всё конечно хорошо. Вот только как мне быть, если я хочу загрузить не мувик, а flex-овую swf-ку. Ну например в отдельном mxml создам TextInput, откомпилю его в input.swf, потом загружу этот input.swf и захочу в нем что-нибудь написать?
как мне это сделать?
для начала почитать хелп ). там все есть, ну а потом использовать полученые знания на практике.
Ну да, а я всё это время ждал ответа и не искал да? ))))
Ну подскажите хоть где именно читать то, раз вы знаете.. Я читал, у меня не получается полуить доступ к мувику. Максимум- я могу прочитать его имя и всё..
Показывай исходник с проблемой.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" >
<mx:Script>
<![CDATA[
import mx.controls.RichTextEditor;
private var mc:MovieClip = null;
public function init(event:Event) : void {
mc = MovieClip(f9.content);
}
public function play() : void {
// Play movieclip
trace(mc.numChildren);
trace(mc.getChildAt(0).name);
mc.getChildAt(0).name='test_rte';
trace(mc.getChildAt(0).name);
}
]]>
</mx:Script>
<mx:SWFLoader init="init(event)" width="100%" height="100%" source="assets/RTE.swf" autoLoad="true" id="f9" x="10"/>
<mx:Button label="Test" click="play()" x="10" y="328"/>
</mx:Application>
Здесь RTE.swf - это
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="400" height="300">
<mx:RichTextEditor x="0" y="0" width="400" height="300">
</mx:RichTextEditor>
</mx:Application>
строки:
trace(mc.numChildren);
trace(mc.getChildAt(0).name);
mc.getChildAt(0).name='test_rte';
trace(mc.getChildAt(0).name);
выводят:
1
RTE12
test_rte
То есть доступ к флешке вроде есть. Но только к свойству Name. А вот как поменять text или width, height - не понятно.
Нужно понимать, что загружаемая флешка это тот же класс со своими методами и свойствами, поэтому чтобы было счастье сделай так
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="400" height="300">
<mx:RichTextEditor id="myOutsideRichEditor" x="0" y="0" width="400" height="300">
</mx:RichTextEditor>
</mx:Application>
и обращайся так
myLoadedMc.myOutsideRichEditor.text = "почти угадал )";
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" >
<mx:Script>
<![CDATA[
import mx.controls.RichTextEditor;
import mx.core.UIComponent;
private var mc:MovieClip = null;
public function init(event:Event) : void {
mc = MovieClip(f9.content);
}
public function play() : void {
var component:UIComponent = mc.getChildAt(0) as UIComponent;
var rte:RichTextEditor = component.getChildAt(0) as RichTextEditor;
rte.text = 'Yahooo!';
}
]]>
</mx:Script>
<mx:SWFLoader init="init(event)" width="100%" height="100%" source="RTE.swf" autoLoad="true" id="f9" x="10"/>
<mx:Button label="Test" click="play()" x="10" y="328"/>
</mx:Application>
rte глыбже. Хотя имя тоже надо было задать.
:D только имячко то удобнее чем по чаилдам ) нужно еще помнить о том что адоб попереопределял методы для работы с чаилдами у компонент (т.е 5-10% вероятнось буга есть) поэтому, береженого бог бережет )
Понятно, что по чайлдам не стоит лазить, только вот RTE все же лежит глубже, даже с заданным именем. Проверь.
Да, второй вариант заработал, лежит и правдо глубоковато )) , всем огромное спасибо..
Знаете, я тут немного подумал и понял что загружаемые swf-ки всегда будут состоять из разных компонент или их сочетания. Ну то есть будут написыны свои компоненты.То есть получается я не могу писать:
var rte:RichTextEditor = component.getChildAt(0) as RichTextEditor;
мне надо скорее что то вроде
var rte:DisplayObject = component.getChildAt(0) as DisplayObject;
Но так не прокатывает. Как вариант, могу создать в загружаемой swf к примеру textAtea и поставить у него событие change="text_change()". тогда будувсегда заполнять только текстарии и не буду париться над типом основного компонента. Короче пример ниже. Но в этом случае почему то не корректно работает свойство change или я его не правильно понимаю. При редактировании ТекстАрии оно срабатывает, апри изменении текстарии кнопкой - не работает
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" >
<mx:Script>
<![CDATA[
import mx.controls.TextArea;
private var mc:MovieClip = null;
import mx.core.UIComponent;
public function init(event:Event) : void {
mc = MovieClip(f9.content);
}
public function play() : void {
// Play movieclip
var component:UIComponent = mc.getChildAt(0) as UIComponent;
var rte:TextArea = component.getChildAt(0) as TextArea;
rte.text = 'Yahooo!';
}
]]>
</mx:Script>
<mx:SWFLoader init="init(event)" width="100%" height="100%" source="assets/RTE.swf" autoLoad="true" id="f9" x="10"/>
<mx:Button label="Test" click="play()" x="10" y="328"/>
</mx:Application>
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="400" height="500">
<mx:Script>
<![CDATA[
public function text_gange():void{
out_rte.text=main.text;
}
]]>
</mx:Script>
<mx:TextArea x="36" y="271" width="311" height="134" id="main" change="text_gange()" dataChange="text_gange()"/>
<mx:RichTextEditor width="400" height="250" id="out_rte">
</mx:RichTextEditor>
</mx:Application>
Ты можешь кастить в UIComponent, использовать методы TextArea и проч. никто не запрещает, оно будет работать.
И что мешает вызвать метод text_gange у component?
Да и вообще:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" >
<mx:Script>
<![CDATA[
import mx.core.UIComponent;
import flash.display.Sprite;
private var mc:MovieClip = null;
public function init(event:Event) : void {
mc = MovieClip(f9.content);
}
public function play() : void {
var component:Sprite = mc.getChildAt(0) as Sprite;
var rte:UIComponent = component.getChildByName('rte') as UIComponent;
rte['text'] = 'Yahoo!'
}
]]>
</mx:Script>
<mx:SWFLoader init="init(event)" width="100%" height="100%" source="RTE.swf" autoLoad="true" id="f9" x="10"/>
<mx:Button label="Test" click="play()" x="10" y="328"/>
</mx:Application>
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="400" height="500">
<mx:RichTextEditor width="400" height="250" id="rte">
</mx:RichTextEditor>
</mx:Application>
Напрямую, без всяких там текстарий.
Скобки исключительно для того, чтобы билдер не ругался, хотя можно и без них. При таком использовании RichTextEditor не зашивается в основной swf.
Ок, спасибо большое. Сейчас буду разбираться.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.