PDA

Просмотр полной версии : Доступ к элементам Module


litebox
09.06.2009, 15:26
Есть mxml-форма (наследник класса Module), и есть класс приложения, который этот модуль загружает для использования. Делал по Адобовским примерам, все работает кроме одного: при обращении к элементам модуля (кнопки, текстовые поля) возвращается null.
Код формы:

<?xml version="1.0" encoding="utf-8"?>
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="300" height="180" >
<mx:Script><![CDATA[
// Defines the method that the application calls.
public function init():void
{
trace(getChildByName("btnOk"));
trace(btnOk);
}
]]></mx:Script>
<mx:Button x="80" y="150" label="Ok" width="65" id="btnOk"/>
<mx:Button x="155" y="150" label="Cancel" width="65" id="btnCancel"/>
</mx:Module>

Код класса:
package mapCreator
{
import flash.display.NativeWindowSystemChrome;
import flash.events.Event;
import flash.events.MouseEvent;

import mx.core.Window;
import mx.events.ModuleEvent;
import mx.modules.ModuleLoader;

public class NewMapWindow extends Window
{
private var loader:ModuleLoader;

public function NewMapWindow(caption:String)
{
loader = new ModuleLoader();

loader.addEventListener(ModuleEvent.READY, eventFormReady);

loader.loadModule("mapCreator/NewMapDialog.swf");

addChild(loader);
}

private function eventFormReady(e:ModuleEvent):void
{
loader.removeEventListener(ModuleEvent.READY, eventFormReady);

var newMap:NewMapDialog = loader.child as NewMapDialog;

newMap.init();
}
}

}
консоль:
[SWF] MapCreator.swf - 1*062*487 bytes after decompression
[SWF] mapCreator/NewMapDialog.swf - 93*177 bytes after decompression
[SWF] mapCreator/NewMapDialog.swf - 93*177 bytes after decompression
null
null

litebox
15.06.2009, 12:13
Поставлю вопрос по другому :)
Использование класса Module вообще не принципиально: загружаемый элемент встроен в приложение "на мертво", просто это единственный способ, с помощью которого я смог использовать созданную мной mxml-форму (если можно так выразиться). Возможно есть вариант, когда mxml-форму можно связать с классом или как то слинковать (как клип во флэше), чтобы ее можно было создавать, аттачить и использовать при необходимости?

fljot
15.06.2009, 17:40
во-первых, попробуйте написать
trace(newMap.numChildren, newMap.initialized);
//newMap.init();//а это пока закомментите
, должно возникнуть кой-какие мысли=)

а во-вторых, вы упоминаете NewMapDialog в основном приложении, т.е. он вкомпиливается в основное приложение... суть модульности теряется. для модулей нужны интерфейсы

litebox
15.06.2009, 18:48
trace(newMap.numChildren, newMap.initialized);
вывел
0 false
Как бы понятно, что ничего не готово, но как то не понятно, почему :)
По поводу потери сути модульности - абсолютно согласен. Но дело в том, что я просто не нашел другого способа использовать NewMapDialog.mxml в основном приложении... Гениально, случайно попробовал такой вариант:
var newMap:NewMapDialog = new NewMapDialog();
addChild(newMap);
и, оказывается, что он работает - именно это мне и нужно было :wacko:

Felicast
16.06.2009, 01:02
а зачем вам тогда использовать Module?
не знаю ваших целей. но судя из названия класса, вы хотите сделать какое-то диалоговое окно. тогда наверно подойдет TitleWindow или просто взять Panel

litebox
16.06.2009, 11:57
Да, необходимость в модуле отпала. Вообще я пишу на AIR + flex. При выборе пункта меню New появляется объект класса Window, на который я размещаю NewMapDialog.mxml