リストボックスコントロールおよび選択ボックスコントロールには、多くの項目が含まれます。 コントロールと項目の両方はダイアログエレメントであり、コントロールは項目の親になります。
リストボックス項目および選択ボックス項目を作成するには、以下の 2 つの方法があります。
Natural コードを使用して、複数のリストボックス項目をそれぞれダイナミックに作成する。
ダイアログエディタを使用して、1 つまたは配列形式のリストボックス項目および選択ボックス項目を追加する。
Natural コードでは、以下のように記述します。
#AMOUNT := 5 ITEM (1) := 'BERLIN' ITEM (2) := 'PARIS' ITEM (3) := 'LONDON' ITEM (4) := 'MILAN' ITEM (5) := 'MADRID' PROCESS GUI ACTION ADD-ITEMS WITH #LB-1 #AMOUNT #ITEM (1:5) GIVING #RESPONSE
最初に、作成する項目数を指定し、次に項目値を指定します。そして、PROCESS GUI
ステートメントの ADD-ITEMS
アクションを使用します。
リストボックスコントロールのどの項目が選択されたかを把握するためにすべての項目を調べる場合は、SELECTED-SUCCESSOR
属性を使用することをお勧めします。この方法は、リストボックスコントロールが非常に多くの項目(例:100)を含んでいる場合に、パフォーマンスの向上に有効です。 SELECTED-SUCCESSOR
を使用すると、SELECTED
属性および SUCCESSOR
属性を使用すれば、個別に 100 回クエリする代わりに、1 回クエリするだけで確認できます。
例:
/* Displays the STRING attribute of every SELECTED list-box item MOVE #LISTBOX.SELECTED-SUCCESSOR TO #LBITEM REPEAT UNTIL #LBITEM = NULL-HANDLE .../* STRING display logic MOVE #LBITEM.SELECTED-SUCCESSOR TO #LBITEM END-REPEAT
SELECTED-SUCCESSOR
属性を使用して同じダイアログエレメントのハンドルを 2 回参照すると、Natural は項目ハンドルのリストを 2 回調べるため、パフォーマンスが低下します。
/* Displays the STRING attribute of every SELECTED list-box item, /* but may be slow MOVE #LISTBOX.SELECTED-SUCCESSOR TO #LBITEM REPEAT UNTIL #LBITEM = NULL-HANDLE IF #LBITEM.SELECTED-SUCCESSOR = NULL-HANDLE /* Searches in the list of items IGNORE END-IF .../* STRING display logic MOVE #LBITEM.SELECTED-SUCCESSOR TO #LBITEM /* Searches in the list of items END-REPEAT /* for the second time
この問題を回避するには、#LBITEM
の他に 2 つ目の変数 #OLDITEM
を使用します。
/* Displays the STRING attribute of every SELECTED list-box item MOVE #LISTBOX.SELECTED-SUCCESSOR TO #LBITEM REPEAT UNTIL #LBITEM = NULL-HANDLE #OLDITEM = #LBITEM #LBITEM = #LBITEM.SELECTED-SUCCESSOR/* Searches in the list of items (once) IF #LBITEM = NULL-HANDLE IGNORE END-IF .../* Display logic using #OLDITEM.STRING END-REPEAT
選択した項目のハンドル値を受け取る場合、通常、選択した項目によって NULL-HANDLE
以外の値が返されます。 以下の例に示すように、選択していない項目の SELECTED-SUCCESSOR
値を取得する直前に SELECTED-SUCCESSOR
に値を割り当てると、選択していない項目からもこのようなハンドル値が返されます。
... PTR := #LB-1.SELECTED-SUCCESSOR PTR := NOT_SELECTEDHANDLE.SELECTED-SUCCESSOR IF NOT_SELECTEDHANDLE.SELECTED-SUCCESSOR = NULL-HANDLE THEN #DLG$WINDOW.STATUS-TEXT := 'NULL-HANDLE' ELSE COMPRESS 'NEXT SELECTION: ' PTR.STRING TO #DLG$WINDOW.STATUS-TEXT END-IF ...
リストボックスコントロール内の特定の項目が選択されているかどうかをクエリする場合、SELECTED
属性を使用することによって最高のパフォーマンスを得られます。
#DLG$WINDOW.STRING:= #LB-1-ITEMS.SELECTED(3)
エンドユーザーによって選択ボックスコントロールまたは入力フィールドコントロールにデータが入力されないようにするには、以下のようないくつかの方法があります。
ダイアログエレメントの MODIFIABLE
属性を FALSE
に設定する。
セッションパラメータ AD=P
を設定する。
制御変数(CV)を使用する。
選択ボックスコントロールが保護されていても、項目を選択できます。ただし、項目リストの値が入力フィールドに表示されるだけです。 STRING
属性を項目リストにない値に(ダイナミックにまたは初期化で)設定すると、その値はエンドユーザーに表示されません。