• 締切済み

2つのコンボボックスを連動させたいのですが

DPEの回答

  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

連動させるデータの規模にもよって方法も違いますが、スクリプトだけでできる小規模の連動の例をご紹介します。 この作例はほんの一例です。ご希望の作品に合うように、いろいろ改良してみてください。 いきなり厳しいことを言うようですけれど、コンポーネントの制御は、Flash と ActionScript の基礎を一通り理解していることが前提になります。 ここでは全くのゼロからの解説はできませんので、Flash の操作・スクリプトの書き方・文法と用語・イベントの考え方などの基本につきましては、市販の解説書か解説サイト・ヘルプをご参考になさってください。 ------------------------------------------------------------ ComboBox コンポーネントを配置しても、当然、中身は空っぽです。 表示する内容を設定するには、「パラメータ」パネルで編集する方法とスクリプトで設定する方法があります。 今回はスクリプトで設定します。 ComboBox ・ List ・ DataGrid などのリストタイプのコンポーネントは、配列変数と密接な関係があります。 配列変数とは、同じ名前で管理番号だけが違う、複数の変数の集まりです。 管理番号は 0 からの通し番号で付くので、一覧表の中から○番目の項目を選ぶ・・・など、表を処理するのに向いているというわけです。 ComboBox に表示する内容をスクリプトで設定するには、addItem メソッドで1つずつ項目を作る方法と、dataProvider というプロパティに配列変数を渡す方法があります。 今回は dataProvider を使います。 「 dataProvider に配列変数を渡すと ComboBox の表示内容を設定できる」のなら、Aで選ばれた項目に対応する配列変数を覚えておいて、これをBの dataProvider に渡すことでAとBを連動させることができるといえます。 とすると、まず、Aで扱うデータを格納する配列変数が必要です。 更に、Bで扱うデータの配列変数が、Aの項目だけ必要になります。 データの多さにげっそりしてしまいますが、ここは一つ我慢して、今回は全部スクリプトでデータを作ります。 始めに”小規模の”とお断りしたのは、こういう理由のためです。 ------------------------------------------------------------ まずは作ってみることにしましょう。 「コンポーネント」パネル(表示されていない時は「ウィンドウ」メニュー→「コンポーネント」)の” User Interface ”カテゴリーにある ComboBox のシンボルを2回、ステージにドラッグします。 これで、ステージに ComboBox のインスタンスが2つ作られます。 2つのうち一方を選択した状態で、「プロパティ」パネルを見てください。 左上の方に” <インスタンス名> ”と書かれた項目があります。 ここに、何か名前を入力してください。この名前はスクリプトで使いますので、半角の英数字と” _ ”だけで付けます。 もう片方のインスタンスにも、同様に名前を付けてください。 ここでは仮に、” main ”と” sub ”と付けたとします。 以上で準備は完了です。 次はスクリプトを書きます。 ******************************** 2つの ComboBox のインスタンス” main ”と” sub ”が、ステージにあるとします。 ” main ”で選択された項目に応じて” sub ”の項目を変化させるスクリプトは、次のようになります。 このスクリプトは、2つのインスタンスがあるタイムラインのフレームに設定してください。 この例では、メインのタイムラインのフレーム1に書きます。 なお、スクリプトの各行頭に全角のスペースが入っています。 このままコピーするとエラーになりますので、全て半角のスペースかタブに置き換えてください。 「アクション」パネルにある検索・置換機能を使うと簡単です。  ////////////////////////////////////////////////////////  //subコンボボックスで扱うデータ  ////////////////////////////////////////////////////////  //「鮮魚・魚卵加工品」のリスト  fish = new Array();  fish =  [   { label : "毛がにボイル" , price : 10000 } ,   { label : "活ほたて" , price : 5000 } ,   { label : "活車えび" , price : 3000 } ,   { label : "明太子詰め合わせ" , price : 3000 } ,   { label : "醤油漬いくら" , price : 5000 }  ];  //「ビール」のリスト  beer = new Array();  beer =  [   { label : "一番搾り" , price : 3000 } ,   { label : "スーパードライ" , price : 3000 } ,   { label : "黒ラベル" , price : 3000 } ,   { label : "ブラウマイスター" , price : 5000 } ,   { label : "熟撰" , price : 5000 } ,   { label : "ヱビスビール" , price : 5000 }  ];  //「果物」のリスト  fruit = new Array();  fruit =  [   { label : "高級マスクメロン" , price : 10000 } ,   { label : "白鳳桃" , price : 5000 } ,   { label : "マスカット" , price : 3000 } ,   { label : "ハウスみかん" , price : 3000 }  ];  ////////////////////////////////////////////////////////  //mainコンボボックスで扱うデータ  ////////////////////////////////////////////////////////  main_item = new Array();  main_item =  [   { label : "鮮魚・魚卵加工品" , data_array : fish } ,   { label : "ビール" , data_array : beer } ,   { label : "果物" , data_array : fruit }  ];  ////////////////////////////////////////////////////////  //各コンボボックスのセットアップ  ////////////////////////////////////////////////////////  //mainコンボボックスにデータを表示し、  //最初に選ばれている項目を”なし”にする  main.dataProvider = main_item;  main.selectedIndex = undefined;  //リスナーの作成とmainコンボボックスが選択された時の処理を定義  main_listener = new Object();  main_listener.change = function( info:Object )  {   var array_ref;   //選択された項目に設定されているdata_arrayの情報を取得   //data_arrayとは、subコンボボックスの項目にする配列変数のこと   array_ref = info.target.selectedItem.data_array;   //取得した配列変数をsubコンボボックスの項目に設定する   sub.dataProvider = array_ref;   //subコンボボックスの選択されている項目をリセット   sub.selectedIndex = undefined;  };  //mainコンボボックスのイベントリスナーを登録  main.addEventListener( "change" , main_listener );  /*******************************************/  //subコンボボックスに最初のデータを表示し、  //最初に選ばれている項目を”なし”にする  sub.dataProvider = fish;  sub.selectedIndex = undefined; 紙面の都合上、スクリプトの1つ1つを詳しく解説することはできません。 何をするスクリプトかは、スクリプト内のコメントをご参考になさってください。 ******************************** ActionScript の配列変数は、中に仕切りを作って、同じ管理番号の変数でも更に細かくデータを管理できるようになっています。 仕切りで区切った部分を”フィールド”といいます。 フィールドの名前は、文法の範囲内であれば好きな名前を付けて構いません。 ただし、ComboBox の場合は1つだけ、フィールドの名前が決まっているところがあります。 dataProvider に配列変数を渡した時は、” label ”という名前を持つフィールドの値が表示する項目名に採用され、これ以外のフィールドの値は表示されなくなります。 ” label ”フィールドがない場合は配列変数に含まれる全てのフィールドが表示されてしまいますので、ご注意ください。 なお、他のフィールドの値は表示されないだけで、データとしては残っています。 ですから、”項目に設定されているデータ”として、いつでも取り出して使うことができます。 ******************************** 一般にコンボボックスは、単に項目が表示されるだけでなく、項目を選んだ時に何かを実行する機能を持っているものです。 「何をするか」はものによって異なり、そのために必要な情報も違ってきます。 今回の件ですと、” main ”の機能は、項目を選んだ時に” sub ”の項目を変化させることです。 つまり、そのために各項目に持っておくべきデータとは” sub ”に渡す配列変数です。 上記のスクリプトでは、” main ”で扱うデータの中に、項目名の他にもう1つフィールド” data_array ”を用意して、” sub ”に表示するデータである配列変数を格納しています。 現在どの項目が選ばれているかを調べたり、選ばれている項目に設定されているデータを取り出す方法は、ComboBox コンポーネントの機能として提供されています。 この機能を利用して” main ”で選択されている項目を取得し、更に、そこに設定されている data_array の情報を取り出します。 こうして取り出した情報を” sub ”の dataProvider に渡せば、2つのコンボボックスを連動させることができます。 ******************************** 上記の作例ですと、” main ”の項目を選んだ時に” sub ”の内容が変化しますが、” sub ”の項目を選んだところで何も起きません。 ComboBox は何も指示しなければ、ただ項目を表示しているだけのものにすぎないのです。 ” sub ”を選んだ時に何か仕事をさせるには、そのためのスクリプトも必要です。 例えば、先のスクリプトに  //リスナーの作成とsubコンボボックスが選択された時の処理を定義  sub_listener = new Object();  sub_listener.change = function( info:Object )  {   var item;   //選択された項目に設定されている情報を全て取得   item = info.target.selectedItem;   //取得した情報を「出力」パネルに表示   trace( "品名:" + item.label );   trace( "価格:" + item.price + "円\n" );  };  //subコンボボックスのイベントリスナーを登録  sub.addEventListener( "change" , sub_listener ); ↑このようなスクリプトを追加して、「ムービープレビュー」で確認してみてください。 ” sub ”の項目を選ぶたびに各項目に設定されている情報を取得して、「出力」パネルに  品名:毛がにボイル  価格:10000円 というように表示されるようになります。 trace アクションは「ムービープレビュー」の時だけ使える、いわば開発中に使う確認のためのアクションです。 実際にホームページに掲載する場合などは、別の方法で表示を作成してください。 ------------------------------------------------------------ ActionScript では、XML という言語で書かれたデータを読み込むことができます。 今回はスクリプトでデータを作れる範囲の小規模のコンボボックスでしたが、XML でデータを取得し、解析して配列変数を動的に作る設計にすると、もっと規模の大きなデータや複雑なデータを扱う作品も作れます。 XML はデータベースとやりとりするのに向いていることから、データベースと連動した商業用の Flash は実際にあります。 また、「データバインディング」という機能を利用して連動させる方法もあります。 Flash や ActionScript に慣れてきたら、研究してみてください。 長くなってすみませんでした。

Brugnon
質問者

補足

DPEさん 細かいところまで丁寧に教えて下さりありがとうございます。 コンポーネントについて説明されている書籍が見つからなくて困っていたので、大変助かりました。 また質問で申し訳ないのですが、二つのコンボボックスで表示されている値を足したものを別のコンボボックスに表示させるのは可能でしょうか? 例えば、Aのコンボボックスで1、Bのコンボボックスでは2と表示させて、別のコンボボックスCにはAとBの合計3を表示することは出来るのでしょうか? AとBで表示されている値を取得して二つの合計分だけMCを動かしてという依頼が出たのですが、まだまだ未熟者なのでそれ自体が可能かどうかが分かりません。 ややこしいとは思いますが、どうかご教授下さいませ。 宜しくお願いいたします。

関連するQ&A

  • コンボボックスの連動

    コンボボックスの連動を実現したいです。 コンボボックスがAとBの2個あります。 Aにメーカーをセット 例) 1 エプソン 2 キャノン 3 HP Bに機種名をセット 例)Aでエプソンを選択したとき 1 EPシリーズ 2 PMシリーズ 例)Aでキャノンを選択したとき 1 PIXUSシリーズ 2 Sateraシリーズ コンボボックスAの選択内容により コンボボックスBの内容を変更したいです。 各A,Bの選択した値(1、2)も取得したいです。 よろしくお願いします。

  • コンボボックスを連動させる仕組みの正式名称は?

    コンボボックスAとBの二つがあります。 Aで選択された項目によって、Bの選択できる内容が変化する、というよくあるコンボボックスの仕組みですが。。 こういった仕組みの正式名称などはあるでしょうか?(Accessでは○○、Javaでは××という、など。。) 特に.NETにおける正式名称などがあったら、教えて頂けると嬉しいです。 ご助言よろしくお願い致します。

  • accessのコンボボックスを連動させた結果の反映

    access2002を使用しています。必要に駆られて勉強を始めましたが行き詰ってます。 初歩的な質問ですが宜しくお願いします。 AとBのコンボボックスでAで特定値を入れたときにその結果を再クエリでBの選択肢を絞り込むコンボボックスを作成しています。 http://oshiete1.goo.ne.jp/qa1413361.html の返答を参考にその通りの物を作ってみたのですが、(以下) 反映されたデータの入力テーブルの氏名入力にも、所属部が入力されてしまいます。Bのコンボボックスで選択した氏名を〔反映されたデータの入力〕テーブルの〔氏名入力〕に反映させたい場合はどのような変更を加えれば良いのでしょうか? ご指導頂ければ幸いです。

  • Excelマクロのコンボボックスについて

    初めてマクロを扱います。 マクロに詳しい方、コードをご教授ください。 Excelマクロを使い下記の機能をシートに盛り込みたいと考えております。 【実現したいこと】 ・シート上にコンボボックスを作成し、コンボボックスで選択した項目で絞り込めるようにする。 ・コンボボックスに格納される項目は、A列の重複を除外し、昇順で並べ替えたもの。 ・またコンボボックスに格納する項目は日々レコード追加されるため、コンボボックスの中身にも随時反映するようにしたい。 ・コンボボックスには「全て表示」というアイテムを追加し、「全て表示」を選択すると、フィルターが解除される。 わかりにくいかもしれませんが上記のことを実現したいと考えております。 どうかお知恵をお貸しください!! よろしくお願いします!!

  • あるコンボボックスを選択するともう一方のコンボボックスが自動的に決まる方法

    二つのコンボボックスがあります。 1つのコンボボックスをcb1、もう一方のコンボボックスをcb2とします。cb1の中にはA、B、Cという項目があります。 質問の内容は、例えばcb1のAを選択するとcb2の項目が自動でa、b、cになっている、cb1のBを選択するとcb2の項目が自動でd、e、fになっている、ということなのです。 こんな感じに自動的に状態が変化することは可能なのでしょうか?宜しくお願いします。

    • ベストアンサー
    • Java
  • コンボボックス

    コンボボックスから選択した内容によってそれに関するコンボボックスの内容を変えたいと思っています。 例えば コンボボックスA 書類1  分類a 書類2  分類a 書類3  分類b 書類4  分類c コンボボックスB 提出先1  分類a 提出先2  分類b 提出先3  分類b 提出先4  分類c と言う風になっているのですが、 コンボボックスAの書類1を選択したらコンボボックスB と共通の分類の提出先名がコンボボックスに表示したいのです。 書類3を選択すると、コンボボックスBには提出先2、提出先3が表示されるといった感じです。 ACCESS2000を使用しています。 よろしくお願いします。

  • Access2003コンボボックスについて

    Access2003の勉強を始めたばかりの初心者です。 コンボボックスについて初歩的な事かもしれませんが、お教え下さい。 他のコンボボックスと連動するコンボボックスを作りたいと思っております。 具体的には、A・B・Cと3つのコンボボックスを作り、Aがブランクの状態ならB・Cブランク、Aに値が入ったらそれに伴った絞り込み結果をB・Cへ。 Bに値が入った場合は、その結果をCへ。 と言う様な処理を考えています。 用途はAに都道府県Bに市区町村Cに個人名を表示する予定です。 AからB・Cの連動は出来たのですが、あの値を反映したBからCへの連動処理ができません。 どなたかご存知方いらっしゃいましたら、ご教授お願い致します。

  • vb6のコンボボックスの操作について

    おはようございます。 vb6+MDBの環境下で、コンボボックスについて質問です。 マスタとなるテーブルA(都道府県など)と、一般的(?)なデータを日々貯めていくテーブルBがあり、 Bに、Aのキーとなる値が保存されています。 テーブルデータBの表示・更新画面を作っているのですが、 テーブルAの内容を画面上のコンボボックスに選択項目としてADDして表示するところまでは出来たのですが、以下のことを実現するには、コンボボックスにどういう記述で実現するのかわかりません。 1.テーブルBに持っているAの都道府県コードに該当する項目を、Bのデータ選択時に表示したい。 【テーブルA】 Aのキーコード,都道府県名 【テーブルB】 Bのキーコード,Aのキーコード,住所… このような場合、イベント時にコンボボックスをどのように処理するようにソースを書けば実現できますか?

  • ユーザーフォームのコンボボックス

    エクセルのユーザーフォームでの質問です。 コンボボックスの項目についてsheet2のB2~B10を選択したいのですが、このユーザーフォームはsheet1で使うもので、プロパティのrowsource欄にセルを選択できません(やり方が分かりません)。 どう入力したら別シートのセルをコンボボックスに反映出来るのでしょうか??

  • コンボボックスで新規登録する場合

    こんにちはアクセス初心者です。 コンボボックスの扱いについて行き詰っています。 説明が下手ですがどうぞよろしくおねがいします フォームAで コンボAとコンボBの 2つのコンボボックスを連動しています コンボAで選んだ発注者名を選択して詳細項目を表示し、 その担当者をコンボBで絞込み 担当者の詳細情報を表示しています コンボAに項目がない場合、 別ウィンドウで入力フォームが開き 新規登録後、その値が即座に反映され、 コンボBにはその抽出された値が表示され、 更にコンボBに項目が無い場合も同様に 登録作業をしたいのですが どういう方法が一番いいのでしょうか? 一番の理想としては コンボAを選択すると A社 B社 C社 新規登録 というようなリストが表示され 新規登録を選択すると 別ウィンドウで登録フォーム開き 複数項目を入力、OKを押すとその内容が フォームAに反映され コンボBの選択へ。 コンボBには 田中 佐藤 新規登録 と表示されている状態が理想です コンボAで顧客コードを選択すると 他の内容を下記のように VBAでフォーム上のテキストボックスに反映させています Private Sub コンボA_AfterUpdate() Me!担当者名コンボ.Requery '内容反映 Me.〒 = Me.顧客名コンボ.Column(2) Me.現住所 = Me.顧客名コンボ.Column(3) Me.電話番号 = Me.顧客名コンボ.Column(4) コンボA SELECT 顧客マスタ.顧客コード, 顧客マスタ.顧客名, 顧客マスタ.〒, 顧客マスタ.現住所, 顧客マスタ.電話番号 FROM 顧客マスタ ORDER BY 顧客マスタ.顧客コード; コンボB SELECT 担当者マスタ.担当者コード, 担当者マスタ.担当者名, 担当者マスタ.携帯番号, 担当者マスタ.顧客コード FROM 担当者マスタ WHERE (((担当者マスタ.顧客コード)=[forms]![フォームA]![コンボA])) ORDER BY 担当者マスタ.担当者コード; 別ボタンで新規登録をつくり リストに無い場合はフォームを表示させ テーブルに保存させるという方法も試しましたが デザイン上の問題があって とても小さなスペースしかとれず、 コマンドボタンをおくスペースもとるのが難しい感じなので できればコンボボックスだけで解決したいのですが。。 どなかた教えていただけると助かります どうぞよろしくおねがいいたします