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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     Windowコンポーネントについて
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
kirarin
Åê¹ÆNo.9129
投稿日時: 2004-7-14 12:46
職人
居住地: 彩の国
投稿: 214
使用環境:
Windows7
IE 8
Flash CS4
Flash Player WIN 10,0,45,2
-------------------------
WindowsXP Professional SP3
IE7.0
Flash 8 Professional
Flash Player 10.0.12.36
-------------------------
Windows2003 Sp1
IE6.0 SP1
Flash MX 2004 ...
Windowコンポーネントについて
いつもお世話になっております。kirarinです。

Windowというコンポーネントを使ってみました。
メッセージなどを表示するのに、下にあるボタンを一度で使用不可状態にしてくれるので、楽かなと思いまして・・・(^^;)
でもちょっとわからないことがありました。

まず、Windowコンポーネントをライブラリに登録して、
・ActionScriptに書き出し
・最初のフレームに書き出し
にチェックを入れました。

次にWindowの中に表示したいMCを作成しました。
・ダイナミックテキスト(msg_txt)
・Buttonコンポーネント2つ(yes_btn、no_btn)

このMCにも
・ActionScriptに書き出し
・最初のフレームに書き出し
にチェックを入れ
・識別肢:Msg
・AS2.0クラス:mx.core.View
としました。
(このあたりはHelpの通りです)

最後にステージにButton(Exit_btn)を1つおき
これのclickイベントに以下の記述をしました。

on (click) {
	_root.myWindow = mx.managers.PopUpManager.createPopUp(_root, mx.containers.Window, true, {title:"確認 メッセージ", contentPath:"Msg"});
	_root.myWindow.setSize(250, 200);
	_root.myWindow.content.msg_txt.text = "終了します";
}
ここまでやってExit_btnを押してみると
はい、いいえのボタン2つは表示されているのですが、"終了します"の文字がWindow内に表示されていません。
ちなみに、これを静的テキストにしてみても結果は同じでした。

何か設定漏れなどありますでしょうか?
お気づきの方おられましたら、アドバイスよろしくお願いいたしますm(__)m


----------------
Kirarin

野中文雄
Åê¹ÆNo.9130
投稿日時: 2004-7-14 13:11
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: Windowコンポーネントについて
ひと呼吸待たなければいけないという、ありがちのパターンですね。
引用:
kirarinさんは書きました:
まず、Windowコンポーネントをライブラリに登録して、
...
次にWindowの中に表示したいMCを作成しました。
・ダイナミックテキスト(msg_txt)
・Buttonコンポーネント2つ(yes_btn、no_btn)

このMCにも
・ActionScriptに書き出し
・最初のフレームに書き出し
にチェックを入れ
・識別肢:Msg
・AS2.0クラス:mx.core.View
としました。
(このあたりはHelpの通りです)

フレーム待ちのスクリプトを追加します。
引用:
最後にステージにButton(Exit_btn)を1つおき
これのclickイベントに以下の記述をしました。
on (click) {
    _root.myWindow = mx.managers.PopUpManager.createPopUp
        (_root, mx.containers.Window, true, 
        {title:"確認 メッセージ", contentPath:"Msg"});
    _root.myWindow.setSize(250, 200);
    // _root.myWindow.content.msg_txt.text = "終了します";
    trace(_root.myWindow.content);  // 出力: undefined
    this.onEnterFrame = function() {
        var _txt = _root.myWindow.content.msg_txt;
        trace(_txt);  // 出力: _level0.depthChild0.content.msg_txt
        _txt.text = "終了します";
        delete this.onEnterFrame;
    };
}
ここまでやってExit_btnを押してみると
はい、いいえのボタン2つは表示されているのですが、"終了します"の文字がWindow内に表示されていません。


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

kirarin
Åê¹ÆNo.9133
投稿日時: 2004-7-14 14:53
職人
居住地: 彩の国
投稿: 214
使用環境:
Windows7
IE 8
Flash CS4
Flash Player WIN 10,0,45,2
-------------------------
WindowsXP Professional SP3
IE7.0
Flash 8 Professional
Flash Player 10.0.12.36
-------------------------
Windows2003 Sp1
IE6.0 SP1
Flash MX 2004 ...
Re: Windowコンポーネントについて
野中さん、いつもありがとうございますm(__)m

>ひと呼吸待たなければいけないという、ありがちのパターンですね。

なるほど、flashを触り始めてから5ヶ月、この手の内容はたしかに多い気がしてきました。
今後は注意したいと思います。

教えていただいたfunctionを付け加えたところ、無事表示することが出来ました。

ありがとうございました。m(__)m


----------------
Kirarin

youich
Åê¹ÆNo.9157
投稿日時: 2004-7-14 22:58
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: Windowコンポーネントについて
引用:

kirarinさんは書きました:
野中さん、いつもありがとうございますm(__)m

>ひと呼吸待たなければいけないという、ありがちのパターンですね。

なるほど、flashを触り始めてから5ヶ月、この手の内容はたしかに多い気がしてきました。
今後は注意したいと思います。

教えていただいたfunctionを付け加えたところ、無事表示することが出来ました。

ありがとうございました。m(__)m

野中さんがおっしゃるようにcontentに実際にMovieClip(Msg)がアタッチされるのはワンフレーム後だから、
逆にWindowを作った(createPopUpの)後に
Window#createChild(View#createChild)内で呼び出されるaddLayoutObjectを定義してもよさそうですね。
on (click) {
	_root.myWindow = mx.managers.PopUpManager.createPopUp(_root, mx.containers.Window, true, 
                  {title:"確認 メッセージ", contentPath:"Msg"});

	_root.myWindow.addLayoutObject = function(obj) {
		obj.msg_txt.text = "終了します";
	};
	_root.myWindow.setSize(250, 200);
	//_root.myWindow.content.msg_txt.text = "終了します";
}


----------------
- yo

kirarin
Åê¹ÆNo.9182
投稿日時: 2004-7-15 12:39
職人
居住地: 彩の国
投稿: 214
使用環境:
Windows7
IE 8
Flash CS4
Flash Player WIN 10,0,45,2
-------------------------
WindowsXP Professional SP3
IE7.0
Flash 8 Professional
Flash Player 10.0.12.36
-------------------------
Windows2003 Sp1
IE6.0 SP1
Flash MX 2004 ...
Re: Windowコンポーネントについて
youichさん、情報ありがとうございましたm(__)m

さきのサンプルに「クローズボタン(右上隅の「×」)を押したらdeletePopUp」というリスナーと追加してみました。
これも今回と同様、1テンポ遅らせないといけないのでね。
なので、addLayoutObject 内でaddEventListenerを追加してみました。

on (click) {
	_root.myWindow = mx.managers.PopUpManager.createPopUp(_root, mx.containers.Window, true, {title:"確認 メッセージ", contentPath:"Msg", closeButton:true});
	_root.myWindow.addLayoutObject = function(obj) {
		obj.msg_txt.text = "サブウィンドウです。";
		_root.myWindow.addEventListener("click", _root.windowListener);
	};
	_root.myWindow.setSize(300, 200);
	_root.myWindow._x = 20;
	_root.myWindow._y = 50;
}

ちなみに、リスナーは_rootのタイムラインに以下のように指定しました。
_root.windowListener = new Object();
_root.windowListener.click = function(evt) {
	//複数のWindowに登録することを前提に、ためしにevalをつかってみました。
	eval(evt.target).deletePopUp();
};
無事、クローズすることができました。
ありがとうございますm(__)m。

今回addLayoutObject というのを始めて知ったので調べてみた。
Macromedia Flash MX 2004 の v2 仕様コンポーネントアーキテクチャーについて
↑のページでもうひとつ、doLayoutというのが出ていましたが、これは実際どのようなタイミングで動くものなのかご存知でしょうか。

上記サンプルに
	_root.myWindow.doLayout = function(obj) {
		trace("doLayout");
	};
とういコードを足したら、描画がくずれ(contentのMCの上に、Windowコンポーネントのデフォルトが重なって表示される)し、doLayoutは3回traceされました(^^;)

文献ではsizeに関わるようなことが書いてあったのですが、いまひとつ雲をつかんでいるような感じです。

windowコンポーネントなどを使わずに、自分で作ったMCの表示を切り替えれば済む問題かもしれませんが、デザインセンスがない自分には、こういうコンポーネントはぜひとも使いたいコンポーネントなのです。

投稿タイトルの話の範囲内だとは思いますが、当初の質問と内容が変わってきてしまいました(^^;)
別投稿が望ましければ、分けたいと思いますm(__)m
どうぞよろしくお願いいたします。


----------------
Kirarin

youich
Åê¹ÆNo.9201
投稿日時: 2004-7-15 22:48
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: Windowコンポーネントについて
引用:
さきのサンプルに「クローズボタン(右上隅の「×」)を押したらdeletePopUp」というリスナーと追加してみました。
これも今回と同様、1テンポ遅らせないといけないのでね。
なので、addLayoutObject 内でaddEventListenerを追加してみました。


addEventListenerはワンテンポ遅らせなくても大丈夫ですよ。

_root.myWindow = mx.managers.PopUpManager.createPopUp(_root,、、、、
の後_root.myWindow.contentがすぐに生成されないのはコンポーネントの
作者が意図的にワンフレーム後にcontentをアタッチムービーしているからで
例えば下のようにWindow.validateNowプロパティの値をtrueに設定すればワンフレーム待たずに
myWindow.contentは生成されるのでcontent.msg_txt.textへの値もすぐに設定できます。

on (click) {
	var initObj = {title:"確認 メッセージ", 
				contentPath:"Msg", closeButton:true, validateNow:true};
				
	var w = _root.myWindow=mx.managers.PopUpManager.createPopUp(
				_root, mx.containers.Window, true, initObj);
				
	/*w.addLayoutObject = function(MsgSymbol:Object) {
		MsgSymbol.msg_txt.text = "サブウィンドウです。";
		trace('addLayoutObject');
		//今回は呼ばれません
	};*/
	w.content.msg_txt.text =  "サブウィンドウです。";;
	w.addEventListener("click", _root.windowListener);
	w.setSize(300, 200);
	w.move(20, 50);
}


しかしこの場合は逆に
_root.myWindow = mx.managers.PopUpManager.createPopUp(_root,、、、、
の後で_root.myWindow.addLayoutを定義してもすでに手後れ、呼び出されないと
言う事になります。

addLayoutObjectはmx.core.Viewで定義されておりmx.core.ViewのcreateChildメソッドの中から
呼び出されますが、View -> ScrollView -> Window のどの階層でも実装されていません。
(ちなみに、addLayoutの引数はcontentの中身になります、kirarinさんの場合は"Msg"シンボルです。)
で、Viewを継承するWindowも必然的にこのcreateChildメソッドをもっており
実際にWindow.contentPathにセットされた値(kirarinさんの場合"Msg")から
attachMovie等でWindow内部にシンボルを取り込むのがこのcreateChildメソッドです。

ということでWindow.createChildメソッドが呼び出されるタイミングがcontentPathに指定したシンボルが
生成されるときであり、addLayoutObjectが呼び出されるタイミングになります。
createChildは直接的にはcontentPathセッターから呼び出されるのですが、おおまかにいって
Window.drawメソッドから呼び出されます、その流れはおおざっぱに下のようになります。
Windowコンストラクタ

※プロパティvalidateNow が true の場合--> draw(); //すぐにdrawする。
※プロパティvalidateNow が false の場合 --> invalidate(); //ワンフレーム後にdrawする。こちらが通常

引用:
今回addLayoutObject というのを始めて知ったので調べてみた。
Macromedia Flash MX 2004 の v2 仕様コンポーネントアーキテクチャーについて
↑のページでもうひとつ、doLayoutというのが出ていましたが、これは実際どのようなタイミングで動くものなのかご存知でしょうか。
上記サンプルに

	_root.myWindow.doLayout = function(obj) {
		trace("doLayout");
	};

とういコードを足したら、描画がくずれ(contentのMCの上に、Windowコンポーネントのデフォルトが重なって表示される)し、doLayoutは3回traceされました(^^;)
文献ではsizeに関わるようなことが書いてあったのですが、いまひとつ雲をつかんでいるような感じです。


doLayoutはmx.core.Viewで定義されていてmx.core.View#sizeの中で呼び出されます。
	// mx.core.View.as
        function size():Void
	{

		// border covers the whole thing
		border_mc.move(0, 0);
		border_mc.setSize(width, height);

		// layout the content
		doLayout();
	}

また、doLayoutはView -> ScrollView -> Windowの各階層でそれぞれ実装されており、size以外からも
レイアウトの修正が必要な時に呼び出される場合もあります。
(sizeメソッドは基本的にsetSizeメソッドから呼び出されます。)
kirarinさんのサンプルではもともとWindowに定義されてあったdoLayoutを上書きしてしまってる状態になって
しまってるので、描画がくずれてしまうということになります。
なのでWindowのサブクラスからsuper.doLayoutを呼び出すように
Window.prototype.doLayoutを呼び出しておけば描画はくずれませんですね。

on (click) {
	var _doLayout = mx.containers.Window.prototype.doLayout;
	var initObj = {title:"確認 メッセージ", 
				contentPath:"Msg", closeButton:true};
				
	var w = _root.myWindow=mx.managers.PopUpManager.createPopUp(
				_root, mx.containers.Window, true, initObj);
				
	w.addLayoutObject = function(MsgSymbol:Object) {
		MsgSymbol.msg_txt.text = "サブウィンドウです。";
		trace('addLayoutObject');
	};
	w.doLayout = function() {
		_doLayout.apply(this);
		trace("doLayout");
	};
	w.addEventListener("click", _root.windowListener);
	w.setSize(300, 200);
	w.move(20, 50);
}


doLayoutが3回呼び出されていることですが、、、
1回めのdoLayoutはButtonに書かれたWindowを生成した後のkirarinさんのsetSizeのコールから UIObject#setSize->size->doLayout
2回めのdoLayoutはWindow#drawから Window#draw->size->doLayout (ちょうどcreateChildが呼び出された後です。)
3回めのdoLayoutはView#createChildrenから View#doLater-> View#initLayout -> doLayout
となります。
私見ですが3回目のdoLayoutは本来一度doLayoutが呼び出されるとView.hasBeenLayedOutがtrueになり
それ以降initLayoutからは呼び出されない様にView#doLayoutに定義されていますが、
Viewを継承するmx.core.ScrollView#doLayoutではsuper.doLayoutの呼び出しが無いのでhasBeenLayedOutが
trueにならずに3回目のdoLayoutが呼び出されているというバグじゃないかなぁと思います。
といっても別にdoLayoutの呼び出しが多くても害はないですけどね。


普通はView以降のクラスを継承したユーザークラスを作り、レイアウトを整える実装を
doLayoutに定義するということになると思います。。





----------------
- yo

kirarin
Åê¹ÆNo.9308
投稿日時: 2004-7-21 6:01
職人
居住地: 彩の国
投稿: 214
使用環境:
Windows7
IE 8
Flash CS4
Flash Player WIN 10,0,45,2
-------------------------
WindowsXP Professional SP3
IE7.0
Flash 8 Professional
Flash Player 10.0.12.36
-------------------------
Windows2003 Sp1
IE6.0 SP1
Flash MX 2004 ...
Re: Windowコンポーネントについて
youichさん、とても詳しい説明をありがとうございましたm(__)m

doLayoutについて、youichさんが順に丁寧に説明してくださったおかげで3回出力の謎も解けました。

今回書いて頂いた内容は私にとってとても高度だったので、調べながら読んでいたらだいぶ時間がかかってしまいました(^^;)レスが遅れてすみません。

といってもクラスやイベントなどについて完全に理解できているわけではないのですが、それでも何となくはイメージ出来ました。
こういう内部の動きをきちんと理解できれば、スクリプトもすっきりするでしょうね。

少しFlashを使えるようにはなってきましたが、まだまだこれからも勉強する事が多いです。
アドバイスありがとうございましたm(__)m


----------------
Kirarin

NAKAOK
Åê¹ÆNo.12092
投稿日時: 2004-11-8 0:29
新米
居住地:
投稿: 10
使用環境:
WinXP, Flash Professinal 8, FCS MX 1.5
Re: Windowコンポーネントについて
初めまして、NAKAOKといいます。よろしくお願いします。
私もこれで悩んだうちの一人なのですが、追加で質問させて下さい。
私も、ここの皆さんの書き込みを拝見して

・Window内に配置したダイナミックテキストの変更
・Window右上のCloseボタンで閉じる動作

については実現できたのですが、

・Window内に配置したButtonコンポーネントのイベント取得

がどうしても上手くいきません。
kirarinさんも、当初の質問では

引用:

次にWindowの中に表示したいMCを作成しました。
・ダイナミックテキスト(msg_txt)
・Buttonコンポーネント2つ(yes_btn、no_btn)


と、2つのButtonコンポーネントを配置されていたようですが、これについては解決されましたでしょうか?
具体的には、以下のようなコードで、Window内に配置したButtonのイベントが取得できません。

var initObj = {title:"確認 メッセージ", contentPath:"Msg", closeButton:true, validateNow:true};
_root.myWindow = mx.managers.PopUpManager.createPopUp(_root, mx.containers.Window, true, initObj);
_root.myWindow.setSize(250, 200);
_root.myWindow.content.msg_txt.text = "終了します";

// 以下は取得できる
_root.windowListener0 = new Object();
_root.windowListener0.click = function(evt) {
evt.target.deletePopUp();
};
_root.myWindow.addEventListener("click", _root.windowListener0);

// 以下は取得できない
_root.windowListener1 = new Object();
_root.windowListener1.click = function(evt) {
trace("click");
};
_root.myWindow.content.yes_btn.addEventListener("click", _root.windowListener1);

// 不思議なこと
// 以下は "_level0.depthChild0.content.msg_txt" と出力される
trace(_root.myWindow.content.msg_txt);
// 以下は "終了します" と出力される
trace(_root.myWindow.content.msg_txt.text);

// 以下は "_level0.depthChild0.content.yes_btn" と出力される
trace(_root.myWindow.content.yes_btn);
// 以下は undefined とと出力される???
trace(_root.myWindow.content.yes_btn.label);

yes_btn自体は参照できているのに、labelが参照できないということが不思議です。イベントが取得できない事と何か関係があるのでしょうか?

よろしくお願いいたします。






kirarin
Åê¹ÆNo.12093
投稿日時: 2004-11-8 9:04
職人
居住地: 彩の国
投稿: 214
使用環境:
Windows7
IE 8
Flash CS4
Flash Player WIN 10,0,45,2
-------------------------
WindowsXP Professional SP3
IE7.0
Flash 8 Professional
Flash Player 10.0.12.36
-------------------------
Windows2003 Sp1
IE6.0 SP1
Flash MX 2004 ...
Re: Windowコンポーネントについて
NAKAOKさん、こんにちは。
kirarinです。

私はButtonのClick時のイベントは、
on(click){
}
で直接記述していました。
特に問題はありませんでした。

NAKAOKさんの書いていただいたスクリプトを
新規作成したFlashの1フレにコピーしてみました。
また、
・ダイナミックテキスト1つ(msg_txt)
・Buttonコンポーネント2つ(yes_btn、no_btn)
を配置した「Msg」シンボルを作成して、動作確認してみました。

私の方での出力結果は以下のとおりです。
<出力結果>--------------------
_level0.depthChild0.content.msg_txt
終了します
_level0.depthChild0.content.yes_btn
yes
-------------------------------

最後の1行、undefinedにはなりませんでした。
これ以外の記述は一切ありませんか?


----------------
Kirarin

NAKAOK
Åê¹ÆNo.13450
投稿日時: 2004-12-18 17:09
新米
居住地:
投稿: 10
使用環境:
WinXP, Flash Professinal 8, FCS MX 1.5
Re: Windowコンポーネントについて
NAKAOKです。
kirarinさん、レスありがとうございました。

私が報告した現象についてですが、実際には
ルートのタイムライン上に巨大なasファイルをincludeしていて
その中のクラス定義で全てを記述している形になっており、
addEventListenerの引数にDelegate.create等を使用したり
しているので、少々複雑なコードになっています。

ご質問をさせて頂くにあたってコードを単純化したのでですが、
私が何か別のところで間違いを犯していたのかもしれません。

本件については、ウィンドウの中身割り当てる
ムービークリップ上のタイムラインにハンドラを記述することで
回避できました。

本当にありがとうございました。(__)

またご質問させて頂く事もあるかと思いますが、
よろしくお願いいたします。



スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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