幼稚園時代「何組」でしたか?

FLASH8(Win-XP)使用者です。
Flashで使う「this」がよくわかりません。
相対パスで記述することを前提としておたずねしたいのですが、
たとえば、

this.txtField1.text = 'abc';
my_lv = new LoadVars();
 my_lv.onLoad = function(success){
  this.txtField2.text = 'xyz';
 }
my_lv.load("data.txt");

とすると「abc」は表示されても「xyz」は表示されません。
this.txtField2.textのthisを削除すればいいのですがtxtField2にパス(らしきもの)がなくなってしまい気に入りません。
あとで置換するとき不便ですし…
単に「txtField2.text」と書くしかないのでしょうか?
お詳しい方、よろしくお願いいたします。

A 回答 (1件)

しっかしまあ,


ikataro さんは次から次へと追究されて難題をよく発見されますね,スゴイ。
いつもながら感心しております。


この回答は長いですが,本題は最後だけです。
その本題とは ☆★☆★… より下です。
☆★☆★… より上は,
そうなる理由や私の単なる悪足掻きやが書いてあるだけなので適当に無視&スルーしてください。


まずできない理由ですが,
ご質問で書かれていらっしゃる,
その this の指す物は,my_lv ですから,
 this.txtField2.text = 'xyz';
では,
 my_lv.txtField2.text = 'xyz';
ということになってしまします。

my_lv の中には txtField2 は存在しないので,
当然 _root の txtField2 には何も表示されません。

ここまでが,
 this.txtField2.text = 'xyz';
ができない理由です。
理由は簡単ですね。


this はいつもムービークリップの階層を示すわけではないので,
LoadVarsインスタンス以外でもそういうことは起こります。
例として同様のことはボタンインスタンスでも起こります。

_root に my_btn というボタンを手動で作成して,
_root のフレームに次のように書くと失敗します。

---失敗例------------------
this.txtField1.text = 'abc';
my_btn.onRelease = function() {
this.txtField2.text = 'xyz';
};
--------------------------

しかし,
次のように書くと成功します。

---成功例-------------------
this.txtField1.text = 'abc';
my_btn.onRelease = function() {
this._parent.txtField2.text = 'xyz';
};
----------------------------

というような感じで,
ボタンインスタンス については解決済みだったので,
LoadVarsインスタンス についても同様だろうと勝手に思っていました。
そして今まで思っていただけで深く追究していませんでした。



しかし!!!!!
LoadVarsインスタンス はボタンインスタンスともまた違うようです。
次のようにすると,みごと失敗しました。

---失敗例------------------
this.txtField1.text = 'abc';
my_lv = new LoadVars();
my_lv.onLoad = function(success) {
this._parent.txtField2.text = 'xyz';
};
my_lv.load("data.txt");
----------------------------


こんな↓ことをしてみても失敗します。

---失敗例------------------
// 「data.txt」 には 「atai=123」 というデータを用意済
this.txtField1.text = 'abc';
this.createEmptyMovieClip("my_mc", 0);
my_mc.my_lv = new LoadVars();
my_mc.my_lv.onLoad = function(success) {
this._parent.txtField2.text = 'xyz';
trace("ロード自体は成功します");
trace(this.atai);
};
my_mc.my_lv.load("data.txt");
---------------------------

ムムムム難しい...。

その他
つまり,試行錯誤しても,
LoadVarsインスタンス については良い解決策が考えつきませんでした。

解決策が見つからない場合は「検索」です。



☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

ここからが本題です。

ikataro さんの探究心もスゴイと思いますが,
他にも同様のことを追究している方がいらっしゃいました。
スゴイ方はいらっしゃるのですね↓。


「*ここのthisは何を指しているのか?LoadVars()の攻略」
http://hima.chu.jp/flash/tips/whatisthis.htm
 ~引用~
> では、どうやって、a_txt(TextField)へ、
> ロードしたテキストの結果を表示すればよいのでしょうか?
> _root からの絶対パス指定?
> これは、確実ですが、面倒ですし、
> MovieClipの使いまわし(再利用)ができなくなります。
> そこで、以下のように、
> 独自の変数を付け加えることで対処できました。
> オブジェクトに独自変数を付け加える
>
> function loadData() {
>  var recv_lv:LoadVars = new LoadVars();
>  recv_lv.a_txt = this.a_txt;
>  recv_lv.onData = function (src) {
>   trace(this.a_txt);
>   this.a_txt.text = src;
>  }
>  recv_lv.load("setting.txt");
> }



つまり,
ご質問の場合はこうすれば成功します↓。

---☆成功例☆----------------
this.txtField1.text = 'abc';
my_lv = new LoadVars();
// ★ココがポイント↓
my_lv.txtField2 = this.txtField2;
my_lv.onLoad = function(success) {
this.txtField2.text = 'xyz';
};
my_lv.load("data.txt");
-----------------------------


言われてみればなるほどという感じですね。
パスの変数化の一種です。
簡単な例として,
_root に a_mc を用意して,a_mc の中にさらに b_mc を用意したとします。

 _root
  └a_mc
    └b_mc

そして,_root のフレームに次のように書くと,
b_mc が動きます。

--------------------------------
myvar = this.a_mc.b_mc;
this.onEnterFrame = function() {
myvar._x += 10;
};
--------------------------------

これと同じようなことだと思います。



ちなみに上のページは次の様に検索して,
2番目あたりにスパッと出てきたページです。
Google 検索 「"this" LoadVars」
http://www.google.co.jp/search?hl=ja&q=%22this%2 …

答えもシンプル,検索語彙も意外とシンプルで良かったのでした。
☆★☆★… より上の私の悪足掻きは何だったんだろう?
という感想です。
    • good
    • 0
この回答へのお礼

毎度お世話になって感謝です m(_ _)m
裏技まで調査していただきありがとうございます。
想像よりはるかに深い問題だったのですね…これは…
実は「this」が嫌いでひたすら絶対パスで書いていましたが最近そうもいかなくなりました。
あらためて「this」の難しさを思い知らされた気がします。
「thisはパスと思うな」
そういうことでしょうか。

今回の問題についてはどの方法がベストかは別として、割り切って「this」をつけないのが一般的なのでしょうかね。
なんせ常識がわかっていないもので…

お礼日時:2007/05/30 00:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報