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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     パブリックメソッドでボタンが表示できない
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
asuki
Åê¹ÆNo.38850
投稿日時: 2008-5-16 23:57
新米
居住地: 神奈川県
投稿: 9
使用環境:
WinXP,Flssh CS3
パブリックメソッドでボタンが表示できない
初めて投稿します。
AS3のFLAファイルで、コンポーネントのボタンをライブラリに追加してから、空のムービークリップtest_mc1、test_mc2をそれぞれステージに配置。
リンケージクラスをtest_mc1はTestBtn1、test_mc2はTestBtn2にしました。(基本クラスはflash.display.Sprite)

ASファイルを以下のようにしてムービープレビューしてみると、TestBtn1のbtnをclickしても画面にはTestBtn2のbtn2ボタンが表示されません。
traceは実行されますし、表示オブジェクトであると共に可視状態にもなっています。
また、TestBtn2自身からのaddChildなら表示されます。
何か足りないものがあるのでしょうか?

よろしくお願いします。

------------------------------------------------------------
TestBtn1.as
------------------------------------------------------------
package{
import flash.display.Sprite;
import fl.controls.Button;
import flash.events.MouseEvent;

public class TestBtn1 extends Sprite{
private var btn:Button;

public function TestBtn1(){
setupBtn();
}

private function setupBtn():void{
btn=new Button();
btn.setSize(150,20);
btn.label="TestBtn1_Button";
btn.move(100,100);
addChildFunc();
}

private function addChildFunc():void{
addChild(btn);
btn.addEventListener
(MouseEvent.CLICK,btnClickHandler);
}

private function btnClickHandler(e:MouseEvent):void{
var testBtn2:TestBtn2=new TestBtn2();
testBtn2.btn2addChildFunc();
}
}
}
------------------------------------------------------------
TestBtn2.as
------------------------------------------------------------
package{
import flash.display.Sprite;
import fl.controls.Button;

public class TestBtn2 extends Sprite{
private var btn1:Button;
private var btn2:Button;

public function TestBtn2(){
setupBtn();
}

private function setupBtn():void{
btn1=new Button();
btn1.setSize(150,20);
btn1.label="TestBtn2_Button1";
btn1.move(300,100);

btn2=new Button();
btn2.setSize(150,20);
btn2.label="TestBtn2_Button2";
btn2.move(300,200);

btn1addChildFunc();
}

private function btn1addChildFunc():void{
addChild(btn1);
}

public function btn2addChildFunc():void{
this.addChild(btn2);

trace("実行しました");
if(this.contains(btn2)==true){
trace("表示オブジェクトです");
}
if(btn2.visible==true){
trace("可視状態です");
}
}
}
}
------------------------------------------------------------
野中文雄
Åê¹ÆNo.38852
投稿日時: 2008-5-17 0:57
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: パブリックメソッドでボタンが表示できない
まず、できるかぎり問題は単純化して試すべきでしょう。

インスタンスがStageオブジェクトを頂点とする表示リストに加わっていなければ、ステージ上に表れません。
引用:
asukiさんは書きました:
AS3のFLAファイルで、コンポーネントのボタンをライブラリに追加してから、空のムービークリップtest_mc1、test_mc2をそれぞれステージに配置。
リンケージクラスをtest_mc1はTestBtn1、test_mc2はTestBtn2にしました。(基本クラスはflash.display.Sprite)

ASファイルを以下のようにしてムービープレビューしてみると、TestBtn1のbtnをclickしても画面にはTestBtn2のbtn2ボタンが表示されません。
traceは実行されますし、表示オブジェクトであると共に可視状態にもなっています。
また、TestBtn2自身からのaddChildなら表示されます

// TestBtn1.as
package {
	import flash.display.Sprite;
	import fl.controls.Button;
	import flash.events.MouseEvent;

	public class TestBtn1 extends Sprite {
		private var btn:Button;

		public function TestBtn1() {
			// setupBtn();
			btnClickHandler(null);
		}
		/*
		...[中略]...
		*/
		private function btnClickHandler(e:MouseEvent):void {
			var testBtn2:TestBtn2=new TestBtn2();
			testBtn2.btn2addChildFunc();
		}
	}
}

// TestBtn2.as
package {
	import flash.display.Sprite;
	import fl.controls.Button;

	public class TestBtn2 extends Sprite {
		private var btn1:Button;
		private var btn2:Button;

		public function TestBtn2() {
			setupBtn();
		}
		private function setupBtn():void {
			/*
			...[中略]...
			*/
			btn2=new Button();
			btn2.setSize(150,20);
			btn2.label="TestBtn2_Button2";
			btn2.move(300,200);
			// btn1addChildFunc();
		}
		/*
		...[中略]...
		*/
		public function btn2addChildFunc():void {
			this.addChild(btn2);
			trace(parent);
			trace("実行しました");
			if (this.contains(btn2)==true) {
				trace("表示オブジェクトです");
			}
			if (btn2.visible==true) {
				trace("可視状態です");
			}
		}
	}
}


----------------
 

asuki
Åê¹ÆNo.38853
投稿日時: 2008-5-17 2:17
新米
居住地: 神奈川県
投稿: 9
使用環境:
WinXP,Flssh CS3
Re: パブリックメソッドでボタンが表示できない
野中 様
早速のレスありがとうございます。
ごめんなさい。もっと簡略化すべきでした。

TestBtn2.as にて、
private function btn1addChildFunc():void{
var rootObj:Object=this.root as Object;
trace(rootObj); // [object MainTimeline]
}
とステージを参照できるのに、
public function btn2addChildFunc()void{
var rootObj:Object=this.root as Object;
trace(rootObj); // null
}
とnullになってしまうのがよくわかりません。
このpublic function の中身は”誰”のものなのでしょうか?
野中文雄
Åê¹ÆNo.38854
投稿日時: 2008-5-17 2:41
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: パブリックメソッドでボタンが表示できない
私の環境では、両方ともnullが[出力]されます。btn1だけは、表示されるということですか?
引用:
asukiさんは書きました:
TestBtn2.as にて、
private function btn1addChildFunc():void{
	var rootObj:Object=this.root as Object;
	trace(rootObj); // [object MainTimeline]
}

とステージを参照できるのに、
public function btn2assChildFunc()void{
	var rootObj:Object=this.root as Object;
	trace(rootObj); // null
}

とnullになってしまうのがよくわかりません。

// フレームアクション
import flash.display.MovieClip;
var _mc:MovieClip = new MovieClip();
trace(_mc.parent, _mc.root);
addChild(_mc);
trace(_mc.parent, _mc.root);

インスタンスメソッドの持ち主は、クラスのインスタンスです。
引用:
このpublic function の中身は”誰”のものなのでしょうか?


----------------
 

asuki
Åê¹ÆNo.38855
投稿日時: 2008-5-17 3:13
新米
居住地: 神奈川県
投稿: 9
使用環境:
WinXP,Flssh CS3
Re: パブリックメソッドでボタンが表示できない
野中 様
真夜中のご返答ありがとうございます。

説明不足で申し訳ありませんでした。
最初のprivate function はTestBtn2からの実行でしたのでnullにはなりませんでしたが、ボタンを押すと両方ともnullが返ってきました。

インスタンスメソッドの持ち主がクラスのインスタンスということは、TestBtn2の中に記述されていても、それはTestBtn1のもの?だということでしょうか?なんだかこんがらがってきました(^^!

とすると、TestBtn2のボタンを他のクラスから表示させようとするなら、どのような方法があるのでしょうか?

実際には、TestBtn1にセレクトボタンを配置して、それに応答する形でTestBtn2クラスや他のクラスで様々なボタンを表示させたかったのですが・・・
野中文雄
Åê¹ÆNo.38856
投稿日時: 2008-5-17 3:34
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: パブリックメソッドでボタンが表示できない
言葉だけで抽象的に話されるから、「こんがらがって」くるのだと思いますよ。疑問点を抽出したシンプルなスクリプトで、具体的にどのメソッドが、どのインスタンスを参照するのかとお考えになった方が理解は深まります。
引用:
asukiさんは書きました:
インスタンスメソッドの持ち主がクラスのインスタンスということは、TestBtn2の中に記述されていても、それはTestBtn1のもの?だということでしょうか?なんだかこんがらがってきました(^^!

先の回答に示したフレームアクションの[出力]の意味は、おわかりになりましたか?
引用:
とすると、TestBtn2のボタンを他のクラスから表示させようとするなら、どのような方法があるのでしょうか?


----------------
 

asuki
Åê¹ÆNo.38857
投稿日時: 2008-5-17 4:40
新米
居住地: 神奈川県
投稿: 9
使用環境:
WinXP,Flssh CS3
Re: パブリックメソッドでボタンが表示できない
野中 様
たびたびのご返答、恐縮です。

import flash.display.MovieClip;
var _mc:MovieClip = new MovieClip();
trace(_mc.parent, _mc.root);
// null null
addChild(_mc);trace(_mc.parent, _mc.root);
// [object MainTimeline] [object MainTimeline]

表示リストに追加されて初めてアクセスできることは理解できました。

そもそもステージにインスタンスを複数配置して、表示ツリー構造を無視したようなやり方が間違っていることも理解できました。

表示専門のクラスを置いて、そこに別のクラスから表示させる作り方を考えてみます。
野中文雄
Åê¹ÆNo.38858
投稿日時: 2008-5-17 5:05
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: パブリックメソッドでボタンが表示できない
ムービーやスクリプトの構成の仕方は、いくつか考えられるでしょう。いずれにしても、まずはシンプルな内容で試してみることが大切です。
// フレームアクション
var testBtn2:TestBtn2=new TestBtn2();
testBtn2.btn2addChildFunc(this);

// TestBtn2.as
// このクラスを設定したMovieClipシンボル内には、何かシェイプを描いておく
package {
	import flash.display.Sprite;
	import flash.display.DisplayObjectContainer;
	public class TestBtn2 extends Sprite {
		public function TestBtn2() {
		}
		public function btn2addChildFunc(myParent:DisplayObjectContainer):void {
			myParent.addChild(this);
		}
	}
}

引用:
asukiさんは書きました:
表示リストに追加されて初めてアクセスできることは理解できました。

そもそもステージにインスタンスを複数配置して、表示ツリー構造を無視したようなやり方が間違っていることも理解できました。

表示専門のクラスを置いて、そこに別のクラスから表示させる作り方を考えてみます。


----------------
 

asuki
Åê¹ÆNo.38859
投稿日時: 2008-5-17 5:44
新米
居住地: 神奈川県
投稿: 9
使用環境:
WinXP,Flssh CS3
Re: パブリックメソッドでボタンが表示できない
野中 様
おはようございます。とうとう夜が明けてしまいました。

おおっ! DisplayObjectContainerでしたか

ActionScript3.0コンポーネントリファレンスには
「DisplayObject は抽象基本クラスであるため、DisplayObject を直接呼び出すことはできません。new DisplayObject() を呼び出すと ArgumentError 例外がスローされます。---中略---
これは直接インスタンス化することはできません。new DisplayObjectContainer() コンストラクタを呼び出すと、ArgumentError 例外がスローされます。」
とあったため、何か怖くてなかなか近づけないでいました。

目からウロコです!
夜通しお付き合いくださいましてありがとうございました。
ごゆっくりお休みください(_ _; zzz...
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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