サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

LoadVarsオブジェクトを使った外部テキストファイルの読込み

ID: FN0303007 Product: Flash

Platform: All
Version: MX and Above

外部テキストファイル読込みのメソッドを提供するクラスとして、Flash MXからLoadVarsクラスが追加されました。MovieClip.loadVariablesメソッドが外部テキストの変数をMovieClipにロードするのに対して、LoadVarsクラスはオブジェクトインスタンスに読込みます。変数の読込みをMovieClipから独立して処理できるので、決まった変数だけを取出して、必要なMovieClipに設定することも可能になります。

LoadVarsクラス
MovieClip.loadVariablesメソッドと同様に、Flashムービーとサーバーとの間で変数のやり取りをします。

LoadVarsクラスの動作やメソッド・プロパティの構成は、XMLクラスに似ています。XMLクラスはXMLデータを対象とするのに対して、LoadVarsクラスは変数と値のペアを扱う点が異なります。

なお、Flash MXまでは「LoadVarsオブジェクト」と呼ばれていました。MX 2004からクラスの概念が正式に採用されたので、「LoadVarsクラス」という名称になりました。

1. LoadVarsインスタンスの生成
LoadVarsクラスを使うには、まずそのインスタンスを生成する必要があります。LoadVarsクラスのメソッドは、そのインスタンスをターゲットとして実行します。

インスタンスの生成というのは、サービスへの会員登録のようなものです。あるいは、銀行の口座開設と思ってもよいでしょう。会員登録や口座開設を済ませると、会員/口座番号が与えられます。以降は、そのID番号を使って、サービスを受けることができる訳です。

インスタンス生成の処理を実行すると、ID番号の替わりに「インスタンス(の参照)」が返されます。その参照を変数に代入しておけば、以降変数に代入されたインスタンスをターゲットとしてLoadVarsクラスのメソッドを使用することができます。
LoadVarsクラスのインスタンスの生成は、つぎのように行います。

myLoadVars = new LoadVars();

new LoadVars()がインスタンス作成の処理です。DateやArray、Objectなどのクラスと同じく、new演算子で生成します。この処理を、一般に「コンストラクタの実行」といいます。

コンストラクタを実行すると、クラス(今回はLoadVarsの)インスタンスの参照が返されます。その参照を変数に代入して、後のメソッドの実行に使います。変数名は任意です。上記のサンプルではmyLoadVarsという変数名にしました。

2. 外部テキストファイルの読込み
LoadVarsクラスで外部テキストファイルを読込むには、LoadVars.loadメソッドを使います。引数に、読込む外部テキストファイルのURLを指定します。

LoadVars.load
指定されたURLから、変数と値を記述した外部テキストファイルをダウンロードします。テキストファイルの中の変数のデータを解析して、変数とその値をLoadVarsクラスのインスタンスに設定します。

LoadVars.loadメソッドは、インスタンスの参照をターゲットとして実行します。変数myLoadVarsに代入されたインスタンスに対して、同階層の外部テキストファイルtest.txtをロードするときは、以下のように記述します。

myLoadVars.load("test.txt");

URLの相対パス指定
ロードする外部テキストファイルのURLは、絶対パスと相対パスの指定ができると考えられます。「相対パスを指定するときには、パスの起点が問題になります。相対パスは、SWFファイルでなく、HTMLファイルを基準とします」(『オブジェクト指向で考えるActionScript』p.161注[*11])。

厳密には、「相対パスの起点は、ブラウザの解釈に影響されます。実際、getURLアクションに関してですが、Macintosh版Internet Explorer 4.5では相対パスの解釈が異なるという問題もかつて発生しました」(前掲)。

3. データの読込みを待つ
外部テキストファイルをロードして、変数とその値を取出すには、処理時間を要します。MovieClip.loadVariablesメソッドでは、MovieClipのonClipEvent (data)イベントハンドラアクションが読込み完了時に呼出されるので、それを利用してロード後の処理を行うと便利です(Macromediaテクニカルノート「外部テキストファイルを読込む」をご参照ください)。

LoadVarsクラスには、イベントハンドラをアクションとして設定することはできません。その代わりに、「イベントハンドラメソッド」というものが用意されています。LoadVarsクラスでロード後の処理に使用するイベントハンドラメソッドが、LoadVars.onLoadです。

LoadVars.onLoad
データがロードされ、変数とその値の取出しが完了すると、呼び出されます。このメソッドにfunctionを定義すると、メソッドの呼出し時にそれが実行されます。

このメソッドが呼出されるときには、ブール(論理)値が引数として一緒に渡されます。変数と値の分析が正常に完了すると引数がtrue、そうでないときはfalseとなります。

正常に取出された変数とその値は、そのLoadVarsインスタンスに設定されます。

LoadVars.onLoadメソッドには、ロード完了時に行う処理をfunctionとして定義します。この定義には、ふたつの書き方があります。定義の方法のひとつ目は、functionを別途定義して、メソッドにそのfunction名を代入します。

myLoadVars.onLoad = myFunction;
function myFunction(bSuccess) {
  // ロード完了時に行う処理
}

function定義は、通常のユーザ定義関数と同じです。LoadVars.onLoadメソッドに、そのfunction名を代入します。function定義は、代入のステートメントの前でも後でも構いません。代入したfunction名の後に括弧()はつきませんので、ご注意ください。

メソッドの定義方法の2つ目は、functionを直接記述(「名前のない関数(匿名関数/関数リテラル)」で指定)して代入します。

myLoadVars.onLoad = function(bSuccess) {
  // ロード完了時に行う処理
};

functionが他の処理でも使われる場合には、別途定義をする方がよいでしょう。そのLoadVars.onLoadメソッドのみで使用する処理の場合には、名前を指定する必要のない直接記述(「匿名関数」)の方法が簡潔です。

イベントハンドラメソッドを定義すると、イベント(この場合は変数のロード完了)が発生するたびにそのfunctionが呼出されて実行されます。イベントハンドラメソッドへのfunction定義というのは、functionをそのイベント用のメモリに保存する操作です。これは、携帯の着メロ設定と同じです。サウンドを着メロのメモリに登録すると、着信(イベントが発生)するたびにメモリしたサウンド(function)が再生(実行)される訳です。

LoadVarsクラスを使って、同階層の外部テキストファイルtest.txtをロードするサンプルスクリプトをご紹介します。テキストファイルtest.txtの内容は、つぎのとおりとします。

sName=Fumio+Nonaka&sHobby=Bug+Fix&

テキストファイルの形式
ロードするテキストファイルの形式については、前掲テクニカルノート「外部テキストファイルを読込む」をお読みください。

また、テキスト中に特殊記号を使用したい場合は、Flash MX 2004オンラインヘルプの[ActionScriptユーザーガイド]の[ActionScriptの基礎] > [データ型について] > [ストリング(String)データ型]および[ベストプラクティスの使用] > [パフォーマンスとFlash Player] > [テキストの操作]、またはMacromediaテクニカルノート「URL エンコーディング: テキストファイルからの特殊文字の読み込み」をご覧ください。

これらの表にない文字については、後者に引用のURLを参照されるか、escape()関数で確認されればよいでしょう。たとえば、テキストとして"+"を入力したい場合、エスケープシーケンスは"%2B"になります。

trace(escape("+"));  // 出力: %2B

ロードの完了後に、メインのタイムライン(_root)に配置されたTextFieldインスタンスname_txtに、取出した変数sNameの値を入力します。

// フレームアクション
myLoadVars = new LoadVars();
//[1]LoadVarsクラスのインスタンスにLoadVars.onLoadメソッドを定義
myLoadVars.onLoad = function(bSuccess) {
  //[2]メソッドに渡された変数分析結果の引数がtrueかどうかを判定[*]
  if (bSuccess) {
    //[3]_rootに配置したTextFieldインスタンスname_txtに変数sNameの値を入力
    _root.name_txt.text = this.sName;
  }
};
myLoadVars.load("test.txt");


[*] if条件で変数bSuccessがtrueの場合という判定は、(bSuccess == true)としなくても(bSuccess)のみで可能です(F-site「if (condition=1)」参照)。

LoadVars.onLoadメソッドの定義について、ひとつ大事な注意があります。LoadVars.loadメソッドによる外部テキストファイルのロードをLoadVars.onLoadメソッドの定義より先に実行してしまうと、定義が済む前にロードが完了してしまうおそれがあります。すると、定義が有効になったときには、もはやonLoadの呼出しが終わっているので、イベントハンドラメソッドは実行されないことになります。ですから、LoadVars.onLoadメソッドの定義をまず行ってから、LoadVars.loadを実行するのが確実です。

オブジェクトを使ったスクリプティングではthisは必須
MovieClipに記述するスクリプトでは、そのMovieClip自身のプロパティや変数はターゲットパスなしで参照できます。ところが、LoadVarsなどのオブジェクトを使ったスクリプティングでは、そうではありません。ターゲットパスを省略すると、スクリプトを記述したタイムライン(MovieClip)を参照してしまいます。

上記のサンプルスクリプトで、外部テキストファイルからロードした変数sNameをターゲットパスなしに指定すると、スクリプトを記述したタイムライン(MovieClip)上の変数が参照されます。ところが、変数はLoadVarsクラスのインスタンスmyLoadVarsにロードされ、タイムラインには存在しません。したがって、ターゲットパスなしにsNameを指定すると、未定義値undefinedと認識されてしまいます。

変数は、LoadVars.onLoadメソッドを定義したインスタンスmyLoadVarsにロードされます。スクリプトを記述したタイムラインではなく、このインスタンス自身を参照するためには、ターゲットとしてthisを指定する必要があります。つまり、インスタンスに読込まれた変数sNameを指定するには、this.sNameと記述しなければなりません。

このように、一般にMovieClip以外のクラスを使ったスクリプティングでは、自分自身のプロパティや変数を参照する場合にターゲットとして必ずthisを指定すると憶えましょう。

_____

作成者: 野中文雄
更新日: 2005年5月22日 URLの相対パス指定に関する注釈追加
更新日: 2005年4月5日 テキストファイルの形式に関する注釈追加。若干の字句修正およびレイアウト変更
更新日: 2003年3月19日 LoadVars.onLoadの定義のタイミングについて注意点を文末に追加
作成日: 2003年3月17日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.