- ベストアンサー
ActionScriptでLoadVarsとは?vars.load(url)の動作は?vars.strの動作は?
- ActionScriptでLoadVarsは、外部の変数やデータを読み込むためのオブジェクトです。
- vars.load(url)は、指定したURLからテキストファイルを読み込む関数です。
- vars.strは、読み込んだ変数の中にある「str」という名前の値を取得する変数です。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
#7 のお礼に書かれていらっしゃる内容に関しましては, #6 で書いているつもりですが...。 > 関数の中で、vars.load(txt);でvarsにテキストをロードしているのなら、 > 何故、vars.st1;の値は、undefinedとなっていて、一回目では、 > 読み込まれていないのかということとか、 だから,ロードに時間がかかるからです。 > vars.load(txt);は単純にvarsに代入されるものではないのなら、 単純に vars に代入されるものです。 > どのタイミングで、代入されているのか等が、聞きたかったのです。 知りません。 それは 「Flashの外部テキスト読み込みについて」 引用URLでも書きましたとおり, 0.001 秒かもしれませんし20分かもしれません。 ローカルにあるかネット上にあるかファイル容量はどうか回線速度はどうなのか, 場合によるので当然わかりません。 わからないから, LoadVars.onLoad で読み込み完了次第「テキストに値を表示させる」という動作をさせているのです。 ユーザーがいつボタンをクリックするかわからないので, onRelease をつかうのと同じです。 ユーザーがいつボタンをクリックするのか知っていれば, onRelease なんて必要ないでしょう。 2回クリックしたら表示されるのは, 1回目のクリックで vars に外部テキストがロード開始されて, しばらく後に(0.001秒とかその辺)ロードが完了します。 2回目のクリックで, その vars に入った変数をテキストフィールドに表示されているだけでしょう。 同時にこの2回目のクリックで再び外部テキストのロードが開始されます。 このロードはまたしばらく後(0.001秒とかその辺)に完了します。 ロードと表示は別物ですよ。 ロード完了→表示 です。 そうでないと表示できないと何度も書いているでしょう。 人の話を全く聞いていないか,私が遊ばれているかのどちらかに思えます。 ですから根本的に ActionScript とか クラス とかそんなものは関係ないのですって。 「ロードに時間がかかる」 それを理解するだけのことです。
その他の回答 (7)
- BlurFiltan
- ベストアンサー率91% (1611/1754)
#2~#6 です。 ちなみに, 参考にならないかもしれませんが補足まで。 LoadVars.onLoad イベントハンドラメソッド(Flash MXで登場)も, さらに MivieClip.onData イベントハンドラメソッド(Flash MXで登場)も, さらに, ムービークリップの onCripEvent(data) イベントハンドラ(Flash 5で登場)も存在しなかった頃, loadVariables 関数(Flash 4で登場)のみで どうやって,外部テキストのロード完了を得ていたかわかりますか? 上のイベントハンドラやイベントハンドラメソッドを使わなくても, 「外部テキストのロード完了」 を得ることはできるのです。 loadVariables 関数 だけの頃は, 便利なイベントハンドラのようなものはなかったので, 見えない空のムービークリップを手動で作成して(FlashVarsの代用品), ムービークリップ内を3フレームにして, フレーム1 で, loadVariables でムービークリップ内に外部テキストをロードして, フレーム2 で, 変数が読み込まれたかどうかをif文で判定し, 何かを動作させるスクリプトを書いて, フレーム3 で, gotoAndPlay(2) でフレーム2に戻して, 延々と フレーム3 と 2 を変数がロードされるまで待つ。 このような仕組みをみなさん自力で作成していたのです。 外部テキストファイルをロードして何かを動作させるために, 見えないムービークリップをわざわざ作成して, その中に外部テキストをロードして, ひたすら gotoAndPlay() でループ待ちする。 論理的には,このような構造を自作する方が, 「いったい自分は何をしているのだろうか」ということがかわかりやすいと思いますが, 作成する方としては,たまったものではありません。 そのうち, onClipEvent(data) ができて, 「ひたすら gotoAndPlay() でループ待ちする。」 必要はなくなったのです。 しかしテキストをロードするのになぜかムービークリップが必要なことには変わりありません。 そのうち, LoadVarsクラス (Flash MX(AS1) ではクラスではなくオブジェクト) ができて, やっとまともに外部テキストロードのためにムービークリップなどと言う無関係なものは作成しなくて良くなったのです。 天国のようなものです。 というか, やっと当たり前のことが出来るようになったのが, LoadVarsクラス(AS1 ではオブジェクト)の登場だったのです。 #4で書きました2つのURLとも ムービークリップ の話が登場します。 「Flashの外部テキスト読み込みについて」 http://okwave.jp/qa3991545.html 「LoadVarsオブジェクトを使った外部テキストファイルの読込み」 http://www.fumiononaka.com/TechNotes/Flash/FN0303007.html 上の 「Flashの外部テキスト読み込みについて」 では, 私ではなく #1 の方もムービークリップを登場させていますね。 下の「LoadVarsオブジェクトを使った外部テキストファイルの読込み」でも, ガンガンにムービークリップを登場させています。 またこのご質問の回答群でも, 私がムービークリップを持ち出しています。 外部テキストロードに本来ムービークリップは関係しないのですが, なぜムービークリップが出てくるのかというと, LoadVars を理解する上で, 上のような経緯(ムービークリップを使わねば!)が潜在意識の中に存在するからです。 今始められたかたなら,もっとうまく説明できるかもしれません。 しかし,私の中では, LoadVars.onLoad = function(){ } は, ムービークリップ内のフレームグルグルループの発展系であり, さらに onClipEvent(data){ } ハンドラの発展系なのです。 (おそらく 「Flashの外部テキスト読み込みについて」 の #1 の方と同じくです。) そういうわけで, 変な説明になっているとは思います。 結局 ActionScript とロード待ちは関係ありません。 ロード待ちはどんな言語であっても必ず必要です。 VBA のようにソフト側でカバーしてくれている場合もあります。 (↑ロード完了するまで次を勝手に実行しない(しかしアニメーションソフトとしては成り立ちにくい)) しかし必ずどこかでロード待ちを入れていることは確かです。 そのロード待ちで LoadVars を使うとか ムービークリップを使うとかは, ロード待ちをどうするか という部分の対処法の違いです。 言語というよりも対処法で, ActionScript では LoadVarsクラス を利用すれば簡単にできるというだけのことです。
お礼
何となく何を言われようとしていたのかは分かりました。 ただ、自分がさっき知りたかったのは、 // ユーザ定義関数 yomikomi を定義 //「テキスト1」ボタンを押すと、txtにテキストファイルが代入 function yomikomi(txt) { // 「vars」 に txt をロード vars.load(txt); // 「vars」内 の st1 を 変数 l に代入 l = vars.st1; // l が未定義でなければ trace(vars.st1); if (l != undefined) { // ユーザ定義関数 SetMessage の実行 SetMessage("1読み込みが完了して変数にアクセスが可能"); // 変数 str に 変数 l の値を代入 str = l; } else { SetMessage("1読み込み失敗"); } } の関数の中で、vars.load(txt);でvarsにテキストをロードしているのなら、何故、vars.st1;の値は、undefinedとなっていて、一回目では、読み込まれていないのかということとか、vars.load(txt);は単純にvarsに代入されるものではないのなら、どのタイミングで、代入されているのか等が、聞きたかったのです。
- BlurFiltan
- ベストアンサー率91% (1611/1754)
#5です。 > 何故か、2回押すときちんと実行されるようです^^; 前回ロードしたデータがテキストフィールドに表示されるだけのことでしょう。 しかしそういうことをしても使いようがないと思いますが...。 何か意味があるのでしょうか。 何か意味があるのでしたらそれに活用すれば良いと思います。
- BlurFiltan
- ベストアンサー率91% (1611/1754)
#4です。 > functionをvarsに代入するのではなく、 > functionを定義してそれを実行することに > よって読み込ませることは出来ないのですか? できますよ。 すごく普通にできます。 しかしそれはそれです。 ================= 外部テキストはFlash外部にあります。 LoadVars インスタンスを作成 (LV = new LoadVars()) ↓ LoadVarsに外部テキストをロード (LV.load("外部テキスト")) ※当然function内で実行してもOK ↓ … ↓ ずっと後にロードが完了する ↓ 「ロード完了」通知を得る ↓ ロードしたデータを何かに活用 です。 ボタン や ムービークリップをクリックしたときに何かを動作させたい場合は, on(release){ }イベントハンドラや, それを発展させた, ○○.onRelease = function(){ } イベントハンドラメソッドを使いますよね。 これらを使うと 「クリックされた」 というイベントをトリガ(引き金)として何かを実行させることができます。 この, MovieClip.onRelease = function(){ } も, #2で書きました, MovieClip.onData = function(){ } も, サンプルにある LoadVars.onLoad = function(){ } も, どれも イベントハンドラメソッド です。 イベントハンドラメソッドは, 何かのイベントが発生したときにそのイベントをトリガとして何かの動作をさせるときに使う便利な物です。 ロードして→表示 には, … ↓ ずっと後にロードが完了する ↓ 「ロード完了」通知を得る (LV.onLoad = function(){} で受け取る) ↓ ロードしたデータを何かに活用 (LV.onLoad = function(){} の {} 内が実行される) (例:テキストフィールドにロードしたデータを表示) という時間的な流れが必要なのです。 ですから, LV.load("外部テキスト") を function 内で実行してもかまいませんし, LV.onLoad = function(){} を function 内で定義してもかまいません。 それは何でも良いので, ロードが完了するまでに LV.onLoad = function(){} を定義しておかないと, ロード完了が受け取れないのです。 同様のものに回答した最近の例では, 次のページが同じ説明に当たります。 OKWaveですが, 「Flashの外部テキスト読み込みについて」 http://okwave.jp/qa3991545.html もっとシンプルな例なのでわかりやすいかもしれません。 また,LoadVars で検索するとすぐに出てくる有名サイトですが。 「LoadVarsオブジェクトを使った外部テキストファイルの読込み」 http://www.fumiononaka.com/TechNotes/Flash/FN0303007.html > 3. データの読込みを待つ > LoadVarsクラスには、 > イベントハンドラをアクションとして設定することはできません。 > その代わりに、「イベントハンドラメソッド」というものが用意 > されています。LoadVarsクラスでロード後の処理に使用する > イベントハンドラメソッドが、LoadVars.onLoadです。 さらにコードを書く順まで理由付きで説明してくれています。 > LoadVars.onLoadメソッドの定義について、 > ひとつ大事な注意があります。 > LoadVars.loadメソッドによる外部テキストファイルのロードを > LoadVars.onLoadメソッドの定義より先に実行してしまうと、 > 定義が済む前にロードが完了してしまうおそれがあります。 > すると、定義が有効になったときには、 > もはやonLoadの呼出しが終わっているので、 > イベントハンドラメソッドは実行されないことになります。 > ですから、LoadVars.onLoadメソッドの定義をまず行ってから、 > LoadVars.loadを実行するのが確実です。 つまりコードを書く順は, LoadVars インスタンスを作成 (LV = new LoadVars()) ↓ ロード完了時の動作を定義 (LV.onLoad = function(){}) ↓ LoadVarsに外部テキストをロード (LV.load("外部テキスト")) この順が望ましい。 ということです。 上のような順でコードを書いておくと, LoadVars インスタンスを作成 ↓ LoadVarsに外部テキストをロード ↓ … ↓ ずっと後にロードが完了する ↓ 「ロード完了」通知を得る ↓ ロードしたデータを何かに活用 が確実に行えます。
お礼
なるほど、でもそれだと、自分の書き換えた以下のようなのでもいけそうな気がするのですが、何故駄目なのでしょうか? txtにはきちんと、テキストファイル名が飛んでいるようだし、vars.load(txt);が実行された後なので、vars.st1には、テキストの内容が書いてある気がするのですが、traceで確認してみるとundefinedとでてきます。ただ、何故か、2回押すときちんと実行されるようです^^; // ユーザ定義関数 yomikomi を定義 //「テキスト1」ボタンを押すと、txtにテキストファイルが代入 function yomikomi(txt) { // 「vars」 に txt をロード vars.load(txt); // 「vars」内 の st1 を 変数 l に代入 l = vars.st1; // l が未定義でなければ trace(vars.st1); if (l != undefined) { // ユーザ定義関数 SetMessage の実行 SetMessage("1読み込みが完了して変数にアクセスが可能"); // 変数 str に 変数 l の値を代入 str = l; } else { SetMessage("1読み込み失敗"); } }
- BlurFiltan
- ベストアンサー率91% (1611/1754)
> むちゃくちゃに書いてあると言われていますが、 > どのあたりが、変なのでしょうか? 全部です。 理解するために変形させたのではなくて, 好き勝手にこわしただけに見えますよ。 壊したら壊れるだけで当たり前です。 それ以上説明のしようもないということです。 とにかく, LoadVars.onLoad(またはLoadVars.onData) は省略できないでしょう。 何度も書きますようにロードしてから何かを実行させないと, ロードした通りには実行されたり動作したりできないのですから。
お礼
functionをvarsに代入するのではなく、functionを定義してそれを実行することによって読み込ませることは出来ないのですか?
- BlurFiltan
- ベストアンサー率91% (1611/1754)
#1 です。 > 以下のよう書き換えてみたのですが、 > 二回押せば読み込めるのですが、一回では読み込めません。 > これは何故なのでしょうか? わかりません。 というか,私も書いてしてみましたが, 二回押すどころか百回押しても何も表示されませんよ。 動作しない理由は, 「無茶苦茶に書いても動作しない」 と言う当たり前の理由だと思います。 一応書かれていらしゃるスクリプトに注釈行を入れておきますね↓。 -------------------------------------------- // 変数 msg の初期化(文字列を空にする) msg = ""; // 外部テキストを Shift-JIS としてロード System.useCodepage = true; // LoadVarsクラス のインスタンス 「vars」 を作成 var vars = new LoadVars(); // ユーザ定義関数 yomikomi を定義 function yomikomi(txt) { // 「vars」 に txt をロード vars.load(txt); // 「vars」内 の st1 を 変数 l に代入 l = vars.st1; // l が未定義でなければ trace(vars.st1); if (l != undefined) { // ユーザ定義関数 SetMessage の実行 SetMessage("1読み込みが完了して変数にアクセスが可能"); // 変数 str に 変数 l の値を代入 str = l; } else { SetMessage("1読み込み失敗"); } } // テキストファイルを読み込むユーザ定義関数 // LoadTextFunc の定義 function LoadTextFunc(url) { // 「vars」にテキストファイルを読み込む vars.load(url); // ユーザ定義関数 SetMessage の実行 _root.SetMessage("読み込み要求:"+url); } // メッセージを表示する関数 function SetMessage(str) { msg = str+"\n"+msg; } ------------------------------------ (↑インデントを全角空白文字で入れてあるので このままコピペするとシンタックスエラーになります。) なぜ動作しないと言われましても,これでは動作のしようがありません。 まず, ユーザ定義関数 yomikomi は定義 されているだけで実行命令を受けていませんから この yomikomi が実行されることはありませんし, その yomikomi が仮に実行されても, そこで // 「vars」 に txt をロード vars.load(txt); が実行されるだけ,つまり外部テキストが読み込まれるだけですから, 「ロード完了時」には何もおこりません。 細かいことをたくさん書いてもしかたがありませんが, 無茶苦茶にかいてあるので正常に動作するはずがないという感じです。 ============== > 何故こちらのソースでは、loadではなく、 > loadVariablesを使用しているのでしょうか? 理由は簡単です。 MovieClipクラスには load というメソッドがないからです。 ないものはないので動作しようがありません。 百貨店に行って散髪と頼むようなものです。 MovieClip に外部のものをロードするとき, ロードするものが ムービーや JPEG などであれば loadMovie メソッドを使います。 ロードするものが外部テキストデータである場合は loadVariables メソッドを使います。 load というメソッドは比較的新しいメソッドで,LoadVars と同時くらいにできたメソッドです。 MovieClip は LoadVars よりずっと昔からありますし, できた当初から loadMovie や loadVariables (両方ともできた当初はメソッドではなく関数)がありましたから だいたいこれでこと足ります。 あえて load というメソッドを入れる必要がなかったので MovieClipクラスのメソッドに load は入れなかったのでしょう。 Flashドキュメンテーション MovieClip http://livedocs.adobe.com/flash/8_jp/main/00002436.html LoadVars http://livedocs.adobe.com/flash/8_jp/main/00002323.html
お礼
すみません。書き忘れてましたが、テキスト1のボタンには、 on ( press ) { yomikomi("import_dat_00.txt"); } と書き込まれています。 んで、テキスト1のボタンを押すと、一回目は、上のテキストボックスには、何も表示されず、下のボックスには、 1読み込み失敗 と表示されます。 また、他の2,3の、ボタンは弄ってないのですが、テキスト2を押した後、テキスト1を押すと、テキスト2の内容が表示されます。 import_dat_01.txtとimport_dat_02.txtのstrはst1に書き換えてあります。 後、むちゃくちゃに書いてあると言われていますが、どのあたりが、変なのでしょうか?
- BlurFiltan
- ベストアンサー率91% (1611/1754)
そういう根本的な説明はけっこう難しいですね。 例えば, LoadVars インスタンス も MovieClip インスタンス も同じインスタンスです。 LoadVars の前に MovieClip(ムービークリップ) はわかりますでしょうか? 言葉だけで説明しても MovieClip とは何のことかわかるはずはありませんが, ActionScript を使っても使わなくても MovieClip は見えるので, Flash を実際に使ってみると MovieClip というものがどういうものだいたいがかわかります。 あえて MovieClip を言葉で説明すると, Flash の本体ムービーが, タイムライン と 複数のオブジェクト(ボタン,ムービークリップ,テキストフィールドなどなど)を持つことができるのと同じように, MovieClip 自体も独自のタイムラインと複数のオブジェクトを持つことができます。 いわば Flash の中の Flash のようなものが MovieClip です。 また, Flash はその本体(_root のタイムライン)自体がすでに MovieClip の一種ですし, またさらにその中にもその中にもその中にも MovieClip を持つことができます。 MovieClip 抜きでは Flash の価値は全くないものとしても良いと思います。 --------- それくらい MovieClip はすごい何でも屋さんで, 商店でいうならば百貨店(デパート)とか超巨大スーパーマーケットのようなです。 しかし, すべての人がすべての物を百貨店や超巨大スーパーマーケットで買うということはありません。 近所の眼鏡屋さんやカメラ屋さんのような専門店で眼鏡や時計を買うことも多々ありますし, 逆にマニアックなカメラや超職人な仕事はそういう店に頼まないとできないこともあります。 また, 百貨店やスーパーでは, 「今日は娘の誕生日やからちょっとオマケしておいて!」 などという融通の利いたことも頼みにくいものです。 その融通の利いた職人芸を見せるのが LoadVars インスタンスです。 LoadVars は, 外部テキストを読み込むことに関してだけマニアックではありますが, その筋の職人的技を持っていたり,また融通を色々利かせてくれます。 ご質問で書かれていらっしゃる import_01_fla08_as1.lzh のスクリプトも, 実は MovieClip に頼めばだいたいはできる仕事です。 (=実はMovieClipクラスのスクリプトでだいたいできる実行文です。) 例えば import_01_fla08_as1.lzh を解凍後, 出てくる import_01_fla08_as1.fla のフレーム1を次のように書き替えても, 一応は動作します。 -------------------------------------------- msg = ""; System.useCodepage = true; // _root に空のMovieClip 「lvMC」 を作成 _root.createEmptyMovieClip("lvMC",0); // 「lvMC」 に外部テキストロード完了時の動作を定義 lvMC.onData = function(){ if(this.str != undefined){ SetMessage("読み込みが完了して変数にアクセスが可能"); str = this.str; }else{ SetMessage("読み込み失敗"); } } // テキストファイルを読み込む関数 function LoadTextFunc(url){ // テキストファイルを 「lvMC」 に読み込む lvMC.loadVariables(url); _root.SetMessage("読み込み要求:" + url); } // メッセージを表示する関数 function SetMessage(str){ msg = str + "\n" + msg; } -------------------------------------------- しかしこれではロード完了は取得できても, ロードが成功したのかしていないのかは, 上のように実際に用意した変数(上の場合str)が あるのかないのかを if文 で問うような工夫をしなければなりませんし, onHTTPStatus を取得するような専門職的なこともできません。 LoadVars は MovieClip と同じようなインスタンスです。 また MovieClipインスタンス が 「様々なもの」 の入れ物であるように, LoadVarsインスタンスも 「ロードした変数と値」 の入れ物です。 同じインスタンスであり,同じ入れ物ですが,適材適所。 「様々なもの」 を入れる場合は MovieClip の方が良いですし, 「ロードした変数と値」 を入れる場合は LoadVars の方が良いことも多々あるということです。 クラスについてこの方面から書くとすると, MovieClip クラス のスクリプトは, MovieClip さんに何かを頼んだり,MovieClip さんの状態を制御するスクリプトです。 LoadVars クラス のスクリプトは, LoadVars さんに何かを頼んだり,LoadVars さんの状態を制御するスクリプトです。 こんな説明でだいたいわかりますでしょうか。
お礼
解答有り難うございます。 自分でも、色々弄ってみた結果、テキストのstrをst1に書き換えてみたところ、vars.load(text.txt)でテキストをvarsに読み込めて、テキストの中のst1のデータは、vars.st1に入っているということまで分かったので、以下のよう書き換えてみたのですが、二回押せば読み込めるのですが、一回では読み込めません。これは何故なのでしょうか? あと、何故こちらのソースでは、loadではなく、loadVariablesを使用しているのでしょうか? msg = ""; System.useCodepage = true; var vars = new LoadVars (); function yomikomi(txt){ vars.load(txt); l=vars.st1; if(l!=undefined){ SetMessage("1読み込みが完了して変数にアクセスが可能"); str=l; } else { SetMessage("1読み込み失敗"); } } // テキストファイルを読み込む関数 function LoadTextFunc(url){ // テキストファイルを読み込む vars.load(url); _root.SetMessage("読み込み要求:" + url); } // メッセージを表示する関数 function SetMessage(str){ msg = str + "\n" + msg; }
- SAYKA
- ベストアンサー率34% (944/2776)
http://www.google.co.jp/search?hl=ja&lr=lang_ja&q=actionscript%20LoadVars どれか自分で判りそうだと思うのを読んでみて。
お礼
解答有り難うございます。 googleでの検索はすでにやったんですが、結局書いてあることが分からなかったんです。 http://livedocs.adobe.com/flashlite/2_jp/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts_wEcute&file=00000566.html 検索しても上記のようなサイトが出てくるぐらいで、 var my_lv: LoadVars = new LoadVars(); my_lv.onLoad = function(success: Boolean) { if (success) { trace(this.toString()); } else { trace("Error loading/parsing LoadVars."); } }; my_lv.load("http: //www.helpexamples.com/flash/passvars.php"); 上のようなソースが載ってたりしますが、クラスとか言うものがよく分かってないため、my_lv.loadがmy_lv.onLoad = function(success: Boolean)にどのように影響しているのかもよく分からないのです。
お礼
>人の話を全く聞いていないか,私が遊ばれているかのどちらかに思えます。 いや、只単に、BlurFiltanさんが私が知っていると想定している知識を私が持ってなかったから、意味がよく分からなかっただけで、別に聞いてないわけでも、遊んでるわけでもないですよ^^; 例で出されてるonRelease関数もどういうふうに使うのかは知ってますが、どんなことに何のために使うのかは全く分からないので・・・ プログラムって、順次上から下へ、書いた処理が終わるのを待ってから進行しているわけではなかったんですね。それで、onLoadしたときに実行っていう風に指定していたと・・・ 長々と有り難うございました。