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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     タイムライン上の関数の参照ができない
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
xStaff
Åê¹ÆNo.12945
投稿日時: 2004-12-1 16:33
新米
居住地:
投稿: 20
使用環境:
WinXp,Flash MX2004(7.2)
タイムライン上の関数の参照ができない
お世話になります。

ムービークリップ上のボタンオブジェクトから
ムービークリップのタイムライン上に記述した関数は参照できるのですが、
その関数から、同じ階層の関数を参照することができません。


基本的な質問で恐縮ですが、アドバイスを頂きたく投稿させていただきます。


ムービークリップ上のボタンイベント
_parent.a(); //問題なし


ムービークリップのフレーム1上の関数
function a(){
trace("a called"); //表示される
this.b(); //処理されない
}


ムービークリップのフレーム1上の関数
function b(){
trace("b called"); //表示されない・・・・
}


関数aから関数bを参照することができません。
thisや_parentや_rootを組み合わせていくつか試したのですが、
参照できません。


とても簡単な解決法がある気がしておりますが、
どなたかご存知の方がみえましたら、よろしくお願いします。

野中文雄
Åê¹ÆNo.12946
投稿日時: 2004-12-1 17:00
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: タイムライン上の関数の参照ができない
両関数とも「ムービークリップのフレーム1上」ということは、同じスクリプトペイン内ですか? それとも、レイヤーを分けているのでしょうか?

以下のtrace()ステートメントを挿入すると、[出力]パネルにはどのような結果が表示されますか?
引用:
xStaffさんは書きました:
ムービークリップのフレーム1上の関数
trace("outside a():");
trace([this, this.a, this.b]);
function a(){
  trace("a called");  //表示される
  trace("inside a():");
  trace([this, this.a, this.b]);
  this.b(); //処理されない
}


ムービークリップのフレーム1上の関数
trace("outside b():");
trace([this, this.a, this.b]);
function b(){
  trace("inside b():");
  trace([this, this.a, this.b]);
  trace("b called");  //表示されない・・・・
}

関数aから関数bを参照することができません。


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

xStaff
Åê¹ÆNo.12951
投稿日時: 2004-12-1 21:44
新米
居住地:
投稿: 20
使用環境:
WinXp,Flash MX2004(7.2)
Re: タイムライン上の関数の参照ができない
野中さん、ありがとうございます。




私が投稿したソースは簡素化して記述したつもりだったのですが、
簡素化にミスがありました。
また、野中さんのご指摘により、気付いたことがあります。



実際は、
関数aの中のsendAndLoadのonLoadに割り当てた関数から、
同じレイヤのフレーム1の関数bを呼び出すものとなっております。


そういった環境で、関数bを呼び出す箇所で
trace([this]);
を処理したとき、thisの内容としてサーバから返ってきた文字列(LoadVarsだと思います)が出力されました。

ということは、処理しているカーソルといいますか、階層といいますか、
ポジションとしては、onLoadの中のようです。

あてずっぽで、_parent._parentとを付けてやってみましたがダメでした。
onLoadの中から関数bへのパスが思いつきません。


ソースとしては

ムービークリップ上のレイヤ1上のボタンから
_parent.a(); //問題なく処理される。


レイヤ1のタイムライン1フレームに
function a(){


//送信用フォームオブジェクト
var formData : Object;
formData = new LoadVars();
 

//受信用オブジェクト
var receivedData;
receivedData = new LoadVars();

//レスポンス取得後処理
receivedData.onLoad = function() {


  trace([this]); //receivedDataの内容が出力されている様子

this.b();  //処理されていない・・・・

}

//データ取得
formData.sendAndLoad(
"http://192.168.1.101/servlet/GetData",
receivedData,
"GET");

}


//関数b(関数aと同じレイヤ)
function b(){
trace("b called"); //処理されない・・・・
}





このような、環境で関数bは呼び出し可能なのでしょうか?
大変申し訳ありませんが、アドバイスよろしくお願いします。

野中文雄
Åê¹ÆNo.12953
投稿日時: 2004-12-1 22:18
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: タイムライン上の関数の参照ができない
簡略化するプロセスは、問題を絞込むために重要です。もう1歩、簡略化したスクリプトで、実際にお試しになるとよかったですね。
引用:
xStaffさんは書きました:
私が投稿したソースは簡素化して記述したつもりだったのですが、
簡素化にミスがありました。

やはり、そんな状況ではないかと、想像していました。
引用:
関数aの中のsendAndLoadのonLoadに割り当てた関数から、
同じレイヤのフレーム1の関数bを呼び出すものとなっております。

thisが、LoadVarsインスタンス(receivedData)を参照しています。

参考:「Buttonのthis
引用:
そういった環境で、関数bを呼び出す箇所で
trace([this]);
を処理したとき、thisの内容としてサーバから返ってきた文字列(LoadVarsだと思います)が出力されました。

以下を、お試しください。
引用:
レイヤ1のタイムライン1フレームに
...[中略]...
  //受信用オブジェクト
  var receivedData;
  receivedData = new LoadVars();
  receivedData.target_mc = this;

  //レスポンス取得後処理
  receivedData.onLoad = function() {

    
    trace([this]); //receivedDataの内容が出力されている様子
    trace(this. target_mc);
    //  this.b();   //処理されていない・・・・
     this.target_mc.b();
  }


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

xStaff
Åê¹ÆNo.12975
投稿日時: 2004-12-2 10:16
新米
居住地:
投稿: 20
使用環境:
WinXp,Flash MX2004(7.2)
Re: タイムライン上の関数の参照ができない
野中さん、ありがとうございます。

簡略化のミスはお恥ずかしいところですが、
もうひつと説明不足な箇所がありました。

ムービークリップ上のボタンと説明しておりましたが、
実際は、ムービークリップ上のデータグリッドのセルクリックイベントから、関数aを呼び出しております。
度々の説明不足、申し訳ありません。



教えて頂いた、コードを試したところ、
trace(this.target_mc);の箇所では、何も表示されず、
this.target_mc.b();の箇所も処理されていない様子です。

receivedData.target_mc = this;
の直後に
trace([receivedData.target_mc]); //trace(this.target_mc);前チェック
と記述すると、
_level0.mcTest
と出力されます。
しかし、onLoadの中のtrace([receivedData.target_mc]);は何も出力されません。

sendAndLoadの瞬間に消えてしまっているのかな?と思い、
receivedData.target_mc = this;の箇所を
外部asファイルにstatic変数を用意して
Kyotu.target_mc = this;
としましたが、最初と同様、onLoadの中では何も表示されませんでした。

また、ダメもとでonLoadの中で
_level0.mcTest.b();
とやってみましたが、反応はありませんでした。


そのほか、onLoadの中で
trace([this._paren]);を試したところ
undefined となりました。


そのほか、関数aの呼び出し元でthisや_parentを保存したり
してみましたが、どうしてもonloadの中でそれを参照できません。


もしかしたら、私の環境の説明がまだ不足しているかもしれません。



大変申し訳ありませんが、何かお気付きの点があれば、
ご指摘よろしくお願いします。

空野大二郎
Åê¹ÆNo.12978
投稿日時: 2004-12-2 11:20
職人
居住地: 愛知
投稿: 389
使用環境:
 XP:Home
FlashMX
IE6.0+FlashPlayer7,0,19
CPU:Pentium4 2.26GHz
メモリ:1,024MB
Re: タイムライン上の関数の参照ができない
 まいど。

 たった一カ所、気になる点があります。
 receivedData.load("xxx.text");
 のように、「receivedData」に対してload()関数を実行されているでしょうか?
 load()関数を実行して成功しない場合は、receivedData.onLoad
イベントも発生しません。
引用:
xStaffさんは書きました:
教えて頂いた、コードを試したところ、
trace(this.target_mc);の箇所では、何も表示されず、
this.target_mc.b();の箇所も処理されていない様子です


 一応、xStaffさんの状況を再現してみました。

1:_rootにムービークリップ「mcTest」を配置。

2:load()テスト用のテキストファイル「loadvari_test.txt」を用意。
 中身は「words=1&」のように、カンタンに。

3:_rootの1フレーム目、フレームスクリプトを記述
function b() {
	trace("b called"); 
}
this.stop();


4:_root.mcTestの1フレーム目、フレームスクリプトを記述

var receivedData = new LoadVars();
receivedData.target_mc = this;  //レスポンス取得後処理
receivedData.onLoad = function() {
	trace('[this] = ' + [this]); //receivedDataの内容が出力されている様子
	trace('this.target_mc = ' + this.target_mc);
	//「this.target_mc = _level0.mcTest」と表示
 
	this.b();  //処理されていない・・・・
	this.target_mc._parent.b();  //「b called」と表示
};
receivedData.load("loadvari_test.txt");

this.stop();


 いかがでしょう。


----------------
空野 大二郎 アニメーター作家
桜の道

野中文雄
Åê¹ÆNo.12981
投稿日時: 2004-12-2 12:21
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: タイムライン上の関数の参照ができない
「何も表示され」ないというのが問題です。設定されていなかったり、変数名を間違っていれば、"undefined"が表示されるはずです。空文字列("")が設定されているのでなければ、LoadVars.onLoadイベントハンドラメソッド自体が呼出されていないと考えられる状況です。
引用:
xStaffさんは書きました:
教えて頂いた、コードを試したところ、
trace(this.target_mc);の箇所では、何も表示されず、

変数target_mcが正しく参照されていなければ、何も起こらなくて当然です。
引用:
this.target_mc.b();の箇所も処理されていない様子です。

LoadVarsインスタンスreceivedDataには、タイムライン_level0.mcTestが設定されたということですね。
引用:
receivedData.target_mc = this;
の直後に
trace([receivedData.target_mc]); //trace(this.target_mc);前チェック
と記述すると、
_level0.mcTest
と出力されます。

つぎのように書き直してください。typeof演算子が何も返さないことはありえませんので、今度何も出力されなかったらLoadVars.onLoadメソッドが呼出されていないことになります。
	trace([this.target_mc, typeof this.target_mc]);

引用:
しかし、onLoadの中のtrace([receivedData.target_mc]);は何も出力されません。

LoadVars.sendAndLoad()を呼出した結果として、結果の変数が正しく取得されているのでしょうか? そこで問題があれば、ターゲットのreceivedDataに設定されたコールバック関数(receivedData.onLoad)が呼出されないこともありえます。
引用:
sendAndLoadの瞬間に消えてしまっているのかな?と思い、

外部ActionScriptファイルで、クラス定義をされているのですか?その場合には、また前提がかなり変わってきます。
引用:
receivedData.target_mc = this;の箇所を
外部asファイルにstatic変数を用意して
Kyotu.target_mc = this;
としましたが、最初と同様、onLoadの中では何も表示されませんでした。

そもそも呼出されていないという可能性が、濃厚に思えます。
引用:
また、ダメもとでonLoadの中で
_level0.mcTest.b();
とやってみましたが、反応はありませんでした。

以下の結果だけが、上記と異質です。これは、LoadVars.onLoadメソッドが呼出されていることを示すからです。

_parentの綴りが違っています。しかし、いずれにしてもLoadVarsインスタンスに_parentプロパティは存在しないので、同じ結果でしょう。
引用:
そのほか、onLoadの中で
trace([this._paren]);を試したところ
undefined となりました。


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

xStaff
Åê¹ÆNo.12985
投稿日時: 2004-12-2 14:28
新米
居住地:
投稿: 20
使用環境:
WinXp,Flash MX2004(7.2)
Re: タイムライン上の関数の参照ができない
野中さん、空野さん ありがとうございます。


sendAndLoadメソッドを実行し、レスポンスを取得すると、
onLoadメソッドが呼び出され、
また、sendAndLoadメソッドを呼び出す前にonLoadを設定しておく
ことも理解できております。



onLoadの中に

trace([this.target_mc, typeof this.target_mc]);
を記述したところ、

,movieclip
と出力されました。

onLoadメソッドがsendAndLoadの後に呼び出されいるのは
これで確認できるのですが、this.target_mcが消えてしまうのが理解できません。


ちなみに、無意味かもしれまんが、
trace([typeof this]);
とやると、objectと出力されました。


sendAndLoadの直前に
trace( [receivedData.target_mc, typeof receivedData.target_mc]);を入れたら
_level0.mcDayMeisai,movieclip
と出力されました。

onLoadが呼び出される直前までは、問題無いように思えます。



この結果からお気付きの点があれば、ご指摘よろしくお願いします。

野中文雄
Åê¹ÆNo.12997
投稿日時: 2004-12-3 9:01
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: タイムライン上の関数の参照ができない
簡略化したサンプルがあったら、アップロードしていただくことは可能ですか?

[出力]結果が謎です。まず、LoadVars.onLoadイベントハンドラメソッドは、正しく呼出されているということですね。しかし、インスタンスの文字列表現が空白になるのは、空白文字列("")しか考えられません。何らかの(たとえばスペル)ミスで設定や参照がされていないなら、未定義値undefinedになるはずです。typeof演算子の戻り値が"movieclip"になる点は、理解できません。
引用:
xStaffさんは書きました:
onLoadの中に

trace([this.target_mc, typeof this.target_mc]);
を記述したところ、

,movieclip
と出力されました。

LoadVarsインスタンスは、typeof演算子で"object"と返されるはずです。
引用:
ちなみに、無意味かもしれまんが、
trace([typeof this]);
とやると、objectと出力されました。

target_mcは、設定されているということですね。
引用:
sendAndLoadの直前に
trace( [receivedData.target_mc, typeof receivedData.target_mc]);を入れたら
_level0.mcDayMeisai,movieclip
と出力されました。

ここまで書いて、上記の現象を再現できる方法が、ひとつだけ思いつきました。
// フレームアクション
var _mc = this.createEmptyMovieClip("my_mc", 1);
trace([_mc, typeof _mc]);  // 出力: _level0.my_mc,movieclip
_mc.removeMovieClip();
trace([_mc, typeof _mc]);  // 出力: ,movieclip

MovieClipインスタンスを動的に生成・削除しなくても、インスタンスの参照を変数に設定し、インスタンスの存在しないフレームで[出力]すれば同じ結果でした。

つまり、LoadVars.onLoadメソッド呼出し時に、ターゲットのタイムライン(target_mc)が存在しない可能性はありませんか?


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

xStaff
Åê¹ÆNo.13000
投稿日時: 2004-12-3 9:47
新米
居住地:
投稿: 20
使用環境:
WinXp,Flash MX2004(7.2)
Re: タイムライン上の関数の参照ができない
ありがとうございます!
まさに、

>つまり、LoadVars.onLoadメソッド呼出し時に、ターゲットのタイムライン(target_mc)が存在しない可能性はありませんか?


のご指摘の箇所が問題でした。
関数aを呼び出した直後に、gotoAndPlayでフレームを移動させておりました。gotoAndPlayをコメント化したら、あっけなく動いてしまいました。


タイムライン上に作った関数は、カーソルがそのタイムライン上でないと利用できない ということだったのですね。


今回はflashの基本が理解できていないこと以外に
自分のソースの簡略化が適切でなかったことにも、
大きな問題点があったと認識しております。

野中様、空野様、この度は、問題解決にご指導頂きまして、
大変ありがとうございました。

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

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