For...End forによる制御フロー構造の正式な構文は以下のようになります。
For(Counter_Variable;Start_Expression;End_Expression{;Increment_Expression})
statement
End for
For...End forループは、カウンタ変数によりループをコントロールします。
- Counter_Variableは、数値変数 (実数、整数、倍長整数) で、Start_Expressionに指定した値で初期化されます。
- ループを実行するたびに、任意の引数Increment_Expressionの値が加算されます。Increment_Expressionを指定しない場合、増分値は1になります。
- カウンタがEnd_Expressionの値を超えた時点で、ループを停止します。
重要:Start_Expression、End_Expression、Increment_Expressionの値は、ループの初めで一度だけ評価されます。
これらの数値が変数で指定されている場合、ループ内でこの変数の値を変更してもループは影響を受けません。
Tips:特別な目的のために、カウンタ変数の値を変更することができます。ループ内でカウンタ変数を変更すると、ループはその影響を受けます。
- 通常、Start_ExpressionはEnd_Expressionより小さい。
- Start_ExpressionとEnd_Expressionが等しい場合、1回だけループが行われる。
- Start_ExpressionがEnd_Expressionより大きい場合、Increment_Expressionに負の値を指定しない限り、ループは行われない。
1. 以下の例は、100回の繰り返しを行います。
For(vCounter;1;100)
End for
2. 以下の例は、配列anArrayの全ての要素に対して処理を行います。
For($vlElem;1;Size of array(anArray))
anArray{$vlElem}:=...
End for
3. 以下の例は、テキスト変数vtSomeTextの全ての文字について処理を行います。
For($vlChar;1;Length(vtSomeText))
If(Character code(vtSomeText[[$vlChar]])=Tab)
End if
End for
4. 以下の例は、テーブル[aTable]のカレントセクションの各レコードについて処理を行います。
データベースで作成する大部分のFor...End forループは、上記例題のいずれかの形式になるでしょう。
ループに際してカウンタ変数を増加させるのではなく、減少させたい場合があります。その場合、Start_ExpressionにEnd_Expressionより大きい値を設定し、Increment_Expressionに負の数を指定する必要があります。次に挙げる例題は、前述の例と同じ処理を逆の順序で行います。
5. 以下の例は、100回の繰り返しを行います。
For(vCounter;100;1;-1)
End for
6. 以下の例は、配列“anArray”の全ての要素に対して処理を行います。
For($vlElem;Size of array(anArray);1;-1)
anArray{$vlElem}:=...
End for
7. 以下の例は、テキスト変数“vtSomeText”の全ての文字について処理を行います。
For($vlChar;Length(vtSomeText);1;-1)
If(Character code(vtSomeText[[$vlChar]])=Tab)
End if
End for
8. 以下の例は、テーブル[aTable]のカレントセクションの各レコードについて処理を行います。
必要に応じて、Increment_Expression (正または負の値) に、その絶対値が1より大きな値を指定できます。
9. 以下の例は、配列anArrayの偶数要素について処理を行います。
For($vlElem;2;Size of array(anArray);2)
anArray{$vlElem}:=...
End for
一定回数のループを行いたいが、他の条件が真になった場合はループから抜けたい場合があります。この場合、ループ内で条件判定を行い、判定結果が真であれば、カウンタ変数に終了値を越える値を明示的に設定することで可能となります。
10. 以下の例は、実際に処理が終了するか、あるいは最初にFALSEに設定されているインタープロセス変数<>vbWeStopがTRUEになるまでレコードセレクションを参照します。この変数はON EVENT CALL プロジェクトメソッドで処理されこのメソッドにより処理を中断します。
For...End forループの例をもう一度見てみましょう。
以下の例は、100回の繰り返しを行います。
For(vCounter;1;100)
End for
ループとループで、同じ処理を実行する方法を調べてみましょう。
以下の例は、同じ処理を実行するループです。
$i :=1
While($i<=100)
$i :=$i +1
End while
同じ事をループで記述すると以下のようになります。:
$i :=1
Repeat
$i :=$i +1
Until($i=100)
Tip:For...End forループは、やループよりも高速です。これは4Dが内部的にカウンタ変数のテストおよび増加を行うからです。可能な限りFor...End forループの使用を推奨します。
カウンタ変数 (インタープロセス、プロセス、ローカル変数) には実数、整数、倍長整数タイプを使用します。数多く繰り返されるループの場合、とくにコンパイルモードでは、倍長整数タイプのローカル変数を使用してください。
11. 以下に例を示します
C_LONGINT($vlCounter)
For($vlCounter;1;10000)
End for</gen9>
必要に応じて制御構造をネストすることができます。For...End forループも同じです。誤りを避けるため、各ループ構造ごとに別のカウンタ変数を使用してください。
次に例を示します。
12. 以下の例は二次元配列の全要素への処理です。
For($vlElem;1;Size of array(anArray))
For($vlSubElem;1;Size of array(anArray{$vlElem}))
anArray{$vlElem}{$vlSubElem}:=...
End for
End for
13. 以下の例は、データベースのすべての日付フィールドに対するポインタの配列を作成します。