[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 メーリングリストの案内