値の設定ブロック

値の設定ブロックは、プロパティーとフィールドの両方の値を設定できるコード領域です。 背景情報については、『EGL プロパティーの概要』を参照してください。

値の設定ブロックは、以下のアクションを行うときに使用できます。

最後の 2 つの事例では、フィールドにのみ、値を代入できます。

注: 固定構造体内のフィールドには、1 つの制限事項が適用されます。値の設定ブロックを使用して、プリミティブ・フィールド・レベル・プロパティーに値を代入できますが、フィールド自体の値を設定することはできません。

基本的な状態での値の設定ブロック

基本的な事例で、ほとんどの場合に適用される規則について考えてみます。
  • それぞれの値の設定ブロックは、左中括弧 ({) で始まり、複数のエントリーをコンマで区切ったリストか単一のエントリーを含んでおり、右中括弧 (}) で終わります。
  • すべてのエントリーは、次の 2 つの形式のどちらかになっています。
    • それぞれのエントリーが識別子と値のペア (inputRequired = yes など) で構成される。または、
    • 配列の連続したエレメントへ連続した値が代入される場合、それぞれのエントリーには、位置によって代入される値が入っている。

いずれの場合でも、値の設定ブロックは、変更されようとしているパーツ、変数、またはフィールドの有効範囲内にあります。 分かりやすいように、さまざまな構文の例を以下に示します。

最初の例として、2 つのプロパティー (inputRequiredalign) を持つ dataItem パーツを次に示します。
  // 値の設定ブロックの有効範囲は myPart です。
  DataItem myPart INT 
    { 
    inputRequired = yes, 
    align = left 
    } 
  end
次の例は、プリミティブ型の変数を示しています。
   // 有効範囲は myVariable です。
   myVariable INT
   {
      inputRequired = yes,
      align = left
   };
次の例は、2 つのレコード・プロパティー (tableNameskeyItems) を含んでいる SQL レコード・パーツ宣言を示しています。
  // 有効範囲は myRecordPart です。
  Record myRecordPart type SQLRecord
    { tableNames = [["myTable"]],
      keyItems = ["myKey"] }
    myKey CHAR(10);
    myOtherKey CHAR(10);
    myContent01 CHAR(60);
    myContent02 CHAR(60);
  end
次の例は、直前のパーツをタイプとして使用し、2 つのレコード・プロパティーの 1 つをオーバーライドし、レコード内の 2 つのフィールドを設定する変数宣言を示しています。
  // 有効範囲は myRecord です。
  myRecord myRecordPart 
    {
      keyItems = ["myOtherKey"],
      myContent01 = "abc",
      myContent02 = "xyz"
    };
追加の例として、いくつかの変数宣言と assignment 文を以下に示します。
  // この例は、変数宣言の中で
  // レコード・プロパティーをオーバーライド
  // できる唯一の事例を示しています。// 有効範囲は myRecord です。
  myRecord myRecordPart {keyItems = ["myOtherKey"]};

  // 有効範囲は myInteger で、これは配列です。
  myInteger INT[5] {1,2,3,4,5};

  // 以下の assignment 文には、
  // 値の設定ブロックがありません。
  myRecord02.myContent01 = "abc";
  myRecord02.myContent02 = "xyz";

  // 次の簡略 assignment 文は、
  // 上記の 2 つと等価であり、
  // 有効範囲は myRecord02 です。
  myRecord02
    {
      myContent01="abc",
      myContent02="xyz"
    };

  // 次の簡略 assignment 文は、
  // 前に宣言された配列の
  // 最初の 4 エレメントをリセットします。
myInteger{6,7,8,9};

簡略 assignment 文を固定構造体内のフィールドに使用することはできません。

フィールドのフィールド用の値の設定ブロック

フィールドのフィールドに値を代入するときは、使用する構文の中で、各エントリーがそのフィールドのみを変更するような有効範囲内に値の設定ブロックを入れるようにします。

次のパーツ定義を考えてみます。
  record myBasicRecPart03 type basicRecord
    myInt04 INT;
  end

  record myBasicRecPart02 type basicRecord
    myInt03 INT;
    myRec03 myBasicRecPart03;
  end

  record myBasicRecPart type basicRecord  
    myInt01 INT;
    myInt02 INT;
    myRec02 myBasicRecPart02;
 end
以下のようにして、任意のフィールドにプロパティー値を代入できます。
  • レコードの値の設定ブロックを作成します。
  • 有効範囲を絞り込むために、一連のフィールド名を埋め込みます。
  • フィールド固有の値の設定ブロックを作成します。

プロパティー値を代入する構文には、次の例に示す 3 つの書式のどれでも使用できます。これらは、フィールド myInt04 に適用されます。

  // ドット構文
  // (『EGL での変数の参照』を参照)。
  myRecB myBasicRecPart 
  { 
    myRec02.myRec03.myInt04{ align = left } 
  };

  // 大括弧構文
  // (『動的アクセス用の大括弧構文』を参照)。
  // この構文を使用して、固定構造体内のフィールドに
  // 影響を及ぼすことはできません。
myRecC myBasicRecPart 
  { 
    myRec02["myRec03"]["myInt04"]{ align = left } 
  };

  // 中括弧構文
  myRecA myBasicRecPart 
  { 
    myRec02 {myRec03 { myInt04 { align = left }}}
  };
複雑な事例でも、値の設定ブロック内の個々のエントリーをコンマで区切ります。ただし、そのブロックがネストされているレベルを考慮する必要があります。
  // ドット構文
  myRecB myBasicRecPart 
  { 
    myInt01 = 4,
    myInt02 = 5,
    myRec02.myRec03.myInt04{ align = left }, 
    myRec02.myInt03 = 6
  };

  // 大括弧構文
  myRecC myBasicRecPart 
  { 
    myInt01 = 4,
    myInt02 = 5,
    myRec02["myRec03"]["myInt04"]{ align = left }, 
    myRec02["myInt03"] = 6
  };

  // 中括弧構文。
  // ただし、これを使用すると保守がずっと難しくなります。
  myRecA myBasicRecPart 
  { 
    myInt01 = 4,
    myInt02 = 5,
    myRec02 
      {
        myRec03 
          { myInt04 
            { action = label5 }},
        myInt03 = 6
      }
  };

「this」の使用

変数宣言または assignment 文の中で、レコード・プロパティーと同じ名前が付いたフィールド (keyItems など) を含んでいるコンテナー (SQL レコードなど) を使用できます。 そのプロパティーでなくフィールドを参照するには、キーワード this を使用します。これは、値の設定ブロック、または値の設定ブロック内にあるエントリーの正しい有効範囲を設定します。

次のレコード宣言を考えてみます。
  Record myRecordPart type SQLRecord
    { tableNames = [["myTable"]],
      keyItems = ["myKey"] }
    myKey CHAR(10);
    myOtherKey CHAR(10);
    keyItems CHAR(60);
  end
次のレコード宣言は、最初にプロパティー keyItems の値を設定し、次に同名のフィールドの値を設定します。
  myRecord myRecordPart 
  { 
     keyItems = ["myOtherKey"],
     this.keyItems = "abc"
  };

次のセクションに、配列宣言での追加の例を示します。

値の設定ブロック、配列、および配列エレメント

動的配列を宣言する場合、初期のエレメント数を次の例のように指定できます。
  col1 ConsoleField[5];
値の設定ブロックでの代入は、タイプ ConsoleField の各初期エレメントのプロパティーと事前定義フィールドを参照します。ただし、後で追加されたエレメントは参照しません。
  col1 ConsoleField[5]
  { 
    position = [1,1],
    color = red
  };
変数宣言内の特定のエレメントに値を代入するには、そのエレメントを有効範囲とする埋め込みの値の設定ブロックを作成します。 次の例に示すように、有効範囲を指定するには、キーワード this と大括弧で囲んだ指標を使用します。
  // 第 2、第 4 エレメントに値を代入します。
  col1 ConsoleField[5]
  {
    this[2] { color = blue }, 
    this[4] { color = blue }
  };

キーワード this の別の使用法の詳細については、『有効範囲指定の規則と EGL での「this」』を参照してください。

値の設定ブロックの中で定位置エントリーを使用して、以下のタイプの配列に入っている連続したエレメントに値を代入できます (レポートの処理、またはコンソール書式の作成を行う場合に限ります)。
  • ConsoleField
  • Menu
  • MenuItem
  • Prompt
  • Report
  • ReportData
次の例を OpenUI 文に入れることもできます。埋め込みの値の設定ブロックの有効範囲は、いずれも特定の配列エレメントです。
   new Menu
   {
     labelText = "Universe",
     MenuItems = 

     // プロパティー値は動的配列です。
     [ 
       new MenuItem 
       { name = "Expand", 
          labelText = "Expand" },
       new MenuItem 
       { name = "Collapse", 
          labelText = "Collapse" }
     ]
   }

追加の例

以下のパーツを考えてみます。
  Record Point
				x, y INT;
  end

  Record Rectangle
    topLeft, bottomRight Point;
  end
次のコードは有効です。
  Function test()
    screen Rectangle
    {
      topLeft{x=1, y=1},
      bottomRight{x=80, y=24}
    };
  
    // 次のコードと等価の文を使用して、
    // コード内の x、y を変更します。
//   screen.topLeft.x = 1;
    //   screen.topLeft.y = 2;
    screen.topLeft{x=1, y=2};
  end
次に、Point タイプのエレメントのからなる動的配列を、同じ関数内で初期化します。
  pts Point[2]
  {
    this[1]{x=1, y=2},
    this[2]{x=2, y=3}
  };
この時点で配列に入っている各エレメントの値を設定した後、次のように最初のエレメントを別の値に設定します。
  pts{ x=1, y=1 };
  pts[1]{x=10, y=20};

上記の例で、this[1] でなく pts[1] が使用される理由は、配列名があいまいだからです。

次に、Point タイプの別の動的配列を考えてみます。
  points Point[];
次の assignment 文は、エレメントが存在しないので何も効果がありません。
  points{x=1, y=1};
一方、次の assignment 文は、存在しない特定のエレメントを参照しているので、範囲外による例外を起こします。
  points[1]{x=10, y=20};
次のようにすると、配列にエレメントを追加し、その後、単一の文を使用してすべてのエレメントに値を設定できます。
  points.resize(2);
  points{x=1, y=1};

関連する参照項目
配列
データの初期化
OpenUI 文

ご利用条件 | フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.(C) Copyright IBM Japan 2005.