アプリ版:「スタンプのみでお礼する」機能のリリースについて

コンボボックスのlabelsで太郎、次郎、三郎と3つの項目を用意しました。
このいずれか1つの項目を選択したらあらかじめ用意してある三つのテキスト入力欄(身長、体重、足の大きさ)へ数値が入力されるようにしたいんですが、どのようにすればよいのでしょうか?
dataの値の設定方法、コンボボックスへのASの記述方法などを教えて下さい。
よろしくお願いします<(_ _)>

A 回答 (2件)

お使いの Flash のバージョンは何でしょうか?




ComboBox コンポーネントは、現在最新版である Flash 8 の2世代前にあたる Flash MX から使えるようになりました。
しかし、Flash MX の次に出た Flash MX 2004 からは ActionScript 2.0 という新しい規格のスクリプトが登場したため、MX 2004 および Flash 8 には ActionScript 2.0 で作り直されたコンポーネントが入っています。
MX と MX 2004 / Flash 8 の ComboBox コンポーネントは名前は同じですが、制御するスクリプトが異なり、互換性もありません。
( MX 2004 と Flash 8 の ComboBox コンポーネントは同じです)

この回答への補足

回答ありがとうございます。
慌てていて当方の環境を書くのをすっかり忘れてしまいました(汗

私の使っているFlashですが、MX2004(FLASH 7)です。
↑の質問を投稿した後も色々と調べてみたんですが、未だ見つかりません(; ;)
宜しくお願いします<(_ _)>

補足日時:2006/02/01 21:14
    • good
    • 0
この回答へのお礼

大変分かり易い解説つきのご回答助かりました。
↑で用意して頂いたスクリプト、私の頭の中で思い描いていたとおりに動作致しました。
これで思っていたとおりの物が作れそうです(*^_^*)
ありがとうございました~

お礼日時:2006/02/02 14:36

#1です。




ComboBox コンポーネントには label と data というパラメータがあります。
data は表示されませんが、選択された項目をもとに何かをするための情報を設定しておくことで、幅広い使い方ができるようになっています。
ただし、data には1項目につき1つの情報しか設定できません。

今回の場合は1人につき身長・体重・足の大きさという3つの情報があるので、data パラメータでは対応しきれません。
そこで、ComboBox コンポーネントが持っている data パラメータではなく、別の配列変数を用意してそれぞれの人物の情報を管理することにします。
項目が何か選択された時には、選択された項目に該当する配列変数を見て情報を取得し、これをテキストフィールドに表示すればいいわけです。

-----------------------------------------------------------

配列変数は名前が同じで管理番号だけが違う、複数の変数が集まったものです。
ActionScript の配列変数は、各変数内に更に仕切りを作って、効率よく情報を管理できるようになっています。
例えば、

 size_data = new Array();
 size_data =
 [
  { label : "太郎" , tall : 155 , weight : 50 , foot : 25 } ,
  { label : "次郎" , tall : 180 , weight : 75 , foot : 27 } ,
  { label : "三郎" , tall : 165 , weight : 60 , foot : 26 }
 ];

という配列変数を作ったとしますと、1番上(配列変数は0から始まるので、0番目)の変数には

 size_data[ 0 ].label → "太郎"
 size_data[ 0 ].tall  → 155
 size_data[ 0 ].weight → 50
 size_data[ 0 ].foot  → 25

と、4つの情報が格納されます。


ところで、ComboBox のパラメータには label と data というパラメータがあると書きましたが。
例えば、「パラメータ」タブで、labels に名前、data に身長(上記の配列で” tall ”と書かれている部分の情報)を設定したとすると、ComboBox の内部では

 { label : "太郎" , data : 155 } ,
 { label : "次郎" , data : 180 } ,
 { label : "三郎" , data : 165 }

このような形で管理されます。
このうちの label に書かれている部分がリストに表示され、必要に応じて label と data を別々に取り出せるようになっています。

ComboBox に用意されているこの配列変数には仕切りが2つしかなく、そのうちの1つは表示する項目名用として塞がっていますから、身長・体重・足の大きさのいずれか1つしか管理できません。
今回はラベルと合わせて4つの情報を管理したいので、ComboBox で管理している配列変数を、自分で用意した配列変数に取り替えることにします。
難しい話のようですが、そのための機能が ComboBox に組み込まれていて簡単です。
自分で用意した配列変数に取り替えても、ComboBox が持っている他のプロパティやメソッドを利用して、配列変数の中のどれが選択されているか、その内容は何かなどを調べることもできます。

-----------------------------------------------------------

MX 2004 のコンポーネントには、ムービークリップやボタンと同様にイベントという考え方があり、コンポーネントに何かが起きた時にスクリプトを実行させることができます。
イベントの処理には、リスナーオブジェクトというオブジェクトを登録するスタイルと、普通のムービークリップやボタンの制御でおなじみの on アクションを使う方法があります。
ここでは on アクションを使う方法をご紹介します。

コンポーネントは、解説書や解説サイトではあまり見かけない、独特のイベントを持っています。
ComboBox にも、change という、ムービークリップにはない変わったイベントがあります。
今回は、このchange イベントを使います。


ステージに ComboBox のインスタンス” combo ”と、ダイナミックテキストにしたテキストフィールド” tall ”” weight ”” foot ”があるとします。
理由は後で説明しますが、テキストフィールドのインスタンス名は、配列変数で使う仕切りの名前とおなじものを付けてください。

ComboBox で何か項目が選択された時に、該当する情報をテキストフィールドに表示するスクリプトは、大体、次のようになります。
このスクリプトは ComboBox のインスタンス” combo ”に設定してください。

(↓各行頭に全角のスペースが入っています。コピーする際はご注意ください)


 onClipEvent(load)
 {
  //表示データを管理する配列変数
  size_data = new Array();
  size_data =
  [
   { label : "太郎" , tall : 155 , weight : 50 , foot : 25 } ,
   { label : "次郎" , tall : 180 , weight : 75 , foot : 27 } ,
   { label : "三郎" , tall : 165 , weight : 60 , foot : 26 }
  ];

  //コンボボックスにデータをセット
  this.dataProvider = size_data;

  //選択されている項目を”なし”に設定
  this.selectedIndex = undefined;
 }


 on(change)
 {
  //情報を取得し、テキストフィールドに出力
  for( name in this.selectedItem )
  {
   _root[ name ].text = this.selectedItem[ name ];
  }
 }


コンポーネントとは、編集可能なパラメータを持っている”ムービークリップ”です。
ですから、ムービークリップで利用できるイベントは原則的には全て利用できます。
(ただし、使うとコンポーネントの動作に支障をきたすイベントもあります。press 等のボタンイベントや mouseDown ・ keyDown 等の入力デバイスに関係するイベントは使わない方がいいでしょう)
load はムービークリップがステージに登場した、その時1度だけ発生します。
この特徴を利用して、様々な初期設定を行います。

まず、ComboBox で管理する配列変数を作ります。
この配列変数には、label ・ tall ・ weight ・ foot という4つの仕切りを作っておきます。
label という仕切りで管理されるデータは、ComboBox に表示される項目名になります。これ以外の名前は好きな名前を付けて構いませんが、都合上、テキストフィールドのインスタンス名と同じ名前にしてください。

この配列変数( size_data )を、ComboBox で管理するデータとして登録します。
その処理をしているのが、

 this.dataProvider = size_data;

の部分です。
dataProvider に登録しておくと、それだけで配列変数の中の label と書かれた部分をリスト内に項目名として表示してくれるだけでなく、ComboBox の持つ機能を利用して size_data の内容を取り出せるようになります。
dataProvider を利用する場合は、「パラメータ」タブにある labels のパラメータは入力しなくても構いません。


今回は ComboBox が持っている change イベントを使います。
change はその名の通り、正確には、今選ばれているものと違う項目が選ばれた時に発生します。
ComboBox では、今選ばれている項目が selectedIndex というプロパティに記録されています。この値が変わった時に、change というイベントを発生させて知らせてくれるのです。

ところが、change イベントには1つだけ盲点があります。
selectedIndex プロパティの初期値は0で、0番目の項目、今回の例で言うと”太郎”が初めから選ばれているものと見なされています。
この状態でリストから”太郎”を選んでも、selectedIndex の値が0で変わらないため change イベントが発生せず、従って on(change) 内に書かれている、情報を取得して表示するスクリプトも実行されません。
画面に太郎の情報を最初から表示しておくなら話は別ですが、最初は何も表示しないのでしたら、これは大問題です。

そこで、最初は何も選ばれていないとの意味で、selectedIndex プロパティには予め別の値( undefined )を入れておきます。
すると、最初の1回目でリストから”太郎”が選ばれたとしても、selectedIndex プロパティには0が入って値が変わり、change イベントが発生してテキストフィールドへの出力も行われるようになります。
このあたりの事情は、

 this.selectedIndex = undefined;

の部分をコメントにしてパブリッシュし、最初に”太郎”を選んでみると分かりやすいかと思います。

******************************************

change イベントが発生した、つまり別の項目が選ばれた時に、該当する情報を取得してテキストフィールドに表示します。

ComboBox の持っている selectedItem プロパティには、選択された項目そのものを指す情報(参照といいます)が格納されています。
例えば”次郎”が選ばれているのなら、selectedItem は size_data[ 1 ] と同じ意味で使えます。


配列変数 size_data の各要素には、4つの仕切りが作られていました。
このうちの label はリストに表示する項目名のことなのでどうでもいいですが、残る3つをテキストフィールドに出力します。
このカラクリのタネが、for in という制御文と、配列変数で使っている仕切りの名前と同じテキストフィールドのインスタンス名です。

まず、テキストフィールドに表示する方法ですが。
ダイナミックテキストかテキスト入力したテキストフィールドには、表示内容を管理する text というプロパティがあります。
これを書き換えると、表示内容を直接更新することができます。

 インスタンス名.text = "・・・";

というように使います。

for in は複数の要素を持つものをある規則に従って次々と参照する、ちょっと変わったループです。
詳しくは省略しますが、例えば

 for( name in size_data[ 1 ] )

とすると、name には label → tall → weight → foot 、要するに size_data[ 1 ] にある仕切りの名前が次々に代入されます。
これを利用すると、size_data[ 1 ] にある全ての情報をループで取り出すことができます。

今回は size_data 内の特定の要素ではなくて、ComboBox で選ばれている項目に該当する要素の情報を取り出したいのです。
選ばれている項目は selectedItem というプロパティに入っていますから、これを for in でまとめて取り出します。
せっかくですから、ループに用いられる name の値も活用してテキストフィールドに出力する方が効率的です。
テキストフィールドの名前を配列変数の仕切りと同じにする理由は、ここにあります。
実際には label の値も取り出されていますが、label という名前のテキストフィールドは存在しないため、この値は無視されます。


ポイントは、複数の情報を ComboBox と結びつける方法と、ComboBoxから様々な情報を引き出す処理です。
ComboBox から情報を取得する方法は、Flash のテクニカルノートにサンプルがあります。
ここでは説明できなかったリスナーオブジェクトを使った例で書き方は少々違いますが、同じく selectedItem で選択されている項目を見て、その中の label に書かれている情報を取り出しています。
FLA ファイルも入手できますので、よろしければご参照ください。

 ・ComboBox コンポーネントを使用したサンプル
  http://www.macromedia.com/jp/support/flash/ts/do …


さしあたって、テキストフィールドはステージ( _root )に、ComboBox で使う配列変数は combo 自身に用意した場合のスクリプトをご紹介しました。
テキストフィールドや配列変数を置く階層が異なる場合は、ターゲットパスの誤りにご注意ください。

長くなってすみませんでした。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!