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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     this["XYZ"] ;& eval("XYZ");
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
tatsu
Åê¹ÆNo.9755
投稿日時: 2004-8-7 1:40
半人前
居住地: 名古屋
投稿: 53
使用環境:
MBP"17(C2D) 2.8Ghz,4GB
Leopard10.6.4
WEB Premium CS4 + Flash CS5
this["XYZ"] ;& eval("XYZ");
いつもお世話になっております。また、
わからない事がありましたので投稿させて戴きました。

タイムラインには
date_array[0] ? date_array[14]
value_array[0] ? value_array[14]
ステージには
ダイナミックtextとして
update_date0 ? update_date12(インスタンス名)
update_value0 ? update_value12(インスタンス名)
また、upnext_btn(インスタンス名)
が存在します。
upnext_btnを押すごとにupdatePageの値を変更して
update_dateXの値を変更したいと思っていたのですが
upnext_btnを押しても値が変更されません。

原因を調べたところ以下の
//::: bug ここから :::
    略
//::: bug ここまで :::
に原因があり
trace(this["date_array["+(i+updatePage*13)+"]"] );
とすると未定義と出力されました。しかし、
trace("date_array["+(i+updatePage*13)+"]");
とすると date_array[13] 及び date_array[14] と
出力されます。
trace(eval("date_array["+(i+updatePage*13)+"]"));
ともしてみましたがやはり未定義と出力されました。
なぜ未定義と出力されるのかわかりません。
どなたかお分かりになる方ご教授願います。
ちなみにAS2・Flash7で製作です。
this.stop();
//::: 初期設定 :::
var updatePage:Number = 0;
//::: upnext_btn の表示判定 :::
if (date_array.length<=13) {
	upnext_btn._visible = false;
}
//::: 配列からtextboxに値をセット(初期) :::
if (date_array.length<=13) {
	for (var i = 0; i<date_array.length; i++) {
		this["update_date"+i] = date_array[i];
		this["update_value"+i] = value_array[i];
	}
} else {
	for (var i = 0; i<13; i++) {
		this["update_date"+i] = date_array[i];
		this["update_value"+i] = value_array[i];
	}
}
//:::upnext_btnの処理 :::
upnext_btn.onRelease = function() {
	//trace("Push upnext_btn.");  //::: debug OK :::
	if ((date_array.length-updatePage*13)>13) {
		//trace("Run checkPoint_1.");  //::: debug OK :::
		updatePage += 1;
		//trace("updatePage="+updatePage);  //::: debug OK :::
		if ((date_array.length-updatePage*13)<=13) {
			//trace("Run checkPoint_2.");  //::: debug OK :::
			for (var i = 0; i<(date_array.length-updatePage*13); i++) {
				//trace("Run checkPoint_3.");	  //::: debug OK :::
				//::: bug ここから :::
				this["update_date"+i] = this["date_array["+(i+updatePage*13)+"]"];
				this["update_value"+i] = this["value_array["+(i+updatePage*13)+"]"];
			}
		} else {
			for (var i = 0; i<13; i++) {
				this["update_date"+i] = this["date_array["+(i+updatePage*13)+"]"];
				this["update_value"+i] = this["value_array["+(i+updatePage*13)+"]"];
				//::: bug ここまで :::
			}
		}
	}
};
野中文雄
Åê¹ÆNo.9756
投稿日時: 2004-8-7 2:36
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: this["XYZ"] ;& eval("XYZ");
原因を絞込まれたところまでは、結構です。しかし、問題はもっと「単純化」できるはずです。
引用:
kahiroさんは書きました:
原因を調べたところ以下の
//::: bug ここから :::
    略
//::: bug ここまで :::
に原因があり

単純化したスクリプトは、つぎのようになります。
date_array = ["myValue"];
myValue = 100;
i = 0;
trace(this["date_array["+i+"]"]);  // 出力: undefined
trace("date_array["+i+"]");  // 出力: date_array[0]
trace(typeof ("date_array["+i+"]"));  // 出力: string
trace(eval("date_array["+i+"]"));  // 出力: undefined
trace(date_array[i]);  // 出力: myValue
trace(this[date_array[i]]);  // 出力: 100

値が出力されるようにするには、たとえばつぎのようなステートメントを追加します。
this["date_array["+i+"]"] = "where my value is setting?";  //【追加】
trace(this["date_array["+i+"]"]);
trace(eval("date_array["+i+"]"));

しかし、[変数のリストアップ]をしてみると、アクセスしている値がどういうものなのか理解できると思います。
引用:
[変数のリストアップ]:
変数 _level0.date_array = [オブジェクト #1, クラス 'Array'] [
0:"myValue"
]
...[中略]...
変数 _level0.date_array[0] = "where my value is setting?"

引用:
trace(this["date_array["+(i+updatePage*13)+"]"] );
とすると未定義と出力されました。しかし、
trace("date_array["+(i+updatePage*13)+"]");
とすると date_array[13] 及び date_array[14] と
出力されます。
trace(eval("date_array["+(i+updatePage*13)+"]"));
ともしてみましたがやはり未定義と出力されました。
なぜ未定義と出力されるのかわかりません。

おそらくこのような奇妙なアクセス方法に至ったのは、Buttonのイベントハンドラメソッドに定義したコールバック関数内のthis参照が理解されていないからではないかと推測します。
//:::upnext_btnの処理 :::
upnext_btn.onRelease = function() {
	// ...[中略]...
	//::: bug ここから :::
	this["update_date"+i] = this["date_array["+(i+updatePage*13)+"]"];


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

tatsu
Åê¹ÆNo.9762
投稿日時: 2004-8-7 15:16
半人前
居住地: 名古屋
投稿: 53
使用環境:
MBP"17(C2D) 2.8Ghz,4GB
Leopard10.6.4
WEB Premium CS4 + Flash CS5
Re: this["XYZ"] ;& eval("XYZ");
ありがとうございました、解決しました。
btnのthis参照が関数内では自身を指すのをすっかり忘れていました
長々とscriptを書く必要が無かったですね(><)
引用:

野中文雄さんは書きました:
this参照が理解されていないからではないかと推測します。

date_array = ["myValue"];
i = 0;
this["date_array["+i+"]"] = "where my value is setting?";
trace(this["date_array["+i+"]"]);  //出力:where my value is setting?
//:::upnext_btnの処理 :::
upnext_btn.onRelease = function() {
	trace(this["date_array["+i+"]"]);  //出力:undefined
	trace(_parent["date_array["+i+"]"]);  //出力:undefined
	trace(this._parent["date_array["+i+"]"]);  //出力:where my value is setting?
	}
tatsu
Åê¹ÆNo.9764
投稿日時: 2004-8-7 17:07
半人前
居住地: 名古屋
投稿: 53
使用環境:
MBP"17(C2D) 2.8Ghz,4GB
Leopard10.6.4
WEB Premium CS4 + Flash CS5
Re: this["XYZ"] ;& eval("XYZ");
解決したと思ったのですが以下のような結果に・・・
2行目と4行目は同じものを指していると思うのですがちがうのでしょうか?
//::: bug ここから :::
trace(this.date_array[13]);  //出力:2004/08/02
trace(_level0.date_array[13]);  //出力:2004/08/02
trace(this["date_array[13]"]);  //出力:undefined
trace(_parent["date_array[13]"]);  //出力:undefined
trace(this._parent["date_array[13]"]);  //出力:undefined
//以下省略

tatsu
Åê¹ÆNo.9767
投稿日時: 2004-8-8 2:09
半人前
居住地: 名古屋
投稿: 53
使用環境:
MBP"17(C2D) 2.8Ghz,4GB
Leopard10.6.4
WEB Premium CS4 + Flash CS5
Re: this["XYZ"] ;& eval("XYZ");
自己解決しました。上記の疑問はわからないままですが以下のscriptで目的は達成しました。ありがとうございました。
for (var i = 0; i<(date_array.length-updatePage*13); i++) {
//::: bug ここから :::
var j:Number = i+updatePage*13;
trace(date_array[j]);  //出力:2004/08/02
trace(value_array[j]);  //出力:2004/08/03
//以下省略

野中文雄
Åê¹ÆNo.9769
投稿日時: 2004-8-8 11:36
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: this["XYZ"] ;& eval("XYZ");
違います。先にポストしたスクリプトは、試されましたか?
引用:
野中文雄は書きました:
値が出力されるようにするには、たとえばつぎのようなステートメントを追加します。
this["date_array["+i+"]"] = "where my value is setting?";  //【追加】
trace(this["date_array["+i+"]"]);
trace(eval("date_array["+i+"]"));

しかし、[変数のリストアップ]をしてみると、アクセスしている値がどういうものなのか理解できると思います。
引用:
[変数のリストアップ]:
変数 _level0.date_array = [オブジェクト #1, クラス 'Array'] [
0:"myValue"
]
...[中略]...
変数 _level0.date_array[0] = "where my value is setting?"

引用:
kahiroさんは書きました:
2行目と4行目は同じものを指していると思うのですがちがうのでしょうか?
//::: bug ここから :::
trace(this.date_array[13]);  //出力:2004/08/02
trace(_level0.date_array[13]);  //出力:2004/08/02
trace(this["date_array[13]"]);  //出力:undefined
trace(_parent["date_array[13]"]);  //出力:undefined

あるいは、以下のスクリプトをお試しください。
date_array = new Array();
this.date_array[13] = "an element of the array";
this["date_array[13]"] = "notice where this is";
trace(this.date_array[13]);  // 出力: an element of the array
trace(this["date_array[13]"]);  // 出力: notice where this is

引用:
[変数のリストアップ]:
変数 _level0.date_array = [オブジェクト #1, クラス 'Array'] [
13:"an element of the array"
]
変数 _level0.date_array[13] = "notice where this is"

さらに、もうひとつ。
this["date_array[13"] = "another variable";
trace(this["date_array[13"]);  // 出力: another variable


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

tatsu
Åê¹ÆNo.9792
投稿日時: 2004-8-10 5:46
半人前
居住地: 名古屋
投稿: 53
使用環境:
MBP"17(C2D) 2.8Ghz,4GB
Leopard10.6.4
WEB Premium CS4 + Flash CS5
Re: this["XYZ"] ;& eval("XYZ");
わざわざありがとうございます。
まったく別の変数になっているのですか・・・。
・・・ややこしいです。

という事は、もしかしてeval関数を使って配列にはアクセスできないということですか?
(ヘルプにeval関数ではオブジェクトにはアクセスできないと書かれてましたが・・・)
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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