「(5) .fbd ファイルを読み込む」で配列 fbd_xml の各要素をXMLオブジェクトにして .fbd ファイルのXMLデータを読み込ませました。
ではいよいよ読み込んだデータをテキストエリアに表示しましょう。
とその前に先ほど述べたように配列 fbd_xml のXMLオブジェクトに load メソッドを用いて .fbd ファイルを読み込ませましたが、その内容をテキストエリアに表示するためには読み込みが完了していなければなりません。
通常なら onLoad イベントハンドラを用いるのですが、今回は複数のファイルを同時に読み込むという動作を行っているので、その全ての読み込みを判断するのに単独のオブジェクトのイベントを監視する onLoad イベントハンドラを用いるのは適切ではありません。
従って今回は fbd_xml オブジェクトの読み込みを監視する空のムービークリップを配置して onEnterFrame イベントハンドラメソッドの中で処理を行います。
まず daylist_xml.onLoad の続きに読み込みフラグを設定するスクリプトを追加します。
// 読み込みフラグを立てる
_global.fl_fbdread = true;
次にレイヤー「変数定義」と「main」の間にレイヤー「MC」を新規作成します。そして「挿入」→「新規シンボル」で中身が空のムービークリップを作成します。名前は自由に設定して結構ですが、今回はライブラリから管理しやすいよう「mc_firstread」と設定します。
この新たに作成したムービークリップ「mc_firstread」をレイヤー「MC」に配置してインスタンス名も同じ「mc_firstread」にします。インスタンス名はムービークリップを選択するとプロパティウィンドウから設定できます。
ムービークリップのイベントハンドラ EnterFrame はこれまではムービークリップそのものにスクリプトを記述しましたが、FlashMXからはイベントハンドラメソッドを用いてタイムライン上に記述することが可能になりました。ここではその方法を用います。
先ほどのレイヤー「MC」のタイムラインに mc_firstread.onEnterFrame の関数を記述します。
mc_firstread.onEnterFrame = function() {
}
mc_firstread インスタンスは1フレームしかないムービークリップなので、この関数の処理は1秒間にフレームレートの回数だけ処理が行われるので、この中に読み込みチェックの処理を記述してきます。
if (_global.fl_fbdread) {
var dfload = 0; // DayFileLoad 各日ファイルを読み込んだ数を入れる変数
for (i = 0; i < _root.fbd_xml.length; i++) {
if (_root.fbd_xml[i].firstChild.nodeName == "blogdata") {
dfload++;
}
}
if (dfload == _root.fbd_xml.length) {
_global.fl_fbdread = false;
_global.view_newest = true; // 最も最近にエントリされたデータを表示するフラグを立てる
}
}
まず最初に読み込みフラグ _global.fbdread がtrueかどうかをチェックし、trueだった場合にのみ次の処理へ移るようにします。
次に .fbd ファイルを読み込んだ数をチェックするためのローカル変数 dfload を定義します。そしてXMLデータを入れるために定義した fbd_xml オブジェクトの数だけ読み込みのチェックを行い、読み込みが確認されたら変数 dfload の数を1追加します。チェックには XMLオブジェクトの一番最初のノードに <blogdata> タグがあるかどうかで判断するようにしています。
一通りのチェックが終わると変数 dfload の値が fbd_xml オブジェクトの数と同じかをチェックします。ここでもし同じであれば全ての読み込みが完了したと判断して次の処理に移り、同じでなければ処理を終了して次のフレームに進みます。変数 dfload の値は次のチェック処理の時に初期化されるのでそのままにしておいて結構です。
全ての読み込みが完了したと判断したら、読み込みフラグ _global.fl_logread はfalseにしてチェック処理を行わないようにします。そしてデータ表示フラグ _global.view_newest をtrueとして定義します。
blogデータ表示のためにレイヤー「main」にテキストエリアを3つ、それぞれのインスタンス名を「date」「title」「log」として配置し、3つとも「テキストをHTMLとしてレンダリング」「テキストの周囲にボーダーを表示」にチェックを入れ、「date」「title」は単一行、「log」は複数行にします。
// 最も最近にエントリされたデータを表示する
if (_global.view_newest) {
date.htmltext = _root.fbd_xml[0].firstChild.childNodes[0].attributes["year"] +"年" +
_root.fbd_xml[0].firstChild.childNodes[0].attributes["month"] +"月" +
_root.fbd_xml[0].firstChild.childNodes[0].attributes["day"] +"日";
title.htmltext = "<b>" + _root.fbd_xml[0].firstChild.childNodes[1].firstChild.nodeValue + "</b>";
log.htmltext = _root.fbd_xml[0].firstChild.childNodes[2];
_global.view_newest = false;
}
あとは fbd_xml[0] オブジェクトの内容をそれぞれのテキストエリアに表示させて、表示フラグ _global.view_newest をfalseにして処理を終了します。
ちなみにXMLのノード内にHTMLタグが含まれていると実際は当然ながらHTMLタグ部分もXMLとしてオブジェクト内に格納されています(デバッグでXMLオブジェクトの中身を見るとわかると思います)。しかしテキストエリアに表示するときはHTML部分はそのまま残しておきたいのでデータを取り出すときはそのHTMLが存在するノードの親ノードの内容を表示するようにします。ここでは _root.fbd_xml[0].firstChild.childNodes[2] の内容(<content> タグの中身)を全て表示することで実現しています。
さて、これで初回読み込み時の基本的な動作が実現できました。今後は全体的な機能とインターフェイスを考えて行こうと思いますが、これがなかなか大変な作業なので次回の更新はかなり先になるかもしれません。
今回の構成ファイルをダウンロードできるようにしました。
>> ダウンロード
ではいよいよ読み込んだデータをテキストエリアに表示しましょう。
とその前に先ほど述べたように配列 fbd_xml のXMLオブジェクトに load メソッドを用いて .fbd ファイルを読み込ませましたが、その内容をテキストエリアに表示するためには読み込みが完了していなければなりません。
通常なら onLoad イベントハンドラを用いるのですが、今回は複数のファイルを同時に読み込むという動作を行っているので、その全ての読み込みを判断するのに単独のオブジェクトのイベントを監視する onLoad イベントハンドラを用いるのは適切ではありません。
従って今回は fbd_xml オブジェクトの読み込みを監視する空のムービークリップを配置して onEnterFrame イベントハンドラメソッドの中で処理を行います。
まず daylist_xml.onLoad の続きに読み込みフラグを設定するスクリプトを追加します。
// 読み込みフラグを立てる
_global.fl_fbdread = true;
次にレイヤー「変数定義」と「main」の間にレイヤー「MC」を新規作成します。そして「挿入」→「新規シンボル」で中身が空のムービークリップを作成します。名前は自由に設定して結構ですが、今回はライブラリから管理しやすいよう「mc_firstread」と設定します。
この新たに作成したムービークリップ「mc_firstread」をレイヤー「MC」に配置してインスタンス名も同じ「mc_firstread」にします。インスタンス名はムービークリップを選択するとプロパティウィンドウから設定できます。
ムービークリップのイベントハンドラ EnterFrame はこれまではムービークリップそのものにスクリプトを記述しましたが、FlashMXからはイベントハンドラメソッドを用いてタイムライン上に記述することが可能になりました。ここではその方法を用います。
先ほどのレイヤー「MC」のタイムラインに mc_firstread.onEnterFrame の関数を記述します。
mc_firstread.onEnterFrame = function() {
}
mc_firstread インスタンスは1フレームしかないムービークリップなので、この関数の処理は1秒間にフレームレートの回数だけ処理が行われるので、この中に読み込みチェックの処理を記述してきます。
if (_global.fl_fbdread) {
var dfload = 0; // DayFileLoad 各日ファイルを読み込んだ数を入れる変数
for (i = 0; i < _root.fbd_xml.length; i++) {
if (_root.fbd_xml[i].firstChild.nodeName == "blogdata") {
dfload++;
}
}
if (dfload == _root.fbd_xml.length) {
_global.fl_fbdread = false;
_global.view_newest = true; // 最も最近にエントリされたデータを表示するフラグを立てる
}
}
まず最初に読み込みフラグ _global.fbdread がtrueかどうかをチェックし、trueだった場合にのみ次の処理へ移るようにします。
次に .fbd ファイルを読み込んだ数をチェックするためのローカル変数 dfload を定義します。そしてXMLデータを入れるために定義した fbd_xml オブジェクトの数だけ読み込みのチェックを行い、読み込みが確認されたら変数 dfload の数を1追加します。チェックには XMLオブジェクトの一番最初のノードに <blogdata> タグがあるかどうかで判断するようにしています。
一通りのチェックが終わると変数 dfload の値が fbd_xml オブジェクトの数と同じかをチェックします。ここでもし同じであれば全ての読み込みが完了したと判断して次の処理に移り、同じでなければ処理を終了して次のフレームに進みます。変数 dfload の値は次のチェック処理の時に初期化されるのでそのままにしておいて結構です。
全ての読み込みが完了したと判断したら、読み込みフラグ _global.fl_logread はfalseにしてチェック処理を行わないようにします。そしてデータ表示フラグ _global.view_newest をtrueとして定義します。
blogデータ表示のためにレイヤー「main」にテキストエリアを3つ、それぞれのインスタンス名を「date」「title」「log」として配置し、3つとも「テキストをHTMLとしてレンダリング」「テキストの周囲にボーダーを表示」にチェックを入れ、「date」「title」は単一行、「log」は複数行にします。
// 最も最近にエントリされたデータを表示する
if (_global.view_newest) {
date.htmltext = _root.fbd_xml[0].firstChild.childNodes[0].attributes["year"] +"年" +
_root.fbd_xml[0].firstChild.childNodes[0].attributes["month"] +"月" +
_root.fbd_xml[0].firstChild.childNodes[0].attributes["day"] +"日";
title.htmltext = "<b>" + _root.fbd_xml[0].firstChild.childNodes[1].firstChild.nodeValue + "</b>";
log.htmltext = _root.fbd_xml[0].firstChild.childNodes[2];
_global.view_newest = false;
}
あとは fbd_xml[0] オブジェクトの内容をそれぞれのテキストエリアに表示させて、表示フラグ _global.view_newest をfalseにして処理を終了します。
ちなみにXMLのノード内にHTMLタグが含まれていると実際は当然ながらHTMLタグ部分もXMLとしてオブジェクト内に格納されています(デバッグでXMLオブジェクトの中身を見るとわかると思います)。しかしテキストエリアに表示するときはHTML部分はそのまま残しておきたいのでデータを取り出すときはそのHTMLが存在するノードの親ノードの内容を表示するようにします。ここでは _root.fbd_xml[0].firstChild.childNodes[2] の内容(<content> タグの中身)を全て表示することで実現しています。
さて、これで初回読み込み時の基本的な動作が実現できました。今後は全体的な機能とインターフェイスを考えて行こうと思いますが、これがなかなか大変な作業なので次回の更新はかなり先になるかもしれません。
今回の構成ファイルをダウンロードできるようにしました。
>> ダウンロード