- OpenLaszlo紹介
- プログラム構造関連
- スクリプト
- Javascript基礎
- 基礎知識
- ビュー<view>
- レイアウト
- 動かす
- 入力デバイス
- 文字
- 数値
- 日付
- オブジェクト指向
- 標準コンポーネント
- データの扱い
- データ操作(基礎)
- 応用編
–
コンボボックスは<combobox>と<datacombobox>の2種類あります。
| <combobox> | <textlistitem>を使って<combobox>タグ内に設定します。全アイテムを一気に即時生成するのでアプリ初期起動時に負荷がかかることがありますが、実行中は速くなります。 |
|---|---|
| <datacombobox> | データセットに設定します。アイテムは必要時に生成されるのでアプリ初期起動が速くなりますが、実行中に負荷がかかることがあります。 |
両者は良く似ていますが、全く別物と思ってOKです。使える属性、メソッド、イベント、見た目の挙動に違いがあります。どちらを選ぶかは使いたい属性やメソッドのあるほう、となります(^^;)
| <combobox> | <datacombobox> | |
|---|---|---|
| attachoffset | 有 | - |
| autoscrollbar | 有 | - |
| bordersize | 有 | - |
| dataoption | 有 | - |
| defaultselection | 有 | - |
| defaulttext | 有 | 有 |
| editable | 有 | - |
| ismenu | - | 有 |
| isopen | 有 | 有 |
| itemclassname | 有 | 有 |
| itemdatapath | - | 有 |
| listattach | - | 有 |
| listwidth | - | 有 |
| menuclassname | - | 有 |
| min_width | 有 | - |
| selected | 有 | 有 |
| selectfirst | - | 有 |
| shownitems | 有 | 有 |
| spacing | 有 | - |
| statictext | - | 有 |
| textdatapath | - | 有 |
| text_width | 有 | - |
| text_x | 有 | - |
| text_y | 有 | - |
| value | 有 | 有 |
| valuedatapath | - | 有 |
| <combobox> | <datacombobox> | |
|---|---|---|
| addItem | 有 | - |
| clearSelection | 有 | - |
| getItem | 有 | - |
| getItemAt | 有 | - |
| getItemIndex | - | 有 |
| getSelection | 有 | - |
| getText | 有 | 有 |
| getValue | 有 | 有 |
| removeItem | 有 | - |
| removeItemAt | 有 | - |
| select | 有 | - |
| selectItem | 有 | 有 |
| selectItemAt | 有 | 有 |
| setChanged | - | 有 |
| setDefaultSelection | 有 | - |
| setItemclassname | 有 | - |
| setOpen | 有 | 有 |
| setText | 有 | - |
| setValue | - | 有 |
| setWidth | 有 | - |
| toggle | 有 | 有 |
| <combobox> | <datacombobox> | |
|---|---|---|
| oncomboblur | - | 有 |
| oncombofocus | - | 有 |
| ondefaultselection | 有 | - |
| onselect | 有 | 有 |
| onselected | - | 有 |
| onisopen | - | 有 |
<datacombobox>と<combobox>は文字列の縦位置が違います。<datacombobox>のほうが若干上寄りなのでthis._text.setAttribute('y',3)で調整します。
※<datacombobox>のソースを見ると _textビュー のy属性が0だったので、3にしてみたらうまくいっただけです。
下記サンプルは、左が<datacombobox>、右が<combobox>、です。
<?xml version="1.0" encoding="UTF-8"?> <canvas proxied="false" bgcolor="0xeeeeee"> <dataset name="ds" > <item value="30">りんご</item> <item value="60">みかん</item> <item value="90">いちご</item> <item value="50">メロン</item> <item value="20">ぶどう</item> </dataset> <simplelayout spacing="10"/> <text>▼デフォルトでは、文字列の縦位置が微妙にずれている</text> <hbox spacing="5"> <datacombobox itemdatapath="ds:/item" /> <combobox editable="false"> <textlistitem datapath="ds:/item" text="$path{'text()'}" value="$path{'@value'}"/> </combobox> </hbox> <text>▼文字列の縦位置が合うようにした</text> <hbox spacing="5"> <datacombobox itemdatapath="ds:/item" oninit="this._text.setAttribute('y',3)"/> <combobox editable="false"> <textlistitem datapath="ds:/item" text="$path{'text()'}" value="$path{'@value'}"/> </combobox> </hbox> </canvas>
<combobox>タグ内に<textlistitem>でtext:valueを列挙します。
<?xml version="1.0" encoding="UTF-8"?> <canvas proxied="false" bgcolor="0xeeeeee"> <simplelayout axis="x"/> <combobox id="dc" editable="false"> <textlistitem value="30">りんご</textlistitem> <textlistitem value="60">みかん</textlistitem> <textlistitem value="90">いちご</textlistitem> <textlistitem value="50">メロン</textlistitem> <textlistitem value="20">ぶどう</textlistitem> </combobox> <text text="${dc.text + ':' + dc.value}"/> </canvas>
データセットからアイテムを取得することもできます。<textlistitem>にdatapathを設定します。
<?xml version="1.0" encoding="UTF-8"?> <canvas proxied="false" bgcolor="0xeeeeee"> <dataset name="ds" > <item value="30">りんご</item> <item value="60">みかん</item> <item value="90">いちご</item> <item value="50">メロン</item> <item value="20">ぶどう</item> </dataset> <simplelayout axis="x"/> <combobox id="dc" editable="false"> <textlistitem datapath="ds:/item" text="$path{'text()'}" value="$path{'@value'}"/> </combobox> <text text="${dc.text + ':' + dc.value}"/> </canvas>
選択したアイテムが上から何番目かを取得するにはgetItemIndex()メソッドを使います。引数はvalueです。
1番目の数値は0です。
<?xml version="1.0" encoding="UTF-8"?> <canvas proxied="false" bgcolor="0xeeeeee"> <dataset name="ds" > <item value="30">りんご</item> <item value="60">みかん</item> <item value="90">いちご</item> <item value="50">メロン</item> <item value="20">ぶどう</item> </dataset> <simplelayout axis="x"/> <datacombobox id="dc" itemdatapath="ds:/item" /> <text> <handler name="onselect" reference="dc" > setText(dc.getItemIndex(dc.value) + ":" + dc.text + ":" + dc.value); </handler> </text> </canvas>
コンボボックスを使えないようにグレーアウト表示して無効化するには、enabled属性をfalseにすればOKです。
しかし、確かにグレーアウト&無効にはなるものの、実際にはクリック可能で一覧リストが見えてしまい、うごいているように見えてしまいます。
<?xml version="1.0" encoding="UTF-8"?> <canvas proxied="false" bgcolor="0xeeeeee"> <dataset name="ds" > <item value="30">りんご</item> <item value="60">みかん</item> <item value="90">いちご</item> </dataset> <simplelayout axis="x" spacing="20"/> <radiogroup id="r"> <radiobutton value="0">有効</radiobutton> <radiobutton value="1">無効</radiobutton> </radiogroup> <datacombobox itemdatapath="ds:/item" > <handler name="onselect" reference="r"> if(r.value==0){ this.setAttribute('enabled',true); }else if(r.value!=0){ this.setAttribute('enabled',false); } </handler> </datacombobox> </canvas>
<datacombobox>のソースにあるbkgndビューのclickable属性をfalseにするとクリック不能になり完全に無効化できます。
this.bkgnd.setAttribute('clickable',false);
<?xml version="1.0" encoding="UTF-8"?> <canvas proxied="false" bgcolor="0xeeeeee"> <dataset name="ds" > <item value="30">りんご</item> <item value="60">みかん</item> <item value="90">いちご</item> </dataset> <simplelayout axis="x"/> <radiogroup id="r"> <radiobutton value="0">有効</radiobutton> <radiobutton value="1">無効</radiobutton> </radiogroup> <datacombobox itemdatapath="ds:/item" > <handler name="onselect" reference="r"> if(r.value==0){ this.setAttribute('enabled',true); this.bkgnd.setAttribute('clickable',true); // クリック有効化 }else if(r.value==1){ this.setAttribute('enabled',false); this.bkgnd.setAttribute('clickable',false); // クリック無効化 } </handler> </datacombobox> </canvas>