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");
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.
|