値の設定ブロックは、プロパティーとフィールドの両方の値を設定できるコード領域です。 背景情報については、『EGL プロパティーの概要』を参照してください。
最後の 2 つの事例では、フィールドにのみ、値を代入できます。
いずれの場合でも、値の設定ブロックは、変更されようとしているパーツ、変数、またはフィールドの有効範囲内にあります。 分かりやすいように、さまざまな構文の例を以下に示します。
// 値の設定ブロックの有効範囲は myPart です。 DataItem myPart INT { inputRequired = yes, align = left } end
// 有効範囲は myVariable です。 myVariable INT { inputRequired = yes, align = left };
// 有効範囲は ExampleRecordPart です。 Record ExampleRecordPart type SQLRecord { tableNames = [["myTable"]], keyItems = ["myKey"] } myKey CHAR(10); myOtherKey CHAR(10); myContent01 CHAR(60); myContent02 CHAR(60); end
// 有効範囲は myRecord です。 myRecord ExampleRecordPart { keyItems = ["myOtherKey"], myContent01 = "abc", myContent02 = "xyz" };
// この例は、変数宣言の中で // レコード・プロパティーをオーバーライド // できる唯一の事例を示しています。 // 有効範囲は myRecord です。 myRecord ExampleRecordPart {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 } };
変数宣言または assignment 文の中で、レコード・プロパティーと同じ名前が付いたフィールド (keyItems など) を含んでいるコンテナー (SQL レコードなど) を使用できます。 そのプロパティーでなくフィールドを参照するには、キーワード this を使用します。これは、値の設定ブロック、または値の設定ブロック内にあるエントリーの正しい有効範囲を設定します。
Record ExampleRecordPart type SQLRecord { tableNames = [["myTable"]], keyItems = ["myKey"] } myKey CHAR(10); myOtherKey CHAR(10); keyItems CHAR(60); end
myRecord ExampleRecordPart { keyItems = ["myOtherKey"], this.keyItems = "abc" };
次のセクションに、配列宣言での追加の例を示します。
col1 ConsoleField[5];
col1 ConsoleField[5] { position = [1,1], color = red };
// 第 2、第 4 エレメントに値を代入します。 col1 ConsoleField[5] { this[2] { color = blue }, this[4] { color = blue } };
キーワード this の別の使用法の詳細については、『有効範囲指定の規則と EGL での「this」』を参照してください。
new Menu { labelText = "Universe", MenuItems = // プロパティー値は動的配列です。 [ new MenuItem { name = "Expand", labelText = "Expand" }, new MenuItem { name = "Collapse", labelText = "Collapse" } ] }
以前に終了したプロパティーの拡張である構文を確認するには、 複合プロパティー @ProgramLinkData について考えます。 このプロパティーには、プロパティー・フィールド programName および linkParms が 含まれています。linkParms はプロパティー・フィールドの配列を受け入れ、 それぞれのフィールドは複合プロパティー @LinkParameter です。
DataItem Prog1LinkItem char(9) { @ProgramLinkData { programName = “my.company.sys1.PROG1”, linkParms = [ @LinkParameter {name=“parm1”, value=”abc”}, @LinkParameter {name=”parm2”,value=”efg”} ] } } end
DataItem Prog1LinkItem char(9) { @ProgramLinkData { programName = “my.company.sys1.PROG1”, linkParms = [ @LinkParameter {name=“parm1”, value=”abc”}, @LinkParameter {name=”parm2”,value=”efg”} ] }, displayName = “Go to Program02” } end
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
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] が使用される理由は、配列名があいまいだからです。
points Point[];
points{x=1, y=1};
points[1]{x=10, y=20};
points.resize(2); points{x=1, y=1};