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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     loadVarsで読み込まれた変数の階層
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
colon
Åê¹ÆNo.17258
投稿日時: 2005-5-16 15:06
新米
居住地: 世田谷区
投稿: 21
使用環境:
Mac OS X
Flash MX Professional 2004
Safari,IE
loadVarsで読み込まれた変数の階層
こんにちは。
既にかなり語られていらっしゃるネタだと承知しておりますが、過去ログをみても解決できなかったので、恐縮ですがあらためて質問させて頂きます。

やろうとしていることは、カタログのようにサムネール画像とテキストデータを対にしたものを並べたいのですが、そのデータを外部ファイルで用意して読み込みたいのです。

_root上に複製元のサムネールとテキストを一つにしたMC(unit)を配置してこれを数分duplicateMovieClipで複製しようと考えております。

MC(unit)の1フレームには以下のスクリプトが記されております。

theLoadVars = new LoadVars();
theLoadVars.load("test.txt");
theLoadVars.onLoad = function(theSource) {
trace(this.dnum_1)
};

fileNum = 6;
leftX = t1._x;
margin = 10;
twidth = t1._width;
theight = t1._height;
//サムネイルを複製
for (i=1; i<fileNum; i++) {
newName = "t"+(i+1);
targetM = "t"+i;
duplicateMovieClip(eval(targetM), newName, i+1);
this[newName].name="this.dnum_"+i
if (this[newName]._x>=twidth*3+margin*2+leftX) {
this[newName]._x = leftX;
this[newName]._y += theight+margin;
} else {
this[newName]._x += twidth+margin;
}
}

外部テキストデータ(test.txt)はdnum_1=test1&dnum_2 .... dnum_6=test6としております。

MC(unit)に配置されたMC(t1)には画像を読み込むためのMC(base)と、テキストを読み込むダイナミックテキストエリア(pname)が配置されており、1フレーム目に以下のスクリプトを設定しております。

base.loadMovie("shopdata/img/th/book/"+_name+".jpg");

この様な設定で成功していることはサムネールの複製と画像の読み込みです。
上手くいかないことが、loadVarsで読み込んだdnum_○=○○が読み込めません。

loadVarsの箇所で
t1=dnum_1としたら1つ目のサムネールのテキストには読み込まれました。
またサムネールのMC(t1)のフレームに
pname = _parent.theLoadVars.dnum_+i;
としてみたのですが、結果はundefinedでした。

あらためてお聞きしたいのは新たに生成したloadVarsインスタンス(この場合では「theLoadVars」)はどの階層に存在し、他のMCから参照する場合ではどのような階層指定となるのでしょうか?今回の場合ですと、theLoadVarsというインスタンスはMC(unit)にあり、MC(unit)の下のMC(t1)からtheLoadVarsに読み込まれた変数「dnum_1」への参照は_parent.theLoadVars.dnum_1ではないのでしょうか?
それとも他の部分で誤りがあるのでしょうか。

長々と恐れ入りますが、よろしくお願いいたします。


環境は :FlashMX2004,mac osxです
tomoakira
Åê¹ÆNo.17261
投稿日時: 2005-5-16 17:36
新米
居住地: 千葉
投稿: 9
使用環境:
Win2000,
Re: loadVarsで読み込まれた変数の階層
こんにちは。

LoadVarsで読み込まれた変数の階層という事ですが、LoadVarsも他のターゲット指定と同じで

theLoadVars = new LoadVars();
theLoadVars.load("test.txt");

の場合は theLoadVars.変数名 となります。

読み込んだ変数が認識されない場合、読み込みが完了されてないうちに呼び出しているか、表記のミスだと思います。

引用:

またサムネールのMC(t1)のフレームに
pname = _parent.theLoadVars.dnum_+i;
としてみたのですが、結果はundefinedでした。


この部分では、まだ読み込みが完了してないので
MC(unit)の1フレーム目に書かれている

引用:

theLoadVars = new LoadVars();
theLoadVars.load("test.txt");
theLoadVars.onLoad = function(theSource) {
trace(this.dnum_1)
};


のonLoadにテキスト読み込みを書いてあげれば表示されると思います。


theLoadVars = new LoadVars();
theLoadVars.load("test.txt");
theLoadVars.onLoad = function(theSource) {
	for(var j = 1; j < fileNum; j++){
		_root.unit["t"+j].pname = theLoadVars["dnum_"+j];
	}
};
野中文雄
Åê¹ÆNo.17262
投稿日時: 2005-5-16 18:01
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: loadVarsで読み込まれた変数の階層
まず、問題を絞込むべきでしょう。回答者にわかりにくいだけでなく、ご自分でも問題のポイントが把握できない原因になります。
引用:
colonさんは書きました:
_root上に複製元のサムネールとテキストを一つにしたMC(unit)を配置してこれを数分duplicateMovieClipで複製しようと考えております。

ひとつを除いて動作するというのなら別として、すべて正しい処理がなされないのなら、まずひとつを成功させるのが先決です。
引用:
MC(unit)の1フレームには以下のスクリプトが記されております。

theLoadVars = new LoadVars();
theLoadVars.onLoad = function(theSource) {
    trace("called");
    trace(this.dnum_1);
    xSetName();
};
theLoadVars.load("test.txt");
twidth = t1._width;
i = 1;
newName = "t"+(i+1);
targetM = "t"+i;
duplicateMovieClip(eval(targetM), newName, i+1);
this[newName].name = "this.dnum_"+i;
this[newName]._x += twidth+10;
function xSetName() {
    for (var i = 1; i<=2; ++i) {
        this["t"+i].pname = theLoadVars["dnum_"+i];
    }
}

引用:
外部テキストデータ(test.txt)はdnum_1=test1&dnum_2 .... dnum_6=test6としております。

TextFieldインスタンスに設定したと思われる"pname"は、インスタンス名ですか? それとも変数名ですか? TextField.textプロパティを操作している様子が見られないので、取りあえず変数名と「推理」しました。
引用:
MC(unit)に配置されたMC(t1)には画像を読み込むためのMC(base)と、テキストを読み込むダイナミックテキストエリア(pname)が配置されており、1フレーム目に以下のスクリプトを設定しております。

「loadVarsの箇所」というのは、LoadVars.onLoadイベントのコールバック関数内ということですか?「t1」は、MovieClipインスタンスではないのでしょうか?「読み込まれ」たということは、スクリプトは正しく記述されていると推測されます。おそらく、以下のご説明が不正確なのでしょう。
引用:
loadVarsの箇所で
t1=dnum_1としたら1つ目のサムネールのテキストには読み込まれました。

a1 = 1;
i = 1;
test = a+i;

としても、testには値1は入力されません。ここも、スクリプトか以下のご説明のいずれかが誤っていると思われます。問題を絞込まないと、テストやご説明が乱雑になりがちです。
引用:
またサムネールのMC(t1)のフレームに
pname = _parent.theLoadVars.dnum_+i;
としてみたのですが、結果はundefinedでした。

ステートメントを以下に変更して、出力とそのタイミングにご注目ください。
// MovieClip: _root.unit.t1
// 第1フレームアクション
trace(_parent.theLoadVars);

引用:
あらためてお聞きしたいのは新たに生成したloadVarsインスタンス(この場合では「theLoadVars」)はどの階層に存在し、他のMCから参照する場合ではどのような階層指定となるのでしょうか?今回の場合ですと、theLoadVarsというインスタンスはMC(unit)にあり、MC(unit)の下のMC(t1)からtheLoadVarsに読み込まれた変数「dnum_1」への参照は_parent.theLoadVars.dnum_1ではないのでしょうか?
それとも他の部分で誤りがあるのでしょうか。


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

野中文雄
Åê¹ÆNo.17264
投稿日時: 2005-5-16 18:09
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: loadVarsで読み込まれた変数の階層
1点修正した方がよいでしょう。
引用:
tomoakiraさんは書きました:
のonLoadにテキスト読み込みを書いてあげれば表示されると思います。
theLoadVars = new LoadVars();
theLoadVars.target_mc = this;
theLoadVars.load("test.txt");
theLoadVars.onLoad = function(theSource) {
    for(var j = 1; j < fileNum; j++){
        // this["t"+j].pname = theLoadVars["dnum_"+j];
        this.target_mc["t"+j].pname = theLoadVars["dnum_"+j];
    }
};


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

tomoakira
Åê¹ÆNo.17266
投稿日時: 2005-5-16 18:35
新米
居住地: 千葉
投稿: 9
使用環境:
Win2000,
Re: loadVarsで読み込まれた変数の階層
構造不理解のまま書き込んでしまいました。
誤解が発生しないよう、修正しておきました。

野中さん修正ありがとうございます。
colon
Åê¹ÆNo.17269
投稿日時: 2005-5-16 20:40
新米
居住地: 世田谷区
投稿: 21
使用環境:
Mac OS X
Flash MX Professional 2004
Safari,IE
Re: loadVarsで読み込まれた変数の階層
tomoakira様、野中様

ご親切なご回答ありがとうございました!
投稿が不十分かつ、ミスもあり申し訳ありませんでした。
おっしゃれられたように一度に複数のことをやろうとしていたため、スクリプトの実行タイミングを見落としておりました。
おかげさまでこの様にして意図していることが上手くいきました。

また以前の投稿ではちゃんと書いていなかったのですが、MC(t1)の中にはインスタンス名が「pname」のダイナミックテキストエリアでした。申し訳ありません。

fileNum = 6;
leftX = t1._x;
margin = 10;
twidth = t1._width;
theight = t1._height;
theLoadVars = new LoadVars();
theLoadVars.onLoad = function(theSource) {
xSetName();
};
theLoadVars.load("test.txt");
function xSetName() {
for (var i = 1; i<=fileNum; ++i) {
newName = "t"+(i+1);
targetM = "t"+i;
duplicateMovieClip(eval(targetM), newName, i+1);
this[newName].name = "this.dnum_"+i;
if (this[newName]._x>=twidth*3+margin*2+leftX) {
this[newName]._x = leftX;
this[newName]._y += theight+margin;
} else {
this[newName]._x += twidth+margin;
}
this["t"+i].pname.text = theLoadVars["dnum_"+i];
}
}


またここのところですが、修正前のtargetM = "t"+i;を指定しないとthisでは「theLoadVars」を指さないということなのでしょうか?なんか、this.this....みたいな感じでこんがらがってしまってます。

質問ばかりで申し訳ありませんがよろしくお願いいたします。

引用:

野中文雄さんは書きました:
1点修正した方がよいでしょう。
引用:
tomoakiraさんは書きました:
のonLoadにテキスト読み込みを書いてあげれば表示されると思います。
theLoadVars = new LoadVars();
theLoadVars.target_mc = this;
theLoadVars.load("test.txt");
theLoadVars.onLoad = function(theSource) {
    for(var j = 1; j < fileNum; j++){
        // this["t"+j].pname = theLoadVars["dnum_"+j];
        this.target_mc["t"+j].pname = theLoadVars["dnum_"+j];
    }
};
tomoakira
Åê¹ÆNo.17275
投稿日時: 2005-5-16 23:13
新米
居住地: 千葉
投稿: 9
使用環境:
Win2000,
Re: loadVarsで読み込まれた変数の階層
元の記事を修正したことが、返って誤解を招いたみたいですみません。

最初に自分が提示したコードが


theLoadVars = new LoadVars();
theLoadVars.load("test.txt");
theLoadVars.onLoad = function(theSource) {
    for(var j = 1; j < fileNum; j++){
        this["t"+j].pname = theLoadVars["dnum_"+j];
    }
};


だったので、ターゲット指定のミスがあり
(5行目頭のthisはtheLoadVarsを指すので、theLoadVars.t1.pname等ではパスが間違えてるのでundefinedになります。)
上記のままでは動かないコードだったので、野中さんに修正して貰ったのが


theLoadVars = new LoadVars();
theLoadVars.target_mc = this;
theLoadVars.load("test.txt");
theLoadVars.onLoad = function(theSource) {
    for(var j = 1; j < fileNum; j++){
        // this["t"+j].pname = theLoadVars["dnum_"+j];
        this.target_mc["t"+j].pname = theLoadVars["dnum_"+j];
    }
};


となります。
theLoadVars.target_mc = this;
スクリプトが書かれているのがMC(unit)なので、
thisが代入されてtheLoadVars.target_mcはこの場合_root.unitを意味する事になり、
this.target_mc["t"+j].pname = theLoadVars["dnum_"+j];
スクリプトが書かれているのがtheLoadVars.onLoad = functionなので、this.target_mcはtheLoadVars.target_mcを指し、
_root.unit["t"+j].pname = theLoadVars["dnum_"+j];
という意味になり正常に動きます。
野中文雄
Åê¹ÆNo.17278
投稿日時: 2005-5-17 8:18
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: loadVarsで読み込まれた変数の階層
「ここのところ」が、どこのところかわかりませんでした。せめてそこのステートメントを引用いただけると、理解しやすかったと思われます。

theLoadVars.target_mc = this;
このステートメントを挿入した意味でしたら、tomoakiraさんのご説明されたとおりです。this参照とターゲットを指定しない「デフォルト参照」との違いについては、「Buttonのthis」をご参照ください。
引用:
colonさんは書きました:
またここのところですが、修正前のtargetM = "t"+i;を指定しないとthisでは「theLoadVars」を指さないということなのでしょうか?なんか、this.this....みたいな感じでこんがらがってしまってます。

なお、つぎのように書替えることも可能です。
theLoadVars.onLoad = function(theSource) {
    for(var j = 1; j < fileNum; j++){
        // this["t"+j].pname = theLoadVars["dnum_"+j];
        // this.target_mc["t"+j].pname = theLoadVars["dnum_"+j];
        this.target_mc["t"+j].pname = this["dnum_"+j];
        trace(this.target_mc === _root.unit);  // 出力: true
        trace(this === theLoadVars);  // 出力: true
    }
};

さらに、Delegateクラスを使うことも考えられるでしょう。
theLoadVars.onLoad = Delegate.create(this, function (theSource) {
    for (var j = 1; j<fileNum; j++) {
        this["t"+j].pname = theLoadVars["dnum_"+j];
    }
});


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

colon
Åê¹ÆNo.17286
投稿日時: 2005-5-17 20:45
新米
居住地: 世田谷区
投稿: 21
使用環境:
Mac OS X
Flash MX Professional 2004
Safari,IE
Re: loadVarsで読み込まれた変数の階層
tomoakira様、野中様

とてもご丁寧に説明頂いて、大変わかりやすく、またあらたな方法まで教えて頂いて、とても勉強になりました。もやっとしてたものが晴れた思いです!
元々スクリプトが苦手でこつこつと覚えてきたつもりでおりましたが、やっぱりまだまだ基礎ができていなと実感しました。

この度は、本当にありがとうございました!
ふつつか者ですが今後ともどうぞよろしくお願いいたします(ペコリ)
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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