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

パスワード:


パスワード紛失

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

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
xStaff
Åê¹ÆNo.13020
投稿日時: 2004-12-3 20:19
新米
居住地:
投稿: 20
使用環境:
WinXp,Flash MX2004(7.2)
Re: タイムライン上の関数の参照ができない
flashを触り始めた先月、vbとの開発効率の差に嘆いておりましたが、
おかげさまで、flashを多少習得できてきた今、flashを徐々に楽しめるようになってきております。

これからもまだflashとの格闘の日々は続くと思いますが、
今後ともよろしくお願いします。
この度はご指導ありがとうございました。



余談ですが、1週間前は、スレッド「V2ComponentのDataGridでVscrollがおかしい・・・」と同様のバグ?にハマっておりました(笑)












野中文雄
Åê¹ÆNo.13003
投稿日時: 2004-12-3 13:30
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: タイムライン上の関数の参照ができない
Bingo! これですっきりしました。
引用:
xStaffさんは書きました:
>つまり、LoadVars.onLoadメソッド呼出し時に、ターゲットのタイムライン(target_mc)が存在しない可能性はありませんか?

のご指摘の箇所が問題でした。

フレーム移動の必要があったら、LoadVars.onLoadメソッドに設定したコールバック関数の最後に挿入すればよいですね。
引用:
関数aを呼び出した直後に、gotoAndPlayでフレームを移動させておりました。gotoAndPlayをコメント化したら、あっけなく動いてしまいました。

多くのプログラミング言語では、インスタンスに対する参照がなくなったとき、「ガーベジコレクション」[*1]によりメモリがクリアされます。参照が保持されている間は、インスタンスが存続します。

MovieClipインスタンスは、この点で特殊です。あくまで、タイムライン上の実体として、扱われます。つまり、参照の有無にかかわらず、親タイムライン(_parent)から実体が消滅したときにインスタンスは破棄されます。インスタンスに設定されたタイムライン変数や、ユーザー定義のプロパティ(メソッド)も運命を共にします。

そして、MovieClipインスタンスの実体がタイムラインから消滅すると、参照にはパスをもたず(文字列表現が"")データタイプ(typeof演算子の戻り値)"movieclip"の何者かが残ってしまったということですね。
引用:
タイムライン上に作った関数は、カーソルがそのタイムライン上でないと利用できない ということだったのですね。

「ソースの簡略化」は、問題を絞込むプロセスです。これが適切にできれば、問題は半分解決したも同じです。要領よくできるかどうかは、多分に経験にも依存します。まずは、やってみることが大切です。

少なくとも、回答者のアドバイス・確認事項にしたがった結果や、ご自分で独自に調べられた情報を詳しく報告された点がよかったと思います。えてしてパニックになってしまうのか、ご自分の質問ばかりに意識がいってしまい、回答者のアドバイスや確認を読み飛ばしてしまわれる例が少なくありません。そうすると、解決が遅くなるばかりか、貴重なスキルアップの機会を逃してしまうことになりがちです。

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

_____
[*1]引用:
拙著『オブジェクト指向で考えるActionScript』p.158注[*9]より:
ActionScriptでは「ガーベジコレクション」という技術により、オブジェクトインスタンスは自動的に削除されます。削除してよいかどうかは、そのインスタンスを参照している変数(プロパティ)が存在するかどうかで判断されます。
これは食堂で、お客さんが席を立って帰ったらテーブルの上をかたづけるというのに似ています。グループ客の場合には、その全員が食事を終えて誰も席にいなくなってからかたづけを行います。つまり、複数の変数(プロパティ)がインスタンスを参照している場合は、最後の変数が削除されて参照がすべて失われたときに、オブジェクトインスタンスはメモリーから消去されます。


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

空野大二郎
Åê¹ÆNo.13001
投稿日時: 2004-12-3 10:45
職人
居住地: 愛知
投稿: 389
使用環境:
 XP:Home
FlashMX
IE6.0+FlashPlayer7,0,19
CPU:Pentium4 2.26GHz
メモリ:1,024MB
Re: タイムライン上の関数の参照ができない
 まいど。
 xStaffさん、解決おめでとうございます。

 ターゲットパスが存在しないのに、movieclipの存在だけある状態を
作り出せなくて、てっきり「ゆーれーのしわざだ!」とか、非科学的な
妄想にとりつかれていました。
引用:
xStaffさんは書きました:
onLoadの中に

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

,movieclip
と出力されました。


 野中さん、回答してくれてありがとうございました。


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

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

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


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


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


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

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

野中文雄
Åê¹Æ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.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.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 となりました。


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

空野大二郎
Åê¹Æ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();


 いかがでしょう。


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

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.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();
  }


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

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

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