バージョン 6.3.3
 —  プログラミングガイド  —

リストボックスコントロールおよび選択ボックスコントロールの操作

リストボックスコントロールおよび選択ボックスコントロールには、多くの項目が含まれます。 コントロールと項目の両方はダイアログエレメントであり、コントロールは項目の親になります。

リストボックス項目および選択ボックス項目を作成するには、以下の 2 つの方法があります。

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)

選択ボックスコントロールおよび入力フィールドコントロールの保護

エンドユーザーによって選択ボックスコントロールまたは入力フィールドコントロールにデータが入力されないようにするには、以下のようないくつかの方法があります。

選択ボックスコントロールが保護されていても、項目を選択できます。ただし、項目リストの値が入力フィールドに表示されるだけです。 STRING 属性を項目リストにない値に(ダイナミックにまたは初期化で)設定すると、その値はエンドユーザーに表示されません。

Top of page