- ベストアンサー
外部テキストから読み込んだ引数をabc順に変数に入れる
グラフィック書籍のカタログのようなサイトをflashで作っています。 一覧をabc順で表示させるときに外部テキストから読み込んでダイナミックテキストへ名前を表示させているのですが、後から追加した場合に大量の引数を変更しなければならず大変手間がかかります。 現在以下のようにしています。 name_1=aa &name_2=bb &name_3=cc &name_4=dd &name_5=ee これにabという名前を追加した場合にab以下をひとつずつ手作業で変更しなければならず困っています。 abc順でなくともいいのですが、あとから追加した場合に後ろの引数が自動的にひとつずれるような書き方はできますでしょうか? または自動的に書き換えられるエディタなどのソフトウェアはありますか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ツールを探すより、変数を大量に読み込まなくても済むように工夫してみてはいかがでしょう。 一覧を表示したいだけなら、変数をズラズラと並べて読み込まなくても、ActionScript でもっと簡単にできます。 例えば、テキストファイル”title_src.txt”に、 title_list=aaa,bbb,αβγ,あいうえお,グラフィック入門 このように、タイトルだけを” , ”で区切って並べておくとします。 このファイルを読み込むと、Flash には title_list という変数が読み込まれます。 title_list を、String クラス( Flash MX 以前ではオブジェクト)の split メソッドを使って、” , ”を区切り文字として分割します。 分割した文字列は、配列変数に1つずつ格納されます。 この配列変数が、仮に”list”という名前だとすると、list の内容は list[ 0 ] → aaa list[ 1 ] → bbb list[ 2 ] → αβγ list[ 3 ] → あいうえお list[ 4 ] → グラフィック入門 となります。 Flash MX 以降は、テキストフィールドも ActionScript で細かく制御できるようになりました。 テキストフィールドには、表示する内容を管理している text というプロパティがあります。書き換えると、テキストフィールドに表示する内容を更新できます。 配列変数は連番になっていますし、配列変数内にいくつ変数があるか(つまり、リストにするタイトルがいくつあるか)は、length というプロパティを見ると分かります。 この2点を利用し、for ループで text プロパティに配列変数に入っているタイトルを1つずつ順に連結していくと、リストの形で表示できます。 単純に連結していくと、全てのタイトルが詰まって見にくくなりますので、1タイトルごとに改行を挿入していくといいでしょう。 仮に、テキストフィールドのインスタンス名を”disp”とします。 タイトルのリストを読み込み、このテキストフィールドに表示するスクリプトは、大体、次のようになります。 このスクリプトはフレームに設定してください。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください) //テキストの読み込み System.useCodepage = true; this.loadVariables( "title_src.txt" ); //読み込み完了時の処理 this.onData = function() { //読み込んだテキストを” , ”で分割 list = new Array(); list = title_list.split( "," ); //テキストフィールドに表示 for( i = 0; i < list.length; i++ ) { disp.text += list[ i ]; //最終行以外は改行を挿入 if( i != list.length - 1 ) { disp.text += "\n"; } } }; //タイムラインはここで止める stop(); ---------------------------------------------- タイトルを” , ”で区切って列挙するだけなら変数の番号は関係ありませんから、タイトルが増えたり減ったりした時も修正は簡単です。 ただし、読み込むテキストファイルが、タイトルが表示したい順に並べられていることと、1つ1つのタイトルが” , ”など、何か特定の区切り文字で区切って記述されていることが条件となります。 タイトル数が少ないのであれば手作業でも構いませんが、多い時は、Excel などの表計算ソフトを使うと便利です。 Excel では、列ごとのデータを” , ”で区切る「 CSV 形式」で書き出すことができます。 タイトルを、列ではなく行方向に入力し、昇順または降順に並べ替えます。 できたシートを CSV 形式で保存し、メモ帳などで開いてください。 データが aaa,bbb,αβγ・・・ というように” , ”で区切られていることを確認したら、Flash で読み込めるように、文字列の最初に変数名を追加します。 title_list=aaa,bbb,αβγ・・・ このファイルをテキストファイル(拡張子: txt )として保存して、できあがりです。 なお、Excel で CSV 形式で書き出すと、行末に改行が入っていることがあります。 改行が入っていると、Flash で表示する時に意図しない改行が入りますので、削除してから保存してください。 ---------------------------------------------- Flash で表示する時に、1つのテキストフィールドではなく、1タイトルにつき1つのテキストフィールドを用意している場合は、テキストフィールドのインスタンス名の付け方を工夫することで対応できます。 例えば、テキストフィールドのインスタンス名を txt0 ~ 4 と、固定の名前+通し番号で付けると、文字列からインスタンスを指定できる配列演算子 [ ] を利用して //テキストフィールドに表示 for( i = 0; i < list.length; i++ ) { this[ "txt" + i ].text = list[ i ]; } として、全てのテキストフィールドの表示内容をまとめて更新できます。 配列変数の管理番号(インデックスといいます)は 0 から始まります。 テキストフィールドの名前も 0 から振っておくと、表示する配列変数のインデックスと1対1に対応するので、分かりやすくなります。 タイトルが入っている配列変数は、ComboBox や List コンポーネントを利用して表示する時や、番号に対応させてタイトルを参照する場合など、他にも様々な使い道があります。 あまり細かいことを言わなければ、sort や sortOn メソッドで昇順・逆順の並べ替えも可能です。 リストに表示するタイトルをリンクにして、クリックした時に特定のフレームや HTML ページを表示したい、といった場合は、テキストファイルで変数を読み込むだけでは限界があります。 この場合は、XML を利用し、タイトルとリンク先をセットにしてリストを作った方が、効率的だと思います。 XML は、この手のリストを記述することを得意とする言語です。 変数の通し番号をいちいち振り直しながら書き直すことなく、タグを付けて項目を増減するだけでリストを記述できます。 Flash に XML を読み込む時は、loadvariables ではなく、XML クラスという専用のクラスを使い、読み込んだリストの構造を解析します。 興味がありましたら、研究してみてください。
その他の回答 (2)
#1です。 補足です。 表計算ソフトはExcelしか使ったことがないため,他のソフトのことはよくわかりません。そのExcelについての補足です。 説明の都合上,#1では,A列とB列を使って, = "name_1=" & A1 & "&" = "&name_2=" & A2 & "&" のように全てを書いていますが,実際はこれでは汎用的ではありません。 "name_" の部分などは,他のセルに「name_」などと書いておいて,そのセルを参照するようにしておくと,変数名にどんな名前が来ても全ての変数名が一瞬で全部変えられます。 1,2,…などの部分も,いちいち書くのではなくて,方法はいろいろありますが,工夫次第で楽に"name_" の後に連番で挿入できます。 また,データが1種類の場合,A列B列でも良いのですが, 書籍名 出版社名 定価 … など,複数ある場合は,入力用シートとFlash用出力シートを別に用意しておくと,使いやすいです。 でも,こんなのになってくると,#2さんが後半で言われているXMLの方が良くなってきますね。 -------------------------------------- あと,#2さんの書かれているCSVへの保存ですが, Excelは,縦(列)向きにはオートフィルタやソートなど処理がしやすいようにできていて,横(行)向きにはなかなか使いにくいです。 でも,ソートに関しては横向きにも処理出来ます。 ソートしたい行を選択→「データ」→「並べ替え」→「オプション」を選択します。 並べ替えオプションダイアログが出てくるので,「方向」を「列単位」にチェックを入れ,「OK」。 並べ替えする行を指定して,ソートすれば列が入れ替えできます。 また,Excelの行は65536行と,普通に使うにはだいたい間に合う行数を持っていますが,列は256列しかありません。 データが256個を越える場合は,データを普通通り縦向きに並べて処理をし,250くらいずつ選択→「コピー」で別シートまたは別ファイルに,「形式を選択して貼り付け」で「行と列を入れ替える」にチェックを入れ,「OK」。 と言う感じにコピーし,複数行にしておいて,CSVファイルで保存し。 あとは,テキストエディタで手動で改行を削除してカンマを入れることが必要になると思います。 Excel(など表計算ソフト)は便利ですよ。書籍名以外にその出版社や定価や著作者などのデータを入れておくと,出版社順のさらに書籍名順など工夫しだいで色々操作ができます。 それで,必要なデータだけをFlashに読み込ませれば良いのです。
お礼
詳細に教えていただいてありがとうございます。 普段エクセルを使わないので このような使い方があるとは知りませんでした。 #2で教えていただいたスクリプトとエクセルでうまくいきそうです。
私はマイクロソフトのExcelを使っています。 B列に関数として B1セルから順に = "name_1=" & A1 & "&" = "&name_2=" & A2 & "&" = "&name_3=" & A3 & "&" = "&name_4=" & A4 & "&" = "&name_5=" & A5 & "&" = "&name_6=" & A6 & "&" = "&name_7=" & A7 & "&" = "&name_8=" & A8 & "&" = "&name_9=" & A9 & "&" = "&name_10=" & A10 & "&" … … … … みたいなのをあらかじめ用意しておいて, A列に書籍名?を aaa bbb ccc ddd aac bbc aff と適当に書いていきます。 この状態で B列は自動的に name_1=aaa& &name_2=bbb& &name_3=ccc& &name_4=ddd& &name_5=aac& &name_6=bbc& &name_7=aff& のようになっています。 それでA列だけを選択, 「データ」→「並べ替え」 で「優先されるキー」を「列A」にして「昇順」にチェックを入れ「OK」で B列は自動的に name_1=aaa& &name_2=aac& &name_3=aff& &name_4=bbb& &name_5=bbc& &name_6=ccc& &name_7=ddd& となります。 このB列だけを,テキストエディタにコピーすればOKです。 データの最後の"&"は不要だったら,入れなくて良いです。
お礼
回答ありがとうございました。 うまくいきました。 配列の使い方を知らなかったのですが、 とても役に立ちますね。 教えていただいたスクリプトを元にいろいろできそうです。 XMLにもチャレンジしてみようとおもいます。