メイン 迷える子羊の部屋【初心者専用】 タイムライン上の関数の参照ができない | 投稿するにはまず登録を |
スレッド表示 | 古いものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
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メソッドに設定したコールバック関数の最後に挿入すればよいですね。 引用: 関数aを呼び出した直後に、gotoAndPlayでフレームを移動させておりました。gotoAndPlayをコメント化したら、あっけなく動いてしまいました。 多くのプログラミング言語では、インスタンスに対する参照がなくなったとき、「ガーベジコレクション」[*1]によりメモリがクリアされます。参照が保持されている間は、インスタンスが存続します。 MovieClipインスタンスは、この点で特殊です。あくまで、タイムライン上の実体として、扱われます。つまり、参照の有無にかかわらず、親タイムライン(_parent)から実体が消滅したときにインスタンスは破棄されます。インスタンスに設定されたタイムライン変数や、ユーザー定義のプロパティ(メソッド)も運命を共にします。 そして、MovieClipインスタンスの実体がタイムラインから消滅すると、参照にはパスをもたず(文字列表現が"")データタイプ(typeof演算子の戻り値)"movieclip"の何者かが残ってしまったということですね。 引用: タイムライン上に作った関数は、カーソルがそのタイムライン上でないと利用できない ということだったのですね。 「ソースの簡略化」は、問題を絞込むプロセスです。これが適切にできれば、問題は半分解決したも同じです。要領よくできるかどうかは、多分に経験にも依存します。まずは、やってみることが大切です。 少なくとも、回答者のアドバイス・確認事項にしたがった結果や、ご自分で独自に調べられた情報を詳しく報告された点がよかったと思います。えてしてパニックになってしまうのか、ご自分の質問ばかりに意識がいってしまい、回答者のアドバイスや確認を読み飛ばしてしまわれる例が少なくありません。そうすると、解決が遅くなるばかりか、貴重なスキルアップの機会を逃してしまうことになりがちです。 ともあれ、解決してよかったです。がんばってください。 引用: 今回はflashの基本が理解できていないこと以外に _____ [*1]引用: 拙著『オブジェクト指向で考えるActionScript』p.158注[*9]より: |
空野大二郎 | Åê¹Æ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さんは書きました: 野中さん、回答してくれてありがとうございました。
|
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さんは書きました: LoadVarsインスタンスは、typeof演算子で"object"と返されるはずです。 引用: ちなみに、無意味かもしれまんが、 target_mcは、設定されているということですね。 引用: sendAndLoadの直前に ここまで書いて、上記の現象を再現できる方法が、ひとつだけ思いつきました。
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さんは書きました: 変数target_mcが正しく参照されていなければ、何も起こらなくて当然です。 引用: this.target_mc.b();の箇所も処理されていない様子です。 LoadVarsインスタンスreceivedDataには、タイムライン_level0.mcTestが設定されたということですね。 引用: receivedData.target_mc = this; つぎのように書き直してください。typeof演算子が何も返さないことはありえませんので、今度何も出力されなかったらLoadVars.onLoadメソッドが呼出されていないことになります。
引用: しかし、onLoadの中のtrace([receivedData.target_mc]);は何も出力されません。 LoadVars.sendAndLoad()を呼出した結果として、結果の変数が正しく取得されているのでしょうか? そこで問題があれば、ターゲットのreceivedDataに設定されたコールバック関数(receivedData.onLoad)が呼出されないこともありえます。 引用: sendAndLoadの瞬間に消えてしまっているのかな?と思い、 外部ActionScriptファイルで、クラス定義をされているのですか?その場合には、また前提がかなり変わってきます。 引用: receivedData.target_mc = this;の箇所を そもそも呼出されていないという可能性が、濃厚に思えます。 引用: また、ダメもとでonLoadの中で 以下の結果だけが、上記と異質です。これは、LoadVars.onLoadメソッドが呼出されていることを示すからです。 #_parentの綴りが違っています。しかし、いずれにしてもLoadVarsインスタンスに_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さんは書きました: 一応、xStaffさんの状況を再現してみました。 1:_rootにムービークリップ「mcTest」を配置。 2:load()テスト用のテキストファイル「loadvari_test.txt」を用意。 中身は「words=1&」のように、カンタンに。 3:_rootの1フレーム目、フレームスクリプトを記述
4:_root.mcTestの1フレーム目、フレームスクリプトを記述
いかがでしょう。
|
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に割り当てた関数から、 thisが、LoadVarsインスタンス(receivedData)を参照しています。 参考:「Buttonのthis」 引用: そういった環境で、関数bを呼び出す箇所で 以下を、お試しください。 引用: レイヤ1のタイムライン1フレームに |
(1) 2 » |
スレッド表示 | 古いものから | 前のトピック | 次のトピック | トップ |
投稿するにはまず登録を | |