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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     for文の中のイベントハンドラメソッド
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
TJFORD
Åê¹ÆNo.35399
投稿日時: 2007-10-3 0:55
半人前
居住地: Tokyo
投稿: 42
使用環境:
:Flash CS3
for文の中のイベントハンドラメソッド
こちらのサイトの過去の投稿を拝見して勉強させていただいています。

「複数の画像を並べて表示」
http://www.flash-jp.com/modules/newbb/viewtopic.php?topic_id=6628&forum=8&viewmode=flat&order=ASC&start=10
上記の投稿にて、以下のようなスクリプトがありました。

??????????????????????????????
for (var n:Number = 0; n < 3; n++) {
var _mc:MovieClip = mcList[n];
loader.loadClip(imgList[n].nodeValue, _mc.holder);
_mc.onRelease = function():Void {
getURL(urlList[this.id]);
};

}
??????????????????????????????

ここで疑問が生まれたのですが、for文の中のイベントハンドラメソッドなどはどこか(タイムライン?)に保存され、イベントが起こった時にそれが呼び出されるのでしょうか?押された時点でfor文のなかのfunctionが呼び出されるとターゲットは_mcになるはずでその_mcはfor文の中では上書きされているわけで。どこかに保存されているからうまく動いているのかなと予想したのですが実際はどのような処理がされているのでしょうか?

??????????????????????????????
<予想>
下記のようなイベントハンドラメソッドがどこかに記憶されている?
mcList[0].onRelease = function():Void {getURL(urlList[this.id]);};
mcList[1].onRelease = function():Void {getURL(urlList[this.id]);};
mcList[2].onRelease = function():Void {getURL(urlList[this.id]);};
??????????????????????????????

わかりにくい文で申し訳ありませんがよろしくお願いいたします。
ひろゆき
Åê¹ÆNo.35400
投稿日時: 2007-10-3 1:02
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: for文の中のイベントハンドラメソッド
onRelease は、MovieClip に設定されます。
# Button にも設定されますが、ここではMovieClipだけに限定しておきます。

_root 上に、ムービークリップ(インスタンス名: mc)が配置されており、
_root 第1フレームに
mc.onRelease = function();Void {
	trace(this);
};
と記述しておけば、
「mcがクリックされたときに、function()内の動作を実行する」ように予約しておくわけです。


----------------
質問する際は、回答者に具体的な情報を与えてください。

TJFORD
Åê¹ÆNo.35401
投稿日時: 2007-10-3 1:11
半人前
居住地: Tokyo
投稿: 42
使用環境:
:Flash CS3
Re: for文の中のイベントハンドラメソッド
ひろゆきさん

早速のご返信ありがとうございます。

onReleaseがプロパティのように各ムービークリップに登録されるイメージでしょうか?


ひろゆき
Åê¹ÆNo.35402
投稿日時: 2007-10-3 1:15
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: for文の中のイベントハンドラメソッド
次に、
_root 上に、ムービークリップ(インスタンス名: mc1, mc2, mc3) が
配置されている場合を考えてみましょう。
mc1.onRelease = function():Void {
	trace(this);
};
mc2.onRelease = function():Void {
	trace(this);
};
mc3.onRelease = function():Void {
	trace(this);
};
ですね。

しかし、これでは、ムービークリップの数が増えた場合、面倒ですから、
for (var n:Number = 1; n<= 3; n++) {
	this["mc"+n].onRelease = function():Void {
		trace(this);
	};
}
とまとめることもできます。

また、次のように記述することもできます。
for (var n:Number = 1; n<= 3; n++) {
	var _mc:MovieClip = this["mc"+n];
	_mc.onRelease = function():Void {
		trace(this);
	};
}
この場合は、一旦 _mc という変数にインスタンス(への参照)を代入してあります。

問題の「複数の画像を並べて表示」では、
配列の mcList に、ムービークリップ・インスタンス(への参照)を格納して、
それを for文で回しながら、取り出していることになります。

var mcList:Array = new Array();
for (var n:Number = 1; n<= 3; n++) {
	var _mc:MovieClip = this["mc"+n];
	mcList.push(_mc);
	//mcList.push(this["mc"+n]);
}
for (var n:Number = 1; n<= 3; n++) {
	var _mc:MovieClip = mcList[n-1];
	_mc.onRelease = function():Void {
		trace(this);
	};
}


いずれにせよ、イベントハンドラメソッドは、
動作の予約をムービークリップ・インスタンスに対して行っているということですね。


----------------
質問する際は、回答者に具体的な情報を与えてください。

野中文雄
Åê¹ÆNo.35403
投稿日時: 2007-10-3 1:20
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: for文の中のイベントハンドラメソッド
イベントハンドラメソッドを設定した各MovieClipインスタンス(タイムライン)に「保存され」ます。

たとえば、以下の関数xTest()では、ローカル変数_mcは、function本体の処理が済めばクリアされます。それでも、MovieClipインスタンスmy_mcに、イベントハンドラメソッドはメモリされています。
// フレームアクション
// MovieClipインタスンスmy_mcを配置
function xTest() {
	var _mc:MovieClip = my_mc;
	_mc.onRelease = function():Void  {
		trace(this);
	};
}
xTest();
trace(_mc);
trace(my_mc);
trace(my_mc.onRelease);

引用:
TJFORDさんは書きました:
onReleaseがプロパティのように各ムービークリップに登録されるイメージでしょうか?

MovieClip.onReleaseイベントハンドラメソッドは、プロパティと考えても誤りではありません。

参考: 拙著『モーショングラフィックスで学ぶActionScript』4.8「メソッドもプロパティ」(PDF)


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

TJFORD
Åê¹ÆNo.35404
投稿日時: 2007-10-3 1:35
半人前
居住地: Tokyo
投稿: 42
使用環境:
:Flash CS3
Re: for文の中のイベントハンドラメソッド
ひろゆきさん 野中さん

ご返信ありがとうございます。

「保存されている」「予約されている」という感覚がなんとなくわかりました ありがとうございます。


まだまだプログラミングというものをはじめて3週間足らずの人間です。今後もこちらのサイトで勉強していきたいと思います。
ありがとうございました。
ひろゆき
Åê¹ÆNo.35405
投稿日時: 2007-10-3 1:35
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: for文の中のイベントハンドラメソッド
例えば、_root 上に、ムービークリップ(インスタンス名: mc) を配置。

_root 第1フレームに
mc.id = 1;
mc.onRelease = function():Void {
	trace(this);
};
と記述。

ムービープレビューで、[デバッグ]-[変数のリストアップ]をすると、
変数 _level0.mc.id = 1
変数 _level0.mc.onRelease = [関数 'onRelease']
と出力されます。

野中さんが書かれている、イベントハンドラメソッドがプロパティとも考えられるというのは、
これだと思います。
#ちがってたら、ごめんなさい。


また、次のようなテストをすることもできます。
_root には何も配置せず。

_root 第1フレームに
createMC();
mc.onRelease = function():Void {
	trace(this);
};

function createMC():Void {
	this.createEmptyMovieClip("mc", 1);
	mc.beginFill(0xFF0000);
	mc.moveTo(0, 0);
	mc.lineTo(0, 100);
	mc.lineTo(100, 100);
	mc.lineTo(100, 0);
	mc.lineTo(0, 0);
	mc.endFill();
}
と記述。

次に、以下のように記述。
createMC();
mc.onRelease = function():Void {
	trace(this);
};
mc.removeMovieClip();
createMC();

function createMC():Void {
	(略)
}
この場合、mc は一旦削除されています。
そのため、mc.onRelease もクリアされます。
なので、同じインスタンス名の mc を生成しても、
もはやクリックできません。


----------------
質問する際は、回答者に具体的な情報を与えてください。

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

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