リストボックスとコンボボックスの使用

リストボックスとコンボボックスは,複数の値の組から,ユーザーに値を選択させる必要がある時に使用します。これらは複数のラジオボタンの組に似ていますが,リストボックスとコンボボックスはスクロールが可能であり,ラジオボタンの組のように,画面の表示領域によって項目数が制限されることがない点が異なります。また,ラジオボタンとは異なり,リストボックスとコンボボックスの項目数は実行時に変更することができます。

リストボックスとコンボボックスの違いは,リストボックスが単に項目一覧であるのに対し,コンボボックスがリストボックスとエディットボックスの組み合わせであるというところにあります。リストボックスでは,ユーザーは一覧から複数の項目を同時に選択することができますが,コンボボックスでは 1 つの項目しか選択できません。一方,コンボボックスでは,ユーザーは選択した値を編集することができますが,リストボックスでは与えられた一覧中から選択することしかできません。

ドロップダウンリストボックスは,一覧を表示するためのドロップダウン矢印があるという点で,コンボボックスに似ています。ドロップダウンリストボックスでは,コンボボックスと同様に,一度に 1 つの項目しか選択できず,リストボックスと同様に,選択した値を編集することはできません。ドロップダウンリストボックスはリストボックスと同じ機能を果たしますが,ユーザーが 1 つの項目しか選択できないという短所と,ダイアログ・ウィンドウ上で占有する領域が小さいという長所があります。

Visual Fortran のダイアログ関数は,ユーザー描画リストボックスやユーザー描画コンボボックスをサポートしていません。リストボックスとコンボボックスはリソース・エディタで作成する必要があります。

以下では,リストボックスとコンボボックスの使い方を説明します。

リストボックスの使用

リストボックスとコンボボックスのどちらでも,コントロール指標 DLG_NUMITEMS は,ボックスに含まれる項目数を決定します。この値を設定したら,個々の項目指標の文字列を指定することで,リストボックスのテキストを設定することができます。指標の範囲は,1 から DLG_NUMITEMS で設定された一覧項目の総数までです。次に例を示します。

	LOGICAL retlog
	retlog = DlgSet ( dlg, IDC_LISTBOX1, 3, DLG_NUMITEMS )
	retlog = DlgSet ( dlg, IDC_LISTBOX1, "Moe", 1 )
	retlog = DlgSet ( dlg, IDC_LISTBOX1, "Larry", 2 )
	retlog = DlgSet ( dlg, IDC_LISTBOX1, "Curly", 3 )

これらの文は,リストボックスに 3 つの項目を追加します。個々のリストボックス項目の初期値は空の文字列で,値を設定した後には空白でなくなります。

一覧の長さと項目の値は,コールバック・ルーチン中を含めて,いつでも変更することができます。一覧の長さを減らすと,項目の組は切り捨てられます。一覧の長さを増やすと,空の項目が追加されます。上の例に続けて,次の文を使うと,一覧の長さを増やし,新しい項目を定義することができます。

	retlog = DLGSET ( dlg, IDC_LISTBOX1, 4)
	retlog = DLGSET ( dlg, IDC_LISTBOX1, "Shemp", 4)

リストボックスでは複数の項目を選択することができるので,どの項目が選択されているのかを判断するための手段が必要となります。ユーザーが選択したリストボックス項目には,選択された順序と等しい整数指標が割り付けられます。プログラマは,ゼロの値に達するまで選択項目の指標を読み取ることで,どの一覧項目が選択されているのかを調べることができます。たとえば,上のリストボックスで,ユーザーが Moe をさらに Curly を選択した場合,リストボックスの選択項目指標は次の値を持つことになります。

選択項目指標
1 1 (Moe)
2 3 (Curly)
3 0 (これ以上の選択項目なし)

Larry だけを選択した場合,リストボックスの選択項目指標は次の値を持つことになります。

選択項目指標
1 2 (Larry)
2 0 (これ以上の選択項目なし)

選択された項目を知るには,DLGGET を使って,ゼロに達するまでリストボックスの値を読み取ります。次に例を示します。

	INTEGER j, num, test
	INTEGER, ALLOCATABLE :: values(:)
	LOGICAL retlog
retlog = DLGGET (dlg, IDC_LISTBOX1, num, DLG_NUMITEMS) ALLOCATE (values(num)) j = 1 test = -1 DO WHILE (test .NE. 0) retlog = DLGGET (dlg, IDC_LISTBOX1, values(j), j) test = values(j) j = j + 1 END DO

この例で,j は選択指標であり,values(j) は,ユーザーが選択した順序で,一覧番号を含んでいます。

1 つの選択項目,または組中の最初の選択項目を読み取るには,DLG_STATE を使用します。リストボックスの DLG_STATE には,最初の選択項目 (選択されている場合) の文字列が保持されているからです。次に例を示します。

!	最初に選択された項目の文字列を得ます。
	retlog = DLGGET (dlg, IDC_LISTBOX1, str, DLG_STATE)

別の方法として,まず選択された項目の一覧番号を取得し,その項目に関連付けられている文字列を取得するという方法もあります。

	INTEGER value
	CHARACTER(256) str
!	最初に選択された項目のリスト番号を得ます。
	retlog = DLGGET (dlg, IDC_LISTBOX1, value, 1)
!	その項目の文字列を得ます。
	retlog = DLGGET (dlg, IDC_LISTBOX1, str, value)

これらの例で,ユーザーが何も選択していなかった場合,str は空の文字列になります。

リソース・エディタの「Properties」ボックスの「Styles」タブでは,リストボックスを「並べ替えあり」または「並べ替えなし」として指定することができます (「Sort」チェックボックスをクリックすると「並べ替えあり」になります)。基本設定は「並べ替えあり」で,リストボックス項目は A からアルファベット順に並べ替えられます。リストボックスが「並べ替えあり」と指定されていると,一覧内の項目は,画面上で更新されるたびに並べ替えられます。これは,ダイアログボックスが初めて表示された時と,項目がコールバック中で変更された時に起こります。

アルファベット順の並べ替えは ASCII 大小順序に従い,大文字は小文字の前に置かれます。たとえば,上の例の "Moe""Larry""Curly",および "Shemp" を含んでいるリストボックスが,コールバックの前,または DLGMODAL が返った後に並べ替えられると,指標 1 は "Curly",指標 2 は "Larry",指標 3 は "Moe",指標 4 は "Shemp" を参照することになります。この理由から,並べ替えられたリストボックスを使用する時には,ダイアログが表示され,一覧項目に変更が加えられた後は,指標の内容が以前と等しいと仮定してはなりません。

また,DLG_ADDSTRING 指標を使って DLGSETCHAR を呼び出すことで,リストボックスまたはコンボボックスに項目を追加することができます。次に例を示します。

	retlog = DlgSet(dlgtab, IDC_LIST, "Item 1", DLG_ADDSTRING)

DLG_ADDSTRING を使用すると,リストボックスまたはコンボボックスの DLG_NUMITEMS コントロール指標は自動的に増加されます。

並べ替えられた一覧またはコンボボックスに項目を追加する時には,DLG_ADDSTRING を使う方が,それ以外の方法 (DLG_NUMITEMS を設定した後に,指標値を使って項目を設定する) よりもはるかに簡単です。この方法を使えば,一覧が並べ替えられているかどうか,また呼び出し間で指標値が変化しているかどうかを気にする必要がありません。

コンボボックスの使用

コンボボックスは,リストボックスとエディットボックスを組み合わせたものです。ユーザーが一覧から選択を行うと,その項目がコントロールのエディットボックスの部分に表示されます。また,エディットボックスにテキストを直接に入力することも可能です。

ユーザーが入力するすべてのダイアログ値は文字列であり,アプリケーションはこれらの文字列を,それが表現するデータとして解釈しなければなりません。たとえば,ユーザーが入力した数値は,アプリケーションには文字列として返されます。

ユーザー入力は,リストボックスの部分での選択と,エディットボックスの部分への直接入力の 2 つの方法で行われるので,コンボボックスに対しては DLGSETSUB で 2 つのコールバック形式を登録する必要があります。これらのコールバック形式は,新しい一覧項目の選択を処理するための dlg_selchange と,エディットボックスの部分への直接入力を処理するための dlg_update です。次に例を示します。

	retlog = DlgSetSub( dlg, IDC_COMBO1, UpdateCombo, dlg_selchange )
	retlog = DlgSetSub( dlg, IDC_COMBO1, UpdateCombo, dlg_update )

コンボボックスの一覧作成は,前の節で説明したリストボックスの一覧と同じように行いますが,コンボボックスでは,ユーザーは一度に 1 つの項目しか選択できません。ユーザーが一覧から項目を選択すると,Windows はその項目をコンボボックスのエディットボックスの部分に自動的に格納します。つまり,選択された項目の項目一覧番号を取り出す必要はありませんし,そのための機構も用意されていません。

ユーザーがコンボボックスのエディットボックスの部分に項目を直接入力したら,Windows が自動的にその項目を表示するので,プログラマは何も行う必要がありません。選択された項目,またはエディットボックスの項目文字列は,次の文で取得することができます。

!	str として選択した項目の文字列か
!	エディットボックスの入力文字列を返します。
	retlog = DLGGET (dlg, IDC_COMBO1, str)

リストボックスと同様に,コンボボックスは「並べ替えあり」または「並べ替えなし」として指定することができます。コンボボックスの並べ替えに関しては,リストボックスの並べ替えと同じ注意事項が適用されます。

コンボボックスの「Properties」の「Styles」タブでは,3 つのコンボボックスのタイプから選択することができます。

シンプルとドロップダウンに機能的な違いはありませんが,シンプル・コンボボックスがコンボボックスの選択項目をつねに一覧中に表示しているのに対し,ドロップダウンリスト・コンボボックスはドロップダウン・ボタンを持ち,ドロップダウンリストに選択項目を表示するので,画面空間を節約できるという点が異なります。ドロップリスト・タイプは,次に説明するように,コンボボックスとリストボックスの中間に位置する存在です。

ドロップダウンリストボックスの使用

ドロップダウンリストボックスを作成するには,コントロール・ツールバーからコンボボックスを選択し,ダイアログ中に配置します。コンボボックスを左マウス・ボタンでダブルクリックし,「Properties」ボックスを開きます。「Styles」タブで,コントロール・タイプとして「Drop List」を選択します。

ドロップダウンリストボックスは一覧を表示するためのドロップダウン矢印を持っています。コンボボックスと同様に,一覧中では一度に 1 つの項目しか選択できず,リストボックスと同様に,選択した値を編集することはできません。ドロップダウンリストボックスはリストボックスと同じ機能を果たしますが,ユーザーが 1 つの項目しか選択できないという短所と,ダイアログ・ウィンドウ上で占有する領域が小さいという長所があります。

ドロップダウンリストボックスはコンボボックスと同じコントロール指標に加えて,一覧内の選択された項目の一覧番号を設定または返すための INTEGER 指標があります。次に例を示します。

	INTEGER num
!	選択した項目の指標を返します。
	retlog = DLGGET (dlg, IDC_DROPDOWN1, num, DLG_STATE)