- ベストアンサー
ComboBoxについて
ComboBoxのセレクトした部分を変える方法はないでしょうか? dataに[0,1,2,3,4]、labelsに[1,2,3,4,5]としたComboBoxを用意し、それを選択するとdataを変数に記憶させておき、別ボタンで隣のフレームに移動させます。 再度このComboBoxのあるフレームに移動した場合、読込時に先ほど選択した位置に変える方法が見つからず困っています。 this.selected = dataの入った変数 などいろいろ試してみましたが無理でした。 FlashMX Professional2004 7.0.1 を使用しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 ラジオボタンでも、最後に押されたボタンを記憶して、ラジオボタンがステージに登場した時にそのボタンを選択済みにする、という発想は同じです。 ComboBox でいうところの selectedIndex にあたるものとして、selection というプロパティがあります。主にグループ内で選択されているラジオボタンへの参照を管理するプロパティで、どのボタンが選択されているかを知ることも、書き換えて指定のボタンを選択済みにすることもできます。 RadioButton コンポーネントには、違ったボタンが選択された時に発生するイベントはありません。その代わり、ボタンがクリックされた時に発生する click というイベントがあります。今回はこれを利用します。 click イベントを処理するには、普通のボタン等と同様に on を使う方法と、リスナーオブジェクトというオブジェクトを生成・登録し、イベントが発生した時に定義済みの関数を呼び出して処理させる方法があります。 on を使った方法は全てのボタンに設定しなければならず、ボタンが2つくらいならまだしも、3つも4つもある場合はメンテナンス上も非効率的です。少々難しいですが、ここでは、後者のリスナーオブジェクトを利用する方法をご紹介します。 ComboBox のリストや項目は、ComboBox のインスタンスが自分の中の項目などを管理していました。 ComboBox のインスタンスはステージ上に存在していて、目に見える実体のあるオブジェクトです。インスタンスにオブジェクトアクションを設定し、イベントを処理することが可能でした。 ラジオボタンは同じグループ名を持つ複数のボタンを1つのセットとし、セット内でただ1つのボタンだけを選択できる仕組みになっています。 複数のボタンを持つという点では ComboBox と似ています。しかし、RadioButton インスタンスは1つ1つが独立したオブジェクトです。グループ名とは各ボタンを管理する上で付けられた識別用の名前にすぎず、グループ名を持つ1つのインスタンスがステージに実在するわけではありません。 ステージに実体がないのではオブジェクトアクションが書けないため、ラジオボタングループに対し on でイベントを処理することができません。 ステージに実体を持たないインスタンスでイベントを処理する、つまり、on に代わるものとして用意されているのが、リスナーオブジェクトと呼ばれるものです。 汎用型である Object 型の変数を1つ作り、これを、イベントを処理したいインスタンスにリスナーオブジェクトとして登録します。リスナーオブジェクトには、イベントが起きた時に実行する関数を定義しておきます。 インスタンスでイベントが発生すると、登録されているリスナーオブジェクトに通知されます。リスナーオブジェクト側は通知を受け取ると、そのイベントに対応する関数を呼び出します。 同じくリスナーオブジェクトで処理できるインスタンスは他にもいろいろありますが、その中でもラジオボタングループでのイベント処理の原理は少々複雑で、ここでは説明し切れませんので、とりあえずスクリプトだけご紹介します。 詳しい原理はヘルプに書かれています。興味がおありでしたら調べてみてください。 次のようなスクリプトを、フレームに設定します。 //イベントを処理するオブジェクトの生成 radio_obj = new Object(); //ラジオボタングループの設定 //選択されたボタンへの参照を記録する radio_obj.click = function ( event_obj ) { _root.pressed_btn = event_obj.target.selection; }; //イベントを処理するオブジェクトを登録 seibetu1.addEventListener( "click" , radio_obj ); radio_obj というオブジェクトが、ラジオボタングループ seibetu1 のリスナーオブジェクトになります。グループ内で click イベントが発生すると、radio_obj に通知され、対応する関数が呼び出されます。 関数の中では、イベントの起きたインスタンス(今回の場合は seibetu1 ラジオボタングループ)の selection プロパティを見て、グループ内で選択されたボタンへの参照を取得し、_root 階層の pressed_btn という変数に記録しています。 先述の通り、ラジオボタングループはステージに実体がありませんから、seibetu1 というラジオボタングループとしては load イベントは発生しません。 ですが、グループに含まれているボタン1つ1つはステージに実体を持つインスタンスですので、それぞれで load イベントが発生します。 選択済みボタンを設定するには、グループ内のいずれかのラジオボタンの load イベントを借りる方法が、一番簡単です。 次のようなスクリプトを、グループ内のラジオボタンのどれか1つに設定します。 //前回選択されたボタンを選択済みにする onClipEvent(load) { //選択済みボタンを保持する変数がない場合:新規に作成 //初期値はデフォルトで選択されているボタン if( _root.pressed_btn == undefined ) { _root.pressed_btn = _root.seibetu1.selection; } //前回押されたボタンを選択済みにする _root.seibetu1.selection = _root.pressed_btn; } ラジオボタンは、いずれかのボタンがデフォルトで選択済みになっている場合も多いと思います。RadioButton インスタンスの selected というパラメータを true にすると、そのボタンがデフォルトで選択済みになります。上記のスクリプトでは、selected が true になっているボタンへの参照が pressed_btn 変数の初期値になります。 デフォルトでどのボタンも選択されていない状態にすると、変数の初期値も undefined になり、何も選択されていない状態でスタートします。 他にも方法はあるかと思いますが、こんなところでいかがでしょうか。
その他の回答 (1)
- DPE
- ベストアンサー率85% (666/776)
ComboBox で利用できる要素には、リストに表示される項目名(ラベル)・各項目に設定されている情報(データ)・何番目の項目であるかの情報(インデックス)の3つがあります。 このうちのインデックスを使ってみてはいかがでしょう。 何番目の項目が選択されているかは、ComboBox クラスが持っている selectedIndex プロパティに保存されています。また、このプロパティを書き換えると、指定の項目を選択済みとして設定することができます。 前回、何番目の項目が選択されていたのかを保持する変数を、1つ用意します。この変数を ComboBox のインスタンスに設定するといろいろと面倒ですので、_root 階層に用意します。 ComboBox には、今選択されているものと違う項目が選択された時に発生する change というイベントがあります。change イベントが発生するたびに selectedIndex プロパティを参照し、何番目の項目が選択されたかの情報を変数に記録します。 この変数の中身を selectedIndex に代入すると、最終的に選択された項目をデフォルトの選択済み項目に指定できます。 この処理は、ComboBox がステージに登場した、その時1回実行すれば充分です。 ComboBox はコンポーネントですが、コンポーネントとはパラメータを持つ”ムービークリップ”です。ムービークリップでもある以上、ムービークリップで利用できるイベント等は全て利用可能です。 ムービークリップには、インスタンスがステージに登場した時1度だけ発生する load イベントがあります。選択済み項目を設定する処理には、このイベントを利用します。 スクリプトにしますと、大体、次のようになります。このスクリプトは ComboBox のインスタンスに設定します。 (↓このスクリプトをコピーして利用する場合は、各行頭の全角のスペースを、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります) //選択済みにする項目の設定 onClipEvent(load) { //最初の1回:選択済み項目を保持する変数が存在しない場合 if( _root.sel_index == undefined ) { //変数を作成 _root.sel_index = 0; } //選択済み項目を設定 this.selectedIndex = _root.sel_index; } //変更された場合、選択済みにする項目を更新する on(change) { _root.sel_index = this.selectedIndex; } 存在しない変数を参照・評価しようとすると、undefined という値が返されます。 何番目の項目が選択されたかを保持する変数(上記のスクリプトでは sel_index )は、ムービーが再生された最初の1回目の時点では、まだ存在していません。 そこで、undefined を利用して、ムービーの再生中、本当に最初の1度だけ、0に初期化する処理を入れます。undefined のまま進んでも、最初は初期配置である0番目の項目(最初の項目)が自動的に表示されますが、ここでは明示的に最初の項目を表示するようにしています。デフォルトで表示したい項目が0番目ではない場合、この初期化は特に大切です。 load イベントは、他のフレームに行ってインスタンスがステージから消え、また元のフレームに戻って再登場した場合は、この時にもう1度発生します。 従って、load イベントが発生するたびに selectedIndex プロパティを書き換えるようにすると、何度フレーム間を往復しても、必ず前回選択された項目を選択済みに設定できるという仕組みが出来上がります。 長くなってすみませんでした。 不明な点がありましたら、補足してください。
補足
DPE様、大変わかりやすい説明でうまくやることが出来ました。ありがとうございます。 ComboBox の件はうまくいったのですが、便乗で RadioButton についてお聞きしたいことがあります。 現在、label に「男」と「女」を書いた2つの RadioButton があり、両方の groupName を seibetu1 としています。 ComboBox と同様にどちらか選択した後にその選択場所を記憶させて、読込時に・印を付ける方法がわかりません。
お礼
再度、解りやすいご説明有難う御座います。 おかげさまでうまくいく事が出来ました。