D0503041 コンボボックスに外部テキストからラベルの値を読み込むには?
Name いまちゃん
Date 2005年03月04日 (金) 01時32分
Message こんばんわ、憲ちゃん。
今コンボボックスにチャレンジしているのですが
combo00.flaを参考にやってみたらできました♪
それでですね・・・コンボボックスの「Labels」にはいる値を
外部テキストから読み込ませたいのですが
どのようにすればいいんでしょう?
ご教授お願いしますm(__)m
Response 01
2005年03月04日 (金) 09時55分> ぱぴよん 
おはようございます。
いまちゃんさん はじめまして^^

以前私も同じことをしました(^-^)
なので協力できるかなぁ? と思いましたのでレスさせて頂きます。


◆準備
1.data.txtというテキストファイルを用意して下さい。
2.data.txtに  「data=item1,item2,item3,item4&」 と書いて保存して下さい。
3.Flash側ですが、comb1というインスタンス名のコンボボックスを用意して下さい。
4.次にActionScriptです^^


 var txtVars = new LoadVars();
 txtVars.load("data.txt");
 txtVars.onLoad = function(success) {
  if(success) {
  items = new Array();
 items = txtVars.data.split(",");
 for(var i = 0; i < items.length; i++) {
  _root.comb1.addItem(items[i]);
 }
 }
 }

とActionScriptを記述してください。
そうすると外部テキスト(data.txt)から外部変数dataの値を取得して、
コンマ区切りでcomb1に代入していけると思います^^

ちょっとだけ解説です^^(詳しくは憲ちゃんがご教授下さると思います(@^o^@))

 var txtVars = new LoadVars();
 txtVars.load("data.txt");

txtVarsというLoadVarsオブジェクトを生成し、そのtxtVarsにdata.txtの内容を読込んでいます。


 txtVars.onLoad = function(success) {
  if(success) {

  }
 }

txtVarsにdata.txtの内容が読込まれたらsuccessというフラグが立ち、
if(success)内の処理をします。


 items = new Array();
 items = txtVars.data.split(",");

itemsという配列オブジェクトを用意し、txtVarsに読込んだ外部変数dataの値をコンマ(,)区切りで
配列itemsに格納していきます。
今回の場合は items[0]="item1"、items[1]="item2"、items[2]="item3"、items[3]="item4" となります。

 for(var i = 0; i < items.length; i++) {
  _root.comb1.addItem(items[i]);
 }

配列の要素数分だけcomb1にアイテムを追加していきます。

ちょっとだけ解説でした(笑)



外部ファイル(data.txt)での外部変数は複数用意することも可能です。

 &data1=item1&
 &data2=item2&
 &data3=item3&
 &data4=item4&
          」
という風にすれば、Flashで読込んだときに
変数data1の値が item1 、変数data2の値が item2、・・・・
となります^^


いまちゃんさんのお力に少しでもなれれば幸いです(^-^)/~~
Response 02
2005年03月04日 (金) 11時44分> ぱぴよん 
すみません。私の環境を伝えるのを忘れていました。

Flash MX Professional 2004

を使用しています。
いまちゃんさんがどのFlashソフトを使用されているのか分かりませんが、
もしかすると 私が記述したActionScriptではエラーが発生してしまうかもしれません^^;
その場合はやり方だけ こんな風にするんだぁ と思って頂いて
いまちゃんさんがお使いのFlashソフトに即した記述方法に変えてください(@^-^@)
Response 03
2005年03月04日 (金) 13時16分> 憲ちゃん 
さすが、ぱぴよんさん、ありがとうございます♪
それでいいと思います(*^-^*

ただ「addItem(ラベル名)」は、既にあるメニューの最後にアイテムを追加するメソッドですから、
ラベル名の数だけ「for文」で追加しなければいけませんね!
「setDataProvider(配列名)」を使うと、
指定した配列の中身を一度にアイテムとして読み込んでくれますので、

 combo1.setDataProvider(items);

この一行で完了です(^^g/~~
Response 04
2005年03月04日 (金) 14時20分> ぱぴよん 

>さすが、ぱぴよんさん、ありがとうございます♪

いえいえ、いつも憲ちゃんにはお世話になっておりますし^^


>「setDataProvider(配列名)」を使うと、
>指定した配列の中身を一度にアイテムとして読み込んでくれますので、
>
> combo1.setDataProvider(items);
>
>この一行で完了です(^^g/~~

そんな方法があったのですかっ! 目からウロコです(笑)
今まで配列の要素数だけfor文で繰り返していたので・・・^^;

早速憲ちゃんに教わった方法を試したのですが、
私が使っている FLASH MX Professional 2004 では
setDataProviderというプロパティはないようです^^;
多分同じ動作をするのだと思いますが、
dataProviderというプロパティがありました。
プロパティの説明では「モデルとして使用されるデータのリスト」とありました。
使用方法は
 combobox.dataProvider = items;
のようなのですが、うまく配列の要素をコンボボックスに追加してくれません^^;
何か使い方が違うのかな・・・
時間があるときに調査してみたいと思います(^o^)/~~
Response 05
2005年03月04日 (金) 22時21分> いまちゃん 
こんばんわ、ぱぴよんさん、憲ちゃん。
さっそくのレスありがとうございます。
わたしの環境はFlashMXです。
ぱぴよんさんの方法を試したんですがシンタックスエラーがでちゃいました(T^T)
それで憲ちゃんの方法を試そうと思ったんですが・・・
combo1.setDataProvider(items);
↑この一行を書くだけでいいんですよね?
表示されないんです〜(T^T)
コンボボックスのパラメーターの「Labels」の値には
なんて記述すればいいんでしょう?items?(^^;)
たびたびすいませんがお願いします。
Response 06
2005年03月05日 (土) 01時42分> 憲ちゃん 
ぱぴよんさん、MX2004に「setDataProvider」が無い!本当ですか???
それはともかくとして、いまちゃんが憲ちゃんと同じ「MX」ということであれば、
少なくとも「setDataProvider」が確実に使えるというわけですね♪

サンプルを見て実感も含めて分析していただくのが一番分かりやすいのですが・・・
折角外部テキストから、ComboBoxのLabelsに値を代入するのですから、単体ではもったいないので、
合わせ技を使って、ボタンでメニュー(アイテム)の内容を変更できるようにしてみました(*^^*

 combo01.zip ※MX仕様

外部テキストのファイル名は”comlabel.txt”で、内容は・・・

 &label0=子,丑,寅,卯,辰,巳,午,未,申,酉,戌,亥&
 &label1=土星人,金星人,火星人,天王星人,木星人,水星人&
 &label2=一白水星,二黒土星,三碧木星,四緑木星,五黄土星,六白金星,七赤金星,八白土星,九紫火星&
 &label3=牡羊座,牡牛座,双子座,蟹座,獅子座,乙女座,天秤座,蠍座,射手座,山羊座,水瓶座,魚座&

「変数名=値」の組を「&(半角アンド)」で挟み、値はそれぞれ「,(半角カンマ)」で区切っています。

Flash側は、ComboBox、4つの選択ボタン、選択中のメニューを表示する「メニュー」MCを、
シーン上に配置。
「メニュー」MCのタイムラインは4フレームあり、それぞれ選択中のメニューに対応させています。
このインスタンス名として”menu”という名前を付けています。

まず、ComboBoxのオブジェクト名を「theCombo」とし、Labels欄及びData欄は何もしません。
1フレームのフレームアクションで・・・

 System.useCodepage = true;←MXの文字化け防止のおまじない
 this.loadVariables("comlabel.txt");←外部テキスト”comlabel.txt”のデータ読込開始
 this.onData = function() { データの読み込みが完了したら
   for (i = 0; i < 4; i++) { iを0から3までカウントアップしながら以下を繰り返し実行
     arrayName = "arrayLabel"+i;←変数arrayNameに右辺の文字列加算結果を代入
     labelName = "label"+i;←変数labelNameに右辺の文字列加算結果を代入
     this[arrayName] = this[labelName].split(",");←※読み込んだ各データを配列に格納
   }
   theCombo.setStyleProperty("selection", 0x003366);←theComboの選択色を指定して
   theCombo.setDataProvider(arrayLabel0);←配列arrayLabel0をアイテムとして読み込む
 };

ここの「for文」の内容が分かりにくければ、その部分を・・・

 arrayLabel0 = label0.split(",");←配列arrayLabel0にlabel0の値を”,”で区切り要素に格納
 arrayLabel1 = label1.split(","); ※以下同じ
 arrayLabel2 = label2.split(",");
 arrayLabel3 = label3.split(",");

と書き換えても同じ結果です。
どちらも結果は・・・

 arrayLabel0[0] ←”子”、arrayLabel0[1] ←”丑”…arrayLabel0[11] ←”亥”
 arrayLabel1[0] ←”土星人”、arrayLabel1[1] ←”金星人”…arrayLabel1[5] ←”水星人”
 arrayLabel2[0] ←”一白水星”、arrayLabel2[1] ←”二黒土星”…arrayLabel2[8] ←”九紫火星”
 arrayLabel3[0] ←”牡羊座”、arrayLabel3[1] ←”牡牛座”…arrayLabel3[11] ←”魚座”

となります。
この状態で、「theCombo.setDataProvider(arrayLabel0);」として( )内に配列名を指定すると、
この場合は”子”〜”亥”までのデータが一気にLabelsの値としてtheComboに取り込まれます。

この時点で「干支」としての配列arrayLabel0、「六星」としての配列arrayLabel1、
「九星」としての配列arrayLabel2、「星座」としての配列arrayLabel3 が作られていますから、
各ボタンのボタンアクションで例えば、一番下の「星座」ボタンなら・・・

 on (release) { (星座ボタンが)クリックされたら
   theCombo.setStyleProperty("selection", 0x666600);←選択色を指定して
   theCombo.setDataProvider(arrayLabel3);←配列arrayLabel3をアイテムとして読み込む
   menu.gotoAndStop(4);←(同時に)インスタンス”menu”のタイムラインを4フレームに移動
 }

他のボタンも各々違いに注意して同様に記載してください。
なお、ぱぴよんさんは、外部テキストの読み込みに「LoadVarsオブジェクト」を使用されましたが、
この場合は少々扱いにくい(というか憲ちゃん自身Flash5からの愛好者という個人的理由もある)ので、
旧来からある「loadVariables」と「onData」の組み合わせで対処しました(*^-^*)
Response 07
2005年03月05日 (土) 23時50分> いまちゃん 
サンプルまでつけていただいてありがとうございます!
わかりやすいです♪
それでもう少し欲張った質問なんですけど(^^;)
このcombo01仕様にプラスした形で
labelで選んだ子,丑,寅,卯などをクリックした際ジャンプするという
形をとりたいのですがcombo00を参考にして
飛ばせたいフレームにフレーム名set1、set2と付け
コンボボックスにクリップアクション
onClipEvent (load) {
;
}
パラメーターのDataにset1、set2、
Change Handlerにjumpとつけて
フレームアクションに
function jump(theCombo) {
frameLabel = theCombo.getValue();
_root.gotoAndStop(frameLabel);
}
と追記したんですが飛びません(T^T)
ぱぴよんさんのcombo02も参考にしたんですが・・・
これで飛ぶと思ったんですが安易だったんでしょうか?
どう記述すればいいのか教えてください
Response 08
2005年03月06日 (日) 02時36分> 憲ちゃん 
「setDataProvider(配列名)」を使って読み込んだ場合は、元のアイテム(Labels,Data)の情報は
新しいものに入れ替わってしまいます。
お尋ねの件は外部テキストから「Labels」の値を読み込むということで、
「Data」の情報がありませんから、編集段階で入力した値はすべて空白に入れ替わります(^^;

したがって「Data」の値を利用する場合、これも同時に外部テキストから読み込まないといけません。
方法は・・・
外部テキストに、例えば、

 &txtLabel=子,丑,寅・・・・・亥&
 &txtData=set1,set2,set3・・・・set12&

このように「Labels」と「Data」に相当するものを「変数=値」の形式で記載しておきます。

Flashの1フレームのフレームアクションで・・・

 System.useCodepage = true;
 this.loadVariables("外部テキスト.txt");
 function jump(theCombo) {  ※ChageHandlerとの関連付け。「jump」という関数で定義
   frameLabel = theCombo.getValue();
   _root.gotoAndStop(frameLabel);
 }
 this.onData = function() {
   theLabel = txtLabel.split(",");←外部テキストtxtLabelの値を配列theLabelに各々格納
   theData = txtData.split(",");←外部テキストtxtDataの値を配列theDataに各々格納
   arrayItem = new Array();←配列arrayItemを定義(使えるよう作成)
   for (i = 0; i < theLabel.length; i++) { iを0から項目の数だけカウントアップ
     theItem = new Object();←theItemという名前のオブジェクトを作成
     theItem.label = theLabel[i];←そこの「label」に配列theLabelの要素を格納
     theItem.data = theData[i];←同じくそこの「data」に配列theDataの要素を格納
     arrayItem.push(theItem);←オブジェクトごと配列arrayItemに順に追加
   }
   theCombo.setDataProvider(arrayItem);←配列arrayItemをアイテムとしてtheComboに読込
 };
 this.stop();

「Objectオブジェクト」の概念は、ここで説明するだけの紙面はありませんので、
このように記載すれば、LabelsとDataを同時にComboBoxに読み込めるとだけ知っていただければ
十分かと思います(*^.^*)

※ご注意※
このBBSに記載しているスクリプトは、目で見て読みやすいように所々全角文字を使用しています。
このままここでコピー&ペーストされますと、スクリプトエラーになります。
Response 09
2005年03月06日 (日) 23時38分> いまちゃん 
遅い時間にレスをくださってありがとうございます!
できました!できましたよ憲ちゃん!!!
もう感激してできた瞬間に速攻でお礼を書きに来ました!
もう(T▽T)ウルルンもんです!この興奮が伝わりますか?(笑)
最後まで答えてくださってありがとうございました。
また困ったときは来ちゃうと思いますけどこれからもよろしくお願いします。
Response 10
2005年03月07日 (月) 09時43分> ぱぴよん 
おはようございます^^
いまちゃんさんできてよかったですね(*^-^*)
おめでとうございます♪♪d(⌒o⌒)b♪♪


>もう(T▽T)ウルルンもんです!この興奮が伝わりますか?(笑)

伝わりますますよ〜笑
私も苦労して達成したときなどはいまちゃんさんと同じ感じになります^^
(みなさんそうなのではないのでしょうか?)

本当によかったですね^^

このページの先頭へ