Curl Global Community
DropdownList へのListValueItem の設定方法は? - Printable Version

+- Curl Global Community (http://communities.curl.com)
+-- Forum: Discussions (http://communities.curl.com/forumdisplay.php?fid=1)
+--- Forum: General Curl questions (http://communities.curl.com/forumdisplay.php?fid=2)
+--- Thread: DropdownList へのListValueItem の設定方法は? (/showthread.php?tid=1019)



DropdownList へのListValueItem の設定方法は? - umemura - 12-19-2013

DropdownList に対して、ListValueItem を設定する際に、
下記のコードで設定すると、実行は出来るのですが、
リストを選んだ際に、エラーが発生します。

Code:
def dl = {DropdownList}
def dm =
    {DefaultListModel
        {ListValueItem "a", label = "test-a"},
        {ListValueItem "b", label = "test-b"},
        {ListValueItem "c", label = "test-c"},
        {ListValueItem "d", label = "test-d"}
    }
set dl.data-model = dm


■エラー内容
アプレット [9-34] - DropdownList 内の ListValueItem のラベル '[ListValueItem @0x074141D4]' をクローンできません。の為、例外Errorで停止


しかし、下記のような記述であれば、問題ありませんでした。

Code:
{for itm in dm do
    {dl.append itm}
}

また、DefaultListModel の値が、String であれば、
DoropdownList.data-model に設定しても、問題ありませんでした。
(ただし、ラベル=値 になってしまいますが)

Code:
def dm =
    {DefaultListModel
        "test-a",
        "test-b",
        "test-c",
        "test-d"
    }
set dl.data-model = dm


DoropdownList に ListValueItem を設定する方法としては、
append を使うのが正しい、ということなのでしょうか。
for 文を使わなければいけない、という点に違和感を感じています。

もし、よりシンプルで正しい方法があれば、教えてください。


RE: DropdownList へのListValueItem の設定方法は? - dyoshida - 02-02-2014

よりシンプルな設定方法が見つかっていないのでご参考までなのですが

data-modelはListItem そのものではなくListItem.init-valueを格納しているようです。
data-modelに値を登録した場合は関連付けられているListModelControlのlist-item-creation-procが
呼ばれ、登録した値よりListItemを生成してListModelControl.items:{Array-of ListItem}に格納されるので
挙げられているコードだとvalueにListValueItem、labelにVisualとしてListValueItemを設定したListValueItemが
リスト項目として登録され、表示時にlabelがらみでエラーがおきているのでは。

COM.CURL.OPEN.GUI.CONTROL-LOGICAL.ListModelControl.appendのコードを見ると、ListItemが指定された
場合は、list-item-creation-procが呼び出されないようにしつつ、data-modelにListItem.init-value、itemsに
指定されたListItemを登録するということを行っていました。

DropdownList オブジェクトの生成後にリスト項目を一括してappendさせる手法があればよいのですが
残念ながら見つけられていません。