トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     親からの子制御(追加・削除)
投稿するにはまず登録を

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
kkk01
Åê¹ÆNo.38468
投稿日時: 2008-4-17 12:25
新米
居住地: 東京
投稿: 16
使用環境:
WinXP : Flash CS3
WinXP : Flex Builder 3
Re: 親からの子制御(追加・削除)
自己レスです。

調査を進めた結果、現象の回避はできました。

修正箇所は、Test用クラス TestDocument.as

【修正前】
  private function onAdd(e:MouseEvent):void{
   var test:Test = new Test();
   test.x = test.y = 50;
   
   addEventListener( Test.CLOSE, function actionA( e:Event ):void{
    removeEventListener( Test.CLOSE, actionA);
    removeChild( test );
   });
   
   addEventListener( Test.OK, function actionB( e:Event ):void{
    removeEventListener( Test.OK, actionB);
    removeChild( test );
   })
   addChild( test );
  }


【修正後】
  private function onAdd(e:MouseEvent):void{
   var test:Test = new Test();
   test.x = test.y = 50;
   
   addEventListener( Test.CLOSE, actionA );
   addEventListener( Test.OK, actionB );

   function actionA( e:Event ):void{
    removeEventListener( Test.CLOSE, actionA);
    removeEventListener( Test.OK, actionB);
    removeChild( test );
   };
   
   function actionB( e:Event ):void{
    removeEventListener( Test.CLOSE, actionA);
    removeEventListener( Test.OK, actionB);
    removeChild( test );
   };

   addChild( test );
  }


イベントハンドラを明示的に削除していなかったので
インスタンスへの参照が残っていたのですね。。。

同じシンボルなのでインスタンスへの参照も
都度変わるかと誤認していましたが、
別インスタンスなので参照も異なるという、
結構当たり前の箇所が原因でした。

失礼致しました。
kkk01
Åê¹ÆNo.38464
投稿日時: 2008-4-17 11:18
新米
居住地: 東京
投稿: 16
使用環境:
WinXP : Flash CS3
WinXP : Flex Builder 3
親からの子制御(追加・削除)
お世話になっております。

下記の様な機能を実装しようとしています。

ドキュメントルート
 btnAdd:ボタンインスタンス

ドキュメントルートクラスTestDocument.as
package{
 import flash.display.MovieClip;
 import flash.events.MouseEvent;
 import flash.events.Event;
 import flash.display.SimpleButton;
 
 public class TestDocument extends MovieClip{
  public function TestDocument(){
   btnAdd.addEventListener(MouseEvent.MOUSE_DOWN, onAdd);
  }
  
  private function onAdd(e:MouseEvent):void{
   var test:Test = new Test();
   test.x = test.y = 50;
   
   addEventListener( Test.CLOSE, function actionA( e:Event ):void{
    removeEventListener( Test.CLOSE, actionA);
    removeChild( test );
   });
   
   addEventListener( Test.OK, function actionB( e:Event ):void{
    removeEventListener( Test.OK, actionB);
    removeChild( test );
   })
   addChild( test );
  }
 }
}

アタッチ用子オブジェクトTest
 btnOk:ボタンインスタンス
 btnCancel:ボタンインスタンス

Test用クラス Test.as
package {
 import flash.display.MovieClip;
 import flash.events.MouseEvent;
 import flash.events.Event;
 import flash.display.SimpleButton;
 
 public class Test extends MovieClip{
  public static const CLOSE:String  = 'templateWindowClose';
  public static const OK:String  = 'templateWindowCorrect';
  
  private function onOk( e:MouseEvent ):void{
   dispatchEvent( new Event( OK, true ) ); 
  }
  private function onDelete( e:MouseEvent ):void{
   dispatchEvent( new Event( CLOSE, true ) );
  }
  public function Test(){
   btnOk.addEventListener(MouseEvent.MOUSE_DOWN, onOk);
   btnCancel.addEventListener(MouseEvent.MOUSE_DOWN, onDelete);
  }
 }
}

子を生成時、親が子自身のボタンイベントを制御したい、
という処理です。

現象としては、
 親ボタンによる子追加 → 子ボタンによる子削除*1
 親ボタンによる子追加 → 子ボタンによる子削除*2
 エラー発生

引用:
VerifyError: Error #1107: ABC データは破損しているため、境界外の読み取りが試行されました。
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at Test/onOk()

また、*1と*2のボタンが異なる場合、以下のエラーも
合わせて出力されます。

引用:
ArgumentError: Error #2025: 指定した DisplayObject は呼び出し元の子でなければなりません。
at flash.display::DisplayObjectContainer/removeChild()
at MethodInfo-7()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at Test/onDelete()

元々Flexにて開発していたところ、後者のエラーが発生し、
Flashに還元し検証したところ、前者のエラーも合わせて確認した、
という経緯です。

前者のエラーについては、こちらに説明が載っています。

実行関数を外出しにして制御した場合は正常に動作します。

詳細な原因および回避方法がお分かりでしたら
ご教示よろしくお願いいたします。
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops