[akabana-user:104] Re: <S2Flex2>S2Flex2を使用しているswfをmx.moduleを使用してアンロードした際、処理を実行すると例外がはっせいする。
Daichi Shinozaki
[E-MAIL ADDRESS DELETED]
2007年 3月 8日 (木) 20:56:07 JST
篠崎と申します。
ちょっと気になったのですが、
s2flex2-components.swc は、Flex 2.0.1でコンパイルし直していますか?
--kondo<[E-MAIL ADDRESS DELETED]> wrote:
>近藤(nobu)です。
>
>長いタイトルですみません。m( _ _ )m
>しかもこの後長文で更にすみません。m( _ _ )m
>
>S2Flex2を使用してDBから情報を取得、一覧表示するアプリを作っています。
>ただ、今回、そのアプリをモジュール(mx.module)にして、他のアプリ
>(こちらはmx.application)から呼び出させています。
>この時に、S2Flex2から(だと思う)例外が発生しています。
>
>■概要
>1.アプリA、モジュールBを作成。
>2.アプリAからモジュールBをロード。->ModuleLoader.loadModule()
>3.モジュールBで、DB参照->一覧表示を行う。(S2Flex2使用)
>4.アプリAからモジュールBをアンロード。->ModuleLoader.unloadModule()
>5.また、アプリAからモジュールBをロード。->ModuleLoader.loadModule()
>6.またモジュールBでDB参照->一覧表示を行おうとすると例外発生。
>
>===================================================================
>■例外内容
>TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッ
>ドにアクセスすることはできません。
> at mx.managers::CursorManager$/setBusyCursor()
> at org.seasar.flex2.rpc.remoting::S2Flex2Service/::setupCursor()
> at org.seasar.flex2.rpc.remoting::S2Flex2Service/::remoteCall()
> at Function/http://adobe.com/AS3/2006/builtin::apply()
> at
>org.seasar.flex2.rpc.remoting::S2Flex2Service/http://www.adobe.com/2006/actionscript/flash/proxy::callProperty()
> at demoapp.web.app01::App01Page/read()
> at demoapp.web.app01::App01Page/readBtnOnClick()
>===================================================================
>
>なんか、setBusyCursor()内でエラーが発生している??ように見えます。
>
>現在わかっていることは、
>1.unloadModule()を実行しなければこの現象は発生しない。
> ※ただ、mx.ModuleはunloadModule()を使用しない場合、インスタンスを使い
> まわすようで、前回の状態を保持したままLoadされる。
>2.SWFLoaderではこの問題は発生しない。
> ※そもそもSWFLoaderにはunloadがない。(ガベコレ任せと信じます)
>
>SDKのソースを見てみると、flash.display.Loaderの生成・破棄をやってるので
>、このあたりが怪しいような・・・というところで力尽きました。unloadModule
>で何か破棄されてしまっているのではないかと思うのですが・・・。
>
>何かお分かりでしたら、アドバイスをお願い致します。
>
>
>■環境
>Eclipse 3.2.1 + Language Pack
>Flex Builder 2.0.1
>Tomcat Plug-in
>Dolteng 0.17.0
>DbLuancher
>
>
>以下、ソース。(S2Flex2を利用しているところまで。Dolteng使用)
>===================================================================
>■Main.mxml(メイン)
><?xml version="1.0" encoding="utf-8"?>
><mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
>layout="absolute" xmlns:ns1="demoapp.web.menu.*" height="360"
>creationComplete="init()">
> <mx:Script>
> <![CDATA[
> import mx.events.FlexEvent;
> import mx.events.StateChangeEvent;
> import mx.controls.Alert;
> import mx.modules.ModuleLoader;
>
> private function init():void
> {
> // 初期表示は menu state
> this.currentState = 'menu';
> }
>
>
> private function stateMenuOnEnterState(e:FlexEvent):void
> {
> }
>
>
> private function stateMenuOnClick(e:MouseEvent):void
> {
>
><<ModuleLoader.loadModule()実行部>>
>
> ModuleLoader(this.states[1].overrides[2].target).url = "App01e.swf";
> this.currentState='app'
> }
>
>
> private function stateAppOnEnterState(e:FlexEvent):void
> {
> // かなり無理やり・・・statesの特定のアプリケーションを取得できないもの
>か・・・。
> ModuleLoader(this.states[1].overrides[2].target).loadModule();
> }
>
> private function stateAppOnClick(e:MouseEvent):void
> {
>
><<ModuleLoader.unloadModule()実行部>>
>
> ModuleLoader(this.states[1].overrides[2].target).unloadModule();
> this.currentState = 'menu'
> }
> ]]>
> </mx:Script>
>
>
> <mx:states>
> <mx:State name="menu" enterState="stateMenuOnEnterState(event)">
> <mx:AddChild position="lastChild">
> <mx:Button x="10" y="10" label="app" click="stateMenuOnClick(event)"/>
> </mx:AddChild>
> <mx:AddChild position="lastChild">
> <ns1:MenuCmp x="10" y="40" width="463">
> </ns1:MenuCmp>
> </mx:AddChild>
> </mx:State>
> <mx:State name="app" enterState="stateAppOnEnterState(event)">
> <mx:AddChild position="lastChild">
> <mx:Button x="10" y="10" label="close" click="stateAppOnClick(event)"/>
> </mx:AddChild>
> <mx:AddChild position="lastChild">
> </mx:AddChild>
> <mx:AddChild position="lastChild">
> <mx:ModuleLoader x="10" y="40" width="442" height="310" id="loader">
> </mx:ModuleLoader>
> </mx:AddChild>
> </mx:State>
> </mx:states>
>
>
></mx:Application>
>
>■App01e.mxml(S2Flex2を使用しているアプリ。mx.moduleで作成)
><?xml version="1.0" encoding="utf-8"?>
><mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" width="364"
>height="264" xmlns:ns1="demoapp.web.app01.*">
> <ns1:App01 width="100%" height="100%">
> </ns1:App01>
></mx:Module>
>
>
>■App01.mxml(App01e.mxmlの実態(コンポーネント))
><?xml version="1.0" encoding="utf-8"?>
><mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="366"
>height="262" xmlns:seasar="http://www.seasar.org/s2flex2/mxml"
>xmlns:app01="demoapp.web.app01.*">
> <seasar:S2Flex2Service id="service" destination="app01_app01Service"
>showBusyCursor="true"/>
> <app01:App01Page id="page"/>
>
> <mx:Button x="0" y="0" label="read" id="readBtn"/>
>
> <mx:DataGrid x="0" y="28" width="100%" height="234" id="dg">
> <mx:columns>
> <mx:DataGridColumn headerText="社員コード" dataField="empCd"/>
> <mx:DataGridColumn headerText="社員名" dataField="empNm"/>
> <mx:DataGridColumn headerText="部署コード" dataField="pstCd"/>
> </mx:columns>
> </mx:DataGrid>
>
> <mx:Label x="60" y="2" text="0" width="90" textAlign="right" id="recCnt"/>
> <mx:Label x="158" y="2" text="件" width="22"/>
>
></mx:Canvas>
>
>
>■App01Page.as(App01.mxmlのPageクラス)
>package demoapp.web.app01 {
>
> import mx.controls.Alert;
> import mx.rpc.AsyncToken;
> import mx.rpc.events.ResultEvent;
> import mx.rpc.events.FaultEvent;
> import flash.events.Event;
> import demoapp.entity.mst.MstEmployee;
> import demoapp.web.AbstractPage;
> import demoapp.web.AppMode;
> import flash.events.MouseEvent;
> import mx.collections.ArrayCollection;
>
> [Bindable]
> public class App01Page extends AbstractPage {
>
> public var model: MstEmployee;
>
> public var appMode: int;
>
> override public function onCreationComplete(event: Event): void {
> super.onCreationComplete(event);
> setInitEntryMode();
> }
>
> public function setInitEntryMode(): void {
> appMode = AppMode.NEUTRAL;
> model = null;
> }
>
> public function setNewEntryMode(): void {
> appMode = AppMode.NEW;
> }
>
> public function setCorEntryMode(): void {
> appMode = AppMode.COR;
> }
>
> public function convertFormData(): void {
> loadFormData(this.model);
> }
>
> /**
> * 情報取得メソッド
> *
> */
> public function read():void {
> remoteCall(service.read(), readOnSuccess, readOnFault);
> }
> public function readOnSuccess(e:ResultEvent, token:Object=null):void {
> var mArray:Array = e.result as Array;
> var mArrayCollection:ArrayCollection = new ArrayCollection(mArray);
>
> // 取得結果をDataGridにバインディング
> document.dg.dataProvider = mArrayCollection;
>
> // 件数を表示
> document.recCnt.text = mArrayCollection.length;
> }
> public function readOnFault(e:FaultEvent, token:Object=null):void {
> Alert.show("read is fault");
> }
>
> public function readBtnOnClick(e:MouseEvent):void
> {
> read();
> }
> }
>}
>===================================================================
>
>_______________________________________________
>akabana-user mailing list
>[E-MAIL ADDRESS DELETED]
>https://ml.seasar.org/mailman/listinfo/akabana-user
>
>
>
akabana-user メーリングリストの案内