- ベストアンサー
Flash XML読み込み件数繰り返し
- XMLに記述された内容をFlashに表示させるプログラムの制作での問題について相談します。
- 3件ずつ投稿内容を表示し、6件目以降の内容はページャーのようなボタンをクリックすることで表示する方法について質問します。どのような実装方法が考えられるでしょうか。
- for文などを試してみましたが、うまくいかずに困っています。解決策を教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
まずは...ですね, 最も肝腎な Flash のバージョンも ActionScript のバージョンも書かれていませんね。 これでは回答しにくい(回答不可)です。 回答できないので 勝手に最近のバージョンである Flash CS3 以降をお持ちで ActionScript 3.0 を使うということで以下を続けます。 それと 現在はデータをどこにどのように表示させている(させようとしている)のかがわからないため これまた回答しにくい(回答不可)です。 さらに 表示を切り替える方法などたくさんあります。 「データを 3件+3件+3件+1件で4つのした場合」でも 横に並べた4つのテキストフィールドにそれぞれのデータを入れて 横スライドさせるような方法もあります(Flash的?)。 また, 縦に並べた4つのテキストフィールドにそれぞれのデータを入れて 縦スクロールさせるような方法もあります(JavaScript的?)。 また, 上下に重ねた4つのテキストフィールドにそれぞれのデータを入れて タブで上下を入れ替えるような方法もあります(CSS&HTML的?)。 さらに, テキストフィールドは1つで 中に表示する文字列だけを変える方法もありますし(ローカルアプリケーション的?), その他 4つのテキストフィールドの表示非表示を切り替える方法など様々です。 その辺がわかりませんし (というか,せっかくFlashで見せるのですから,それなりに色々見せ方を考えた方が良いように思いますし,) その辺のしくみを作る説明の方がXMLの説明よりずっと字数を食うので, 勝手に 「ロードしたXMLを 3件+3件+3件… というデータに分割する」 という部分の方法だけを回答することにします。 それとあと, <date>や<content>や<image>という複数項目を どのような状態で取得&表示すべきなのかもわかりませんし 字数制限などもあるため XMLも<date>項目のみに簡素化した 下の【図】↓のようなデータを用意するものとします。 そうした場合, その XMLファイル(test.xml)と同じフォルダに Flash の FLA(SWF)ファイル を保存した場合に タイムラインのフレームに書くスクリプト例です↓。 //---------------------------------------------- //XMLファイルのパスを設定 var xml_url:URLRequest = new URLRequest("test.xml"); //XMLをロードするURLLoaderを作成 var xml_ld:URLLoader = new URLLoader(); //XMLインスタンスの宣言 var my_xml:XML; //各要素にデータを入れる配列を作成 var my_arr:Array = new Array(); //XMLロード完了時に 関数「onLoadComp」 を実行 xml_ld.addEventListener(Event.COMPLETE, onLoadComp); //関数「onLoadComp」 の定義 function onLoadComp(e:Event):void { // //XMLインスタンスを作成しロードしたデータを代入 my_xml = new XML(e.target.data); //カウンタを用意 var cnt:int = 0; // //XMLの子ノードの数だけループ for (var i:int = 0; i<my_xml.children().length(); i++) { //i が 0 以外で 3で割った余りが 0(false) のとき if (i != 0 && !(i%3) ) { //カウンタに1を加算 cnt++; } //配列のcnt要素が存在しなければ if (my_arr[cnt] == undefined) { //配列のcnt要素にXMLのdateノードの値を代入 my_arr[cnt] = my_xml.children()[i].date; //配列のcnt要素が存在すれば } else { //配列のcnt要素に改行コードとXMLのdateノードの値を加算 my_arr[cnt] += "\n" + my_xml.children()[i].date; } } // //★動作検証用の関数「kensyou」を実行してみる kensyou(); } //XMLファイルのロード開始 xml_ld.load(xml_url); //★動作検証用の関数「kensyou」の定義 function kensyou():void { //配列の要素数を取得 var arr_len:int=my_arr.length; //配列の要素数だけループ for (var i:int = 0; i<arr_len; i++) { //テキストフィールド「txt○」を適当に作成 this["txt"+i] = new TextField(); this["txt"+i].x=80*i+10; this["txt"+i].y=10; this["txt"+i].border=true; this["txt"+i].background=true; this["txt"+i].autoSize=TextFieldAutoSize.LEFT; //「txt○」に配列の○要素を表示 this["txt"+i].text=my_arr[i]; //「txt○」を配置 addChild(this["txt"+i]); } } //---------------------------------------------- 「制御」→「ムービープレビュー」やパブリッシュで動作確認できると思います。 上記スクリプトの場合, XMLの <entry> の数は少なくとも 1 つ以上であれば 10個に限らずいくつにしても対応できます。 またスクリプトで作成したテキストフィールドは 配列「my_arr」の各要素を表示するため(動作検証のため)だけに適当に作成したもので,本題とは関係がありません。 本題は配列「my_arr」の各要素にデータを分割して入れるというところまでです。 後はどうするのかわかりませんが, とにかく配列「my_arr」に蓄えられた各要素のデータを 何らかの形で個別に取り出して使えば良いと思います。 または 配列「my_arr」にデータを取り出したのと同じような方法で XML「my_xml」から3刻みのデータを直接取り出しても良いと思います。 とにかく 何をどうしたいのかがわからないため このくらいの回答しかできません。
お礼
>BlurFiltanさま。 ありがとうございました!ASやソフトのバージョンの記述含め、もろもろ質問内容に不備がありました事まずお詫び申し上げます。 上記コメントを頂いた後、ASを一部お借りしたり、改変したりなどなど・・・を自分なりに繰り返しながらなんとか昨日実装する事ができました・・・ xmlからのデータ取得方法など大変参考になりました。 ありがとうございました!