- ベストアンサー
外部テキストが複数のインスタンスに読み込まれない?
- ボタンをクリックして外部テキストを読み込む構想。
- ダミーボタン1をクリックした時、指定フレームへ飛び、外部テキストを読み込んでダイナミックテキストに表示。
- しかし、ムービープレビューするとテキストが表示されない。パスが間違っている可能性がある。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1&2 です。 > 表示ということで > a(mc)内のフレーム5 > this.t1.htmlText = _root.b.my_lv.text1; > this.m1.htmlText = _root.b.my_lv.text1_a; > と書きましたところ無事に出ました! > が、これでは表示させたのとはちょっと違いますよね(汗 意味 (スクリプトではなく日本語の方) がよくわかりませんが...。 これは表示させたこと だと思います。 > this.t1.htmlText = _root.b.my_lv.text1; これを詳細に書くと → this(_root.b.a のこと) の t1 というインスタンス名のテキストフィールドの htmlText プロパティ に _root.b にある my_lv インスタンスに格納された text1 という変数の値を代入 簡単に書くと → テキストフィールド _root.b.a.t1 に HTML として _root.b.my_lv の text1 という変数の値を代入 さらに簡単に書くと → テキストフィールド _root.b.a.t1 に _root.b.my_lv.text1 を表示 です。 したがって これは表示させたこと だと思います。 ============= ただし, > a(mc)内のフレーム5 にたどり着いたときに, 「my_lv (_root.b.my_lv)」 に外部データが読み込まれているとは限りません。 ですから実際には, my_lv.onLoad = function(s) { if (s) { ★★★; } }; の ★★★ の部分で, 非アクティブ状態にしておいたボタンを (↑Button.enabled を false にしておいたボタンを,) アクティブ状態にするとか , (↑Button.enabled を true にするとか,) 非表示ににしておいたボタンを (↑Button._visible を false にしておいたボタンを) 表示させるとかして, (↑Button._visible を true にするとかして,) 外部データロード完了までボタンを機能させないようなしくみを作るとか, 外部データロード完了まで _root.b.a.t1 に _root.b.my_lv.text1 を表示させるのを待つようなしくみを作る必要があります。 その他色々な方法や手段があります。 とにかく何かそのような手段でロードを待つ必要があります。 しかし, それはそれ(エラー処理 や バグ取り)であって, 「ロードする」 「表示させる」 とは別問題と言えば別問題です。 「ロードする」→「ロードが完了する」→「表示させる」 です。 ローカルの場合, かなり早くロードは完了します。 5フレームも待てば必ず「表示させる」ことができると思います。 しかしネット上ではそうも行かないので 「ロードする」→「ロードが完了する」→「表示させる」 という流れを 「強く意識する必要」 があります。 とにかく何にしても それはそれ(エラー処理 や バグ取り) の方の領域です。 必須領域ですが。
その他の回答 (2)
- BlurFiltan
- ベストアンサー率91% (1611/1754)
#1 です。 > 以下ちょっと変えてみました。が、まだ表示されません… それは 「どこ」 に 「何」 が表示されないのでしょうか? 「テキストフィールド」 に 「外部データ」 が表示されないのでしょうか? それとも 「出力ウィンドウ」 に 「trace の内容(外部データ)」 が表示されないのでしょうか? もし, 「出力ウィンドウ」 に 「trace の内容(外部データ)」 が表示されるけど, 「テキストフィールド」 に 「外部データ」 が表示されないのでしたら, LoadVarsインスタンス 「my_lv」 内には外部データはロードされていることになります。 階層図を書きます。 _root(メインのタイムライン) └ b (MovieClipインスタンス)←手動で作成 └ my_lv (LoadVarsインスタンス)←ASで作成 つまり, _root.b.my_lv 内には外部データがロードされていることになります。 あとは, ボタン(ダミーボタン)からその my_lv 内の変数を取り出して, テキストフィールド に各値を表示させれば良いだけだと思います。 ※「ロード」と「表示」は全く別物です。 切り分けて考えてください。 ボタンには, on (release) { _root.b.gotoAndStop(2); _root.b.a.t1.htmlText = _root.b.my_lv.text1; _root.b.a.m1.htmlText = _root.b.my_lv.text1_a; } のような感じのことを書けば良いと思います。 ムービーの構造などが正確には把握できないのでよくわかりませんが, 大筋ではそんな感じでできると思いますよ。 もし, 「出力ウィンドウ」 に 「trace の内容(外部データ)」 が表示されない状態でしたら, テキストのファイル名や ファイル内のデータや ファイルの置き場所 などが悪いと思います。
補足
先ほどはお礼を書き忘れてしまい申し訳ありませんでした。 ここで改めてお礼させてください。 アドバイスありがとうございます。 それは 「どこ」 に 「何」 が表示されないのでしょうか? >>「テキストフィールド」 に 「外部データ」 が表示されない、です。 「出力ウィンドウ」 に 「trace の内容(外部データ)」は表示されました。 言葉足らずで申し訳ありません(汗 _root.b.my_lv 内には外部データが読み込まれているのはわかりました! ボタンのところ、 my_lv.text1;とは思いつきませんでした…(汗 表示ということで a(mc)内のフレーム5 this.t1.htmlText = _root.b.my_lv.text1; this.m1.htmlText = _root.b.my_lv.text1_a; と書きましたところ無事に出ました! が、これでは表示させたのとはちょっと違いますよね(汗 表示させるだけなのに頭が回らない自分… お手数ですがヒントを頂けたらと思います…
- BlurFiltan
- ベストアンサー率91% (1611/1754)
ダミーボタン1 や ダミーボタン2 がクリックされたときに初めて, b(mc) の中に a(mc) が登場(表示)するのでしょうか? よくわかりませんが, もしそうであればそこが原因だと思います。 もしそのようになっていたとすると, ダミーボタン1 や ダミーボタン2 がクリックされた後に, a(mc) に書いた onClipEvent (load) { … } が実行されます。 つまり ダミーボタン1 や ダミーボタン2 がクリックされた後に, this.loadVariables("sample.txt"); が実行されます。 さらにそのずっと後に sample.txt のロードが完了します。 ですから ダミーボタン1 や ダミーボタン2 がクリックされた直後には _root.b.a.text1 や _root.b.a.text1_a や _root.b.a.text2 や _root.b.a.text2_a は存在しません。 存在しないのですから,つまり 「undefined」 です。 したがって, _root.b.a.t1.htmlText や _root.b.a.m1.htmlText には undefined が代入されることになります。 そうならないようにするためには, 外部テキストのロードを待ってから, _root.b.a.t1.htmlText や _root.b.a.m1.htmlText に _root.b.a.text1 や _root.b.a.text1_a や _root.b.a.text2 や _root.b.a.text2_a を代入する必要があります。 その,外部テキストデータロードを待つのが, 書かれていらっしゃる onClipEvent (data) { trace("完了"); } の部分です。 ですから trace("完了"); というのを書くのではなくて, その部分に, もし 何某かの変数の値が 1 であれば _root.b.a.t1.htmlText や _root.b.a.m1.htmlText に _root.b.a.text1 や _root.b.a.text1_a を代入 もし 何某かの変数の値が 2 であれば _root.b.a.t1.htmlText や _root.b.a.m1.htmlText に _root.b.a.text2 や _root.b.a.text2_a を代入 というような仕組みを作る必要があると思います。 if 文 でも switch文 でも配列にデータを入れて置いて切り替える方法でも何でも良いです。 とにかくそういうスクリプトを書いて置いて, 「何某かの変数」 に ダミーボタン1 や ダミーボタン2 クリック時に 1 や 2 のようなものを入れておけば良いです。 上に書いた対処法は全て単なる一例です。 LoadVars を使えばそもそもムービークリップに外部テキストをロードする必要がありませんし, ボタン自体にロードする処理も書けますから, if 文 や switch文 などは不要になります。 とにかく, 外部テキストのロードを待ってから, そのデータをテキストフィールドに表示させる必要があります。 その部分がちゃんとできていないので, テキストフィールドに外部テキストデータが表示されないのではないかと思います。 あと,テキストフィールドの設定で, 「テキストをHTMLとしてレンダリング」はされていますか? スクリプトにも説明にもその部分が見あたりませんよ。
補足
ダミーボタン1 や ダミーボタン2 がクリックされたときに初めて, b(mc) の中に a(mc) が登場(表示)するのでしょうか? >>そうです。 b(mc)内にダミーボタンがそれぞれフレーム1に配置されており、 フレーム2に飛んで初めて登場します。 (フレーム2はa(mc)だけになっており、あとは空白キーフレームにしています) ダミーボタン1 や ダミーボタン2 がクリックされた直後には _root.b.a.text1 や _root.b.a.text1_a や _root.b.a.text2 や _root.b.a.text2_a は存在しません。 存在しないのですから,つまり 「undefined」 です。 したがって, _root.b.a.t1.htmlText や _root.b.a.m1.htmlText には undefined が代入されることになります。 >>なるほど…だから表示も何もされなかったのですね…。 「テキストをHTMLとしてレンダリング」はされていますか? >>はい、してあります。説明が抜けていて申し訳ありません! 何分ちょっと量が多いので分岐は遠慮しようとおもいます… ボタンで操作できないかなーと思った次第なので。 なのでムービークリップの部分ではなく ボタンのあるb(mc)の時点で読み込みを完了させたいと思ておりますので BlurFiltanさんの教えていただいたLoadVars を使ってみようと思います。 以下ちょっと変えてみました。が、まだ表示されません… b(mc)内 フレーム1に this.stop(); System.useCodepage = true; my_lv = new LoadVars(); my_lv.onLoad = function(s) { if (s) { trace(this.text1); trace(this.text1_a); trace(this.text2); trace(this.text2_a); }else{ trace("カラだよ!"); } }; my_lv.load("sample.txt");// 外部テキストのロード フレーム2になって初めて登場するパネルa(mc)にあった ASを削除 onClipEvent(load){~ ボタンの部分は変更したほうがいいとわかりましたが どう書いて良いのか… ロードする処理というものをもう少し教えていただけますでしょうか…
お礼
あわわわ! 間違えて補足にお礼を書いてしまいました…(汗 改めてありがとうごさいました!
補足
アドバイスありがとうございます。 すみません。 そうですよね、フレーム5で直に入れてなら表示されたことになりますし… 勘違いしていました。(汗 a(mc)内のフレーム5にはまだ読み込まれていなかったようで。 「ロードする」→「ロードが完了する」→「表示させる」 を肝に命じ、 教えていただいたやりかたでトライしてみようと思います。 今のところ、ネットには上げる予定はございませんが この先あるかもしれませんし… 本当、勉強になります…! いろいろとありがとうございました!m(_ _)m