単一選択ウィジェットの追加

コンボ・ボックス、ラジオ・ボタン・グループ、およびリスト・ボックスは、 いずれもユーザーに対してオプションのグループから単一のオプションを選択するよう求めるという点で似ています。

チェック・ボックス・ウィジェットと同様に、単一選択ウィジェットは、 その状態を表わす変数にバインドする必要があります。ただし、単一選択ウィジェットは、 ブール変数にバインドするのではなく、現在選択されているオプションの索引を表す INT 型の変数にバインドする必要があります。

  1. コンソール・フォームで、事前定義パーツを使用してウィジェットを作成します。
    record singleSelectForm type ConsoleForm 
      { formsize=[12,40] }
      myRadio consoleRadioGroup 
        {name = "radio", bounds = [1,2,4,17]};
      myCombo consoleCombo 
        {name = "combo", bounds = [7,2,1,15]};
      myList ConsoleList 
        {name ="list", bounds = [9,2,2,18]};
    end
  2. 最小限、ウィジェットごとに以下のフィールドを指定します。
    name
    ウィジェットをイベント・ハンドラーにリンクするために、後で使用するニーモニック。
    bounds
    ウィジェットの行、列、高さ、幅をそれぞれ表わす、4 個の整数の配列。
  3. プログラム内で、ウィジェットの状態を表す整変数を作成します。
    radioValue, comboValue, listValue int = 2;
  4. フォーム変数を作成してからウィンドウにフォームが表示されるまでの間に、 変数またはリテラルの配列を使用して、ウィジェットのオプションを定義します。
    myWindow WINDOW {name="myWindow", position=[1,1]};
    openWindow(myWindow);
    myForm singleSelectForm{};
    
    myForm.myCombo.items = 
      ["オプション 1", "オプション 2", "オプション 3"];
    myForm.myRadio.items = 
      ["オプション 1", "オプション 2", "オプション 3"];
    myForm.myList.items = 
      ["one","two","three","four","five","six"];
    
    displayForm(myForm);
  5. openUI ステートメントを使用し、フォームを開いて、変数をウィジェットにバインドします。
    openUI myForm 
        bind radioValue, comboValue, listValue
        //イベント・ハンドラーがここに入ります
    end
  6. openUI ステートメントにおいて、 ウィジェットの SELECTION_CHANGED イベント用のイベント・ハンドラーを指定します。
    onEvent (ConsoleRadioGroup.SELECTION_CHANGED : "radio")
      SysLib.writeStdout("Radio selected: "::radioValue); 
    onEvent (ConsoleCombo.SELECTION_CHANGED : "combo")
      SysLib.writeStdout("Combo selected: "::comboValue);
    onEvent(ConsoleList.SELECTION_CHANGED : "list")
      SysLib.writeStdout("List selected: "::listValue);

この方法でコンボ・ボックス・ウィジェットとラジオ・ボタン・グループ・ウィジェットを使用している、コンソール UI プログラムの完全な例を、以下に示します。

programs/singleSelectTest.egl ファイル内:
package programs;

import forms.singleSelectForm;

program singleSelectTest type BasicProgram {}

  radioValue, comboValue, listValue int = 2;
  
  function main()
    myWindow WINDOW {name="myWindow", position=[1,1]};
    openWindow(myWindow);
    myForm singleSelectForm{};
    
    myForm.myCombo.items = 
      ["オプション 1", "オプション 2", "オプション 3"];
    myForm.myRadio.items = 
      ["オプション 1", "オプション 2", "オプション 3"];
    myForm.myList.items = 
      ["one","two","three","four","five","six"];
    
    displayForm(myForm);
    
    openUI myForm
    bind radioValue, comboValue, listValue
    onEvent (ConsoleRadioGroup.SELECTION_CHANGED : "radio")
      SysLib.writeStdout("Radio selected: "::radioValue); 
    onEvent (ConsoleCombo.SELECTION_CHANGED : "combo")
      SysLib.writeStdout("Combo selected: "::comboValue);
    onEvent(ConsoleList.SELECTION_CHANGED : "list")
      SysLib.writeStdout("List selected: "::listValue);
    end
    
  end
  
end
forms/singleSelectForm.egl ファイル内:
package forms;

record singleSelectForm type ConsoleForm 
  { formsize=[12,40] }
  myRadio consoleRadioGroup 
    {name = "radio", bounds = [1,2,4,17]};
  myCombo consoleCombo 
    {name = "combo", bounds = [7,2,1,15]};
  myList ConsoleList 
    {name ="list", bounds = [9,2,2,18]};
end

RCP モードで EGL プログラムを実行した場合、ユーザー・インターフェースは以下のようになります:

ラジオ・ボタン・グループ、コンボ・ボックス、およびリスト・ボックスのウィジェットを表示するインターフェースのピクチャー
ウィジェットのいずれかで選択を変更するたびに、該当するイベント・ハンドラーが動作します。 このケースでは、コンソール・ビューに以下のメッセージを印刷します:
コンソール・ビューに印刷されたイベント・ハンドラー・メッセージ

また、リスト・ボックスを複数選択ウィジェットとして動作させて、 ユーザーがリストから複数の項目を選択できるようにすることも可能です。 ユーザーがリストから複数の項目を選択できるようにするには、次のように、ウィジェットの multipleSelect プロパティーを TRUE に設定します。
myForm.list1.multipleSelect = TRUE;
multipleSelect が FALSE (デフォルト) に設定されている場合、ウィジェットにバインドされた変数の値は、選択された項目の索引を含みます。 最初の項目を選択した場合、変数は番号 1 を含みます。5 番目の項目を選択した場合、変数は番号 5 を含みます。multipleSelect が TRUE に設定された場合、変数は、選択された項目の 2 進数表記を含みます。 リスト内の各項目には、その位置に応じて 2 の倍数が割り当てられます。最初の項目は 1、2 番目は 2、3 番目は 4、4 番目は 8、5 番目は 16、6 番目は 32 で、以下同じように続きます。 変数の値は、選択されたすべての項目の値を合計したものです。 例えば、最初の項目のみ選択した場合、変数には 1 が入ります。 最初と 2 番目の項目を選択した場合、変数には、この 2 つの選択項目の値の合計である 3 が入ります。 2 番目、5 番目、および 6 番目の項目を選択した場合、変数には 50 (つまり 2+16+32) が入ります。

フィードバック