• ベストアンサー

LoadVars

テキスト・ファイルを読み込みについての解説で、 基本的な流れは, 1. LoadVarsクラスのインスタンスを生成 2. 読み込んだあとの処理を作成(onLoadイベントハンドラの設定) 3. 読み込み - スクリプト - var textReaderLV:LoadVars = new LoadVars(); textReaderLV.onLoad = function() { trace("「hoge」の値は," + textReaderLV.hoge); }; textReaderLV.load("data.txt"); という説明が書かれているのですが、2と3が逆のような気がしてしまうのですが、3番目に読み込みとなっている事には何か意味があるのでしょうか? 一応、2と3を入れ替えてプレビューしたところ特に問題なかったのですが、上記は学習のためにシンプルに書かれたスクリプトなので、もしかしたら本来的な意味合いで、3番目に読み込みが来る事に何か意味があるのかな??と思い質問させていただきました。 LoadVarsによるテキストファイルの読み込みをするとき、上記のような流れで読み込み後の処理を先に実行し、後から読み込みとするのはなぜなのでしょうか? ご教授やアドバイスなどいただけたらと思います。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.4

#1,2 です。 申し訳ありませんが,同じ事を別の角度から何度も説明しているため,この回答はくどく,長くなってしましました。 あらかじめご了承下さい。 > すべてコードは上から順に処理が進み、 > その処理が終わると次の行へ進むという理解なのですが、 > どうもここの辺りで私の勘違いがあるようなのですが、 そこには勘違いはないと思います。 基本的に上から順に処理が進みます。 だからこそ, LoadVars.onLoad = function() { } の定義は,実際の読み込みが行われる前に定義しておかなければならないのです。 先に定義しておかなければ,実行ができません。 ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ なんとなくですが, 「関数の定義」と「関数の実行」を同じもの(同時に起こるもの)として考えていらっしゃるのではないかと思います。 「関数の定義」は「関数の定義」であって,実行命令が下らないと実行はされません。 LoadVars.onLoad = function() {○○}; は「関数の定義」です。 「ロード処理完了時には○○という動作をする」という定義をしているだけで, LoadVars.load(); のロード処理が実行されない限り何にもしないのです。 仮に,普通通り,  LoadVarsインスタンスの作成  LoadVars.onLoad = function() {○○};  外部テキストのロード という順にスクリプトを書いたとします。 これがどう実行されるかを「超スローモーション」で書くと次のようになります。  LoadVarsインスタンスが作成される    ↓  LoadVars.onLoad が定義される    ↓  外部テキストのロードが開始される    ↓  外部テキストのロードが完了する    ↓とれと同時に  定義しておいた LoadVars.onLoad が実行される 次に,質問者様の書かれていらっしゃるように,  LoadVarsインスタンスの作成  外部テキストのロード  LoadVars.onLoad = function() {○○}; という順にスクリプトを書いたとします。 これがどう実行されるかを超スローモーションで書くと次のようになります。  LoadVarsインスタンスが作成される    ↓  外部テキストのロードが開始される    ↓  LoadVars.onLoad が定義される    ↓  外部テキストのロードが完了する    ↓とれと同時に  定義しておいた LoadVars.onLoad が実行される ですから, 「LoadVars.onLoad の定義」 と 「外部テキストのロード」 のどちらを先に書いても, 結果は 「定義しておいた LoadVars.onLoad が実行される」 で同じになります。 しかし,見るからに実行の流れが変で,危ういとは思いませんか? ロード開始 と ロード完了 の間に LoadVars.onLoad が定義される のです。 私はかなり危ういと思います。 「果たして犯人はそんな危ない橋を渡るだろうか?」 「私ならそんな危ない橋は渡らない。完全犯罪になりえない。」 と思います。 (あの,誰も犯人ではなくミステリーでもありません。一種のボケですので深く考えないでください。) つまり,先に 「外部テキストのロード」 書いてしまった場合は,  LoadVarsインスタンスが作成される    ↓  外部テキストのロードが開始される    ↓0 秒で  外部テキストのロードが完了する    ↓  LoadVars.onLoad が定義される  (定義しても意味ナシ) となる可能性もないとは言いきれませんよね。 ということです。 ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ 次のようにスクリプトをバラせば理解できるのではないかと思います。 お手数ですが新規ドキュメントを作成して, ステージ上に塗りの入った矩形(長方形)を,適当に左右に2つ並べて用意してみてください。   ■■■■    □□□□   ■■■■    □□□□   左の矩形    右の矩形 その2つの矩形を別々の「ボタンシンボル」に変換します。 (ムービークリップでもグラフィックでもなくボタンシンボルに変換します。)   ■■■■    □□□□   ■■■■    □□□□   左のボタン    右のボタン そして,まず フレーム に次のように書いておきます。 ----------------------------------- var textReaderLV:LoadVars = new LoadVars(); // LoadVarsクラスのインスタンスを作成。 ----------------------------------- これで,textReaderLV というインスタンス名の LoadVarsインスタンスが作成されることになります。 そして, 左のボタン 自体には次のように書きます。 ----------------------------------- on (release) { textReaderLV.onLoad = function() { // ロード処理が完了したときの動作定義 trace("「hoge」の値は,"+textReaderLV.hoge); }; } ----------------------------------- この 左のボタン をクリックしたときに, ロード処理が完了したときの動作が定義されます。 そして, 右のボタン 自体には次のように書きます。 ----------------------------------- on (release) { textReaderLV.load("data.txt"); //外部テキスト"data.txt" を読み込み。 } ----------------------------------- この 右のボタン をクリックしたときにはじめて, 外部テキストである 「data.txt」 の読み込みが開始されます。 この状態で, 「制御」→「ムービープレビュー」をします。 「右のボタン」クリック→「左のボタン」クリック という順にクリックしても,  「hoge」の値は,○○○ は出力されないと思います。 「右のボタン」クリックで外部テキストがロード開始され, 「左のボタン」クリックでロード処理完了時の動作定義が行われるころには, すでにロード処理は完了しているからです。 この状態で,次に再び 「右のボタン」 をクリックすると,  「hoge」の値は,○○○ が出力されるはずです。 「左のボタン」クリックでロード処理が完了したときの動作が定義されているので, 「右のボタン」クリックでロードが開始され,ロード処理が完了したときに, trace("「hoge」の値は,"+textReaderLV.hoge); が実行されるからです。 『「hoge」の値は,○○○』 の ○○○ には実際に何が表示されるのかは知りません。 「data.txt」 が用意してあって,その内容に hoge=▲▲▲ というデータが用意されていれば, 『「hoge」の値は,▲▲▲』 となるでしょうし,用意されていなければ,『「hoge」の値は,undefined』 となるでしょう。 その「ムービープレビュー」画面をいったん閉じて, 再び 「制御」→「ムービープレビュー」をします。 今度は, 「左のボタン」クリック→「右のボタン」クリック という順にクリックすると, 「右のボタン」をクリックしたとき,普通に 『「hoge」の値は,○○○』 が出力されるはずです。 「左のボタン」クリック→「右のボタン」クリック という順にボタンがクリックされなければなりません。 「右のボタン」クリック→「左のボタン」クリック という順にボタンがクリックされるとまずいということになります。 プログラム的に言いなおせば, 「外部テキストロード処理完了」→「ロード処理完了時の動作を定義」となったらまずいわけです。 つまり,0 秒でロードが完了してしまったなら, textReaderLV.onLoad = function() {○○}; の ○○ は実行されないかもしれませんよ。 ということになります。 ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ > (データロードが完了しなければ、処理が実行されないのでは? > とも思うのですが、実際そうではないので > この辺りに私の誤解があるのかもと思ったり) 「data.txt」があってもなくても, textReaderLV.load("data.txt"); が実行されれば, textReaderLV.onLoad = function() {○○}; の ○○ は実行されます。 LoadVars.onLoad はロード処理が完了したときに呼びだされます。 「data.txt」があってもなくても,つまり,ロードが成功しても失敗ししても,そんなことは関係なく, 「ロード処理が完了」時点で呼びだされます。 おそらく, 「data.txt」がなかった場合,サーバもしくはローカルPCから, 「そんなファイルはないよ!」 という内容のエラーメッセージがFlash側に返されるのだと思います。 つまり,「そんなファイルはないよ!」 という内容のエラーメッセージを textReaderLV がロードするのだと思います。 存在する「data.txt」のデータであっても,「そんなファイルはないよ!」 という内容のエラーメッセージであっても, とにかく textReaderLV のロード処理は完了するので, そのときに textReaderLV.onLoad = function() {○○}; の ○○ は実行されます。 「ロードが成功したとき」 と 「ロードが失敗したとき」 とで別々の動作をさせたい場合は, #2 で書いた URL のページにも書いていますように, textReaderLV.onLoad = function(適当な変数:Boolean) { if (適当な変数) { // ここにロード成功時の動作を書く } else { // ここにロード失敗時の動作を書く } }; のようにして分岐させてください。 しかしこの,ロード成功 or ロード失敗 は,ご質問の本題とは関係がないことです。 すべてを一緒くたに考えると混乱の元となりますので,全く別物として考える方が良いと思います。

thank001
質問者

お礼

BlurFiltanさん、再度のご回答ありがとうございます。 長文で詳細なご回答をいただき、バッチリ理解できました(^0^。 ここまで詳細にご回答いただくとなんだか申し訳ないと思えてくるぐらいです。 大変大変参考になりました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • kuri627
  • ベストアンサー率85% (6/7)
回答No.3

以下 ヘルプからの参照 LoadVars.onLoad シンタックス my_lv.onLoad = function(success:Boolean) { // ここにステートメントを記述【A】 } パラメータ success ロード処理が正常に完了したか (true) または失敗したか (false) を示すブール値。 //---------------------------------- 【A】には success=true の時の、Load完了時の処理と success=false の時の、Load失敗時の処理を 記述する訳ですね。 つまり、onLoadは 「Load」処理が完了したかどうかを見てるので、「Load」が終わった後に設定しても無意味ですよね? と、いうことではどうでしょうか?

thank001
質問者

お礼

kuri627さん、書き込みありがとうございます。 参考にさせていただいております。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

#1です。 もののたとえ方が間違っていました。訂正いたします。 > その定義自体が空振りになる可能性も考えられます。 →その定義自体が見送りになる可能性も考えられます。 バッターボックスにバッターが立つ前に,ピッチャーからボールを投げられてしまった場合, 用意ができていないバッターはボールを見送ってしまう。 ということをイメージして書いたつもりが, 「空振り」という的を射ていない比喩になってしまっていました。 言いたいことは同じなのですが, 私の妙な説明より,次のページの方がわかりやすいと思います。 「LoadVarsオブジェクトを使った外部テキストファイルの読込み」 http://www.fumiononaka.com/TechNotes/Flash/FN0303007.html このページの下の方より引用 > LoadVars.onLoadメソッドの定義について、 > ひとつ大事な注意があります。 > LoadVars.loadメソッドによる外部テキストファイルのロードを > LoadVars.onLoadメソッドの定義より先に実行してしまうと、 > 定義が済む前にロードが完了してしまうおそれがあります。 > すると、定義が有効になったときには、 > もはやonLoadの呼出しが終わっているので、 > イベントハンドラメソッドは実行されないことになります。 > ですから、LoadVars.onLoadメソッドの定義をまず行ってから、 > LoadVars.loadを実行するのが確実です。

thank001
質問者

お礼

BlurFiltanさん、書き込みありがとうございます。 詳細にご説明いただきながら、まだ上手く理解ができない状態です(というより私は他の部分で勘違いして理解しているようなのですが、、、)。 まず私の理解(勘違い?)として、すべてコードは上から順に処理が進み、その処理が終わると次の行へ進むという理解なのですが、どうもここの辺りで私の勘違いがあるようなのですが、 例えば、 var textReaderLV:LoadVars = new LoadVars(); // LoadVarsクラスのインスタンスを作成。 textReaderLV.load("data.txt"); //外部テキスト"data.txt" を読み込み。 textReaderLV.onLoad = function() { trace("「hoge」の値は," + textReaderLV.hoge); }; // データのロードが完了したら、function() を実行。(データロードが完了しなければ、処理が実行されないのでは?とも思うのですが、実際そうではないのでこの辺りに私の誤解があるのかもと思ったり) と理解しています。(というより上記は2と3を逆に書いていますので、本来の例題が私のような理解の仕方だと成立しないのですが、、、) 上記のような理解ですと、どこかに何らかの誤解をしているものと思うのですが、よろしければその点をご指摘いただけないでしょうか。 お時間などありましたらまた書き込みをいただけたらと思います。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

テキストの読み込みには多少時間がかかるので,どちらでも良いと思います。 しかし,テキストが本当に 0 秒で読み込まれてしまった場合はどうなるでしょう? LoadVarsインスタンスの作成   ↓ 外部テキストの読み込み(0秒)   ↓ 外部テキスト読み込み時の動作を定義 外部テキストが読み込まれてしまったあとに, テキスト読み込み時の動作定義を Flash が認識した場合, その定義自体が空振りになる可能性も考えられます。 普通の場合はそうならないのですが, 確率,可能性,論理順 から考えると, LoadVarsインスタンスの作成   ↓ 外部テキスト読み込み時の動作を定義   ↓ 外部テキストの読み込み とする方が無難です。 これに限らず, 変数などの定義や作成   ↓ 関数の定義   ↓ 関数の実行 と書いているものが多いと思いますよ。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 【LoadVars】変数を数値で取り出したい。

    まずは【count.txt】に事前に書き込んだ 半角の数値で書いた"0"を同じディレクトリに保存。 1フレームに下記のソースを記述。 hensu = new LoadVars(); hensu.load("./count.txt"); hensu.onLoad = function() { trace(hensu); }; プレビューすると、 traceの出力が【onLoad=%5Btype%20Function%5D】となります。 どうすれば数値で取り出せるのでしょうか??

    • ベストアンサー
    • Flash
  • flashアクションスクリプト LoadVarsについて

    はじめまして。初めて質問させていただきます。 onloadメソッドの中でロードしたデータを変数に代入したいのですが、うまくいきません。記述は以下のとおりです。 var hen; a_lv=new LoadVars(); a_lv.onLoad=function(a){ hen=this.txt } a_lv.load("b.txt"); trace(hen); 出力パネルに”undefined”と表示されてしまいます。 どうしたらうまくいきますか? 分る方いましたら、是非教えてください。

  • LoadVarsによるデータの読み込み

    現在、簡易ペイントチャットのようなものを作っています。 ログファイル名がSimpleWebNote1、 ログの中身はxb_old=100,200,300,400 といった感じです。 ログを取得し、","で区切ってSimpleWebNote1という配列に格納したいので ↓のような処理をしています。 (ログは4つありますがすべて同じような処理) load_obj = new LoadVars(); load_obj.load( "SimpleWebNote1.txt" ); load_obj.onLoad = function(){ str = load_obj(bx_old); SimpleWebNote1 = str.split(","); } そして100回前までのログを再描画するために ↓のような処理をしています。 for (var i=0; i<=100; i++){ _root.lineStyle (3, 0x000000, 100); _root.moveTo (SimpleWebNote1[i], SimpleWebNote2[i]); _root.lineTo (SimpleWebNote3[i], SimpleWebNote4[i]); } ですが、画面には何も表示されず困っています。 どこか間違っているとしたら指摘してほしいです。 この部分ができたら完成なので本当にもどかしいです。

  • イベントハンドラに処理を追加するには?

    例えばbodyタグのonloadイベントハンドラに JavaScriptを使って処理を追加するにはどうすればよいのでしょうか? 例) ・rei.htm <html>  <script language="JavaScript" type="text/javascript">  function hoge(){   alert("hogeです");  }  function foo(){   alert("fooです");  }  </script>  <body onload="hoge();">  </body>  <script language="JavaScript" type="text/javascript">  document.body.onload += foo();  </script> <html> ※前提条件として、変更可能な箇所はscriptタグ内のみとなります。 「こんなんでいけないかな?」と思って上記のようにやってみたのですがうまくいきませんでした。 (結果はfoo()のみ実行され、hoge()は実行されませんでした。 alertでbody.onloadの中身を確認すると『function anonymous{hoge();}undefined』と表示されるので、なぜfoo()が実行されてhoge()が実行されないのかよくわかりませんが‥) また試しに document.body.onload += foo(); これを以下のように変更してみました。 document.body.onload = foo(); この時は、 ・foo()の実行  ↓ ・javascriptエラー  ↓ ・hoge()の実行 となりました。(これもなぜこうなるのかよくわかりせん) 以上、イベントハンドラに最初から任意に入れられている処理を残しつつ、 さらに処理を加えるにはどうすればよいのかご教示お願いします。

  • 単一のFlashに単一のテキストファイルで複数の内容

    単一のFlashに単一のテキストファイルで複数の内容を1画面で表示させたいのですが、うまくいきません。 状況としては、【kotei1】には表示されますが、【kotei2】【kotei3】【kotei4】にはundefindと表示されてしまいます。 OS:Windows7 Flash:CS4 AS2.0 以下がASになります。 タイムライン1(全てレイヤー別に作成) ■kotei4(Layer4) ■kotei3(Layer3) ■kotei2(Layer2) ■kotei1(Layer1) 各タイムラインAS ■kotei4 System.useCodepage = true; var my_lv:LoadVars = new LoadVars(); my_lv.onLoad = function(success:Boolean) { if (success) { kotei4.text = my_lv.name4; } else { trace("Error loading/parsing LoadVars."); } }; my_lv.load("name.txt"); ■kotei3 System.useCodepage = true; var my_lv:LoadVars = new LoadVars(); my_lv.onLoad = function(success:Boolean) { if (success) { kotei3.text = my_lv.name3; } else { trace("Error loading/parsing LoadVars."); } }; my_lv.load("name.txt"); ■kotei2 System.useCodepage = true; var my_lv:LoadVars = new LoadVars(); my_lv.onLoad = function(success:Boolean) { if (success) { kotei2.text = my_lv.name2; } else { trace("Error loading/parsing LoadVars."); } }; my_lv.load("name.txt"); ■kotei1 System.useCodepage = true; var my_lv:LoadVars = new LoadVars(); my_lv.onLoad = function(success:Boolean) { if (success) { kotei1.text = my_lv.name1; } else { trace("Error loading/parsing LoadVars."); } }; my_lv.load("name.txt"); ***name.txt*** &name1=固定1 固定1を表示しています。& &name2=固定2 固定2を表示しています。& &name3=固定3 固定3を表示しています。& &name4=固定4 固定4を表示しています。& ***テキストデータsample***

  • ActionScriptで分からないことがあります。

    http://hakuhin.hp.infoseek.co.jp/main/as/import.html#IMPORT_01 の、import_01_fla08_as1.lzhについて幾つか質問です。 1.以下の部分で、LoadVarsってどういうことをするものなのでしょうか? var vars = new LoadVars (); 2.vars.load(url);ってどういう動作をしているのでしょうか? // テキストファイルを読み込む関数 function LoadTextFunc(url){ // テキストファイルを読み込む vars.load(url); _root.SetMessage("読み込み要求:" + url); } 3.以下のstr = vars.str;はどういう動作をしているのでしょうか? vars.onLoad = function(check){ if(check){ SetMessage("読み込みが完了して変数にアクセスが可能"); str = vars.str; }else{ SetMessage("読み込み失敗"); } }

    • ベストアンサー
    • Flash
  • ループ処理について

    下記のようなScriptを記述しました。 for(i = 1; i <= 4 ; i++) { trace("A") ; var fileload:LoadVars = new LoadVars(); fileload.load("b"+i+".jpg"); fileload.onLoad = function(success:Boolean) { trace("B") ; if (!success) { ok_flg = 1; } else { a.duplicateMovieClip("b"+i, i); this["b"+i].loadMovie("b"+i+".jpg") ; this["b"+i]._x += (i - 1) * 90 ; } }; } 本来ならJPEGが存在する分だけ読込むと言う処理をしたいのですが、テスト的に3ファイル用意してテストしました。 JPEGの命名規則は「b1~b3」としています。 普通のループ文であれば問題無く3件のJPEGが表示されますが、読み込みが成功したか否かの判断文を入れると動作がおかしくなります。 TRACEを入れてみたら、 A A A A B Error opening URL "file:///C|/Documents%20and%20Settings/xxxxx/デスクトップ/b4.jpg" B B B このように最初に読み込みの処理を実行し、その後に成功したか否かの判定が処理されます。 これって、正常なループの処理でしょうか?。 また、私が処理したかったようにするにはどのようなScriptにすれば良いのでしょうか?。 宜しくご教授ください。

    • ベストアンサー
    • Flash
  • LoadVarsで外部テキストファイルを読み込み数値化するには?

    初級の質問で申し訳ありません。 外部に、data.txtというファイルを用意し、中には a=1&b=2&c=3&d=4&e=5&f=6 というテキストデータのみを入れました。 (改行は入っていません。) Flashのタイムラインのフレーム1に、下記コードを記入したのですが、どうしても数値として認識してくれないようで、トレースで表示されるt5は、常に0が表示されてしまっています。 -------------------------------------- System.useCodepage = true; var Mynum = new LoadVars(); Mynum.load("data.txt"); Mynum.onload = function(success) { if (success) { t1= Mynum.a; t2= Mynum.b; t3= Mynum.c; t4= Mynum.d; t5= Mynum.e; t6= Mynum.f; } }; trace(Number(t5)) stop(); -------------------------------------- これから先、t1やt5などに数値演算をして、色々計算をさせたいのですが、どうも数値として認識されていないようです。 (パブリッシュのFlashPlayerのバージョンを5にしたり6にしたり7にしたりしてみると、表示されるトレースのt5は、0だったり、NaNだったりになってしまいます。) 外部データは全てテキストとして読まれるので、 NumberやparseIntで数値化する、とネットで調べて記載したのですが、 他に何か悪い点がありますでしょうか? ご教授頂ければ幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 引数の渡し方

    いつもお世話になっています。 外部テキスト(data.txt)を読み込んで、内容を配列(txtN)に格納、 表示するスクリプトを組んでいます。 myNameは複数あり、ボタンから渡される引数に応じて myNameを切り替えてtrace(実際には表示)させたいんですが、方法が分かりません。 以下フレームアクション //Shift-JISで読み込む System.useCodepage = true; load_obj = new LoadVars(); load_obj.load( "data.txt" ); load_obj.onLoad = function( success ){ //正常終了時、カンマで分割して配列に格納 if( success ){ my_ary = new Array(); my_ary = load_obj.myName.split(","); } txt01=my_ary[0]; txt02=my_ary[1]; txt03=my_ary[2]; txt04=my_ary[3]; trace(txt01); trace(txt02); trace(txt03); trace(txt04); }; stop(); よろしくお願いします。

    • ベストアンサー
    • Flash
  • 外部テキストをsplitで分割する時

    宜しくお願いいたします。 外部テキストをsplitで分割しようと思うのですが・・。 スクリプトはこんな感じになっています。 System.useCodepage = true; // Shift-JISのテキストを読み込む設定に変更 myText01 = new LoadVars(); // 新規LoadVarsオブジェクトmyTextの作成 txt_file01 = "text/text001.txt"; // 外部テキストファイル名を変数txt_fileに代入 myText01.load(txt_file01); // 外部テキストファイルの読み込み _root.bp=t001 //変数 myText01.onLoad = function(ok) { if (ok) { // 外部テキストファイルを読み込んだときの処理 work_txt = myText01._root.bp.split("~"); と書いて、text/text001.txtというテキストのt001という行を"~"で分割したいのですが、うまくいきません・・・。 変数でオブジェクトを指定しているのが悪いと思うのですが、何か良い方法はありますか? 何分初心者なもので・・・。 説明がわかりづらいかもしれませんが、困ってしまっているので宜しくお願いいたします。

    • ベストアンサー
    • Flash