4D v14.3

For...End for

ホーム

 
4D v14.3
For...End for

For...End for  


 

 

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]のカレントセクションの各レコードについて処理を行います。

 FIRST RECORD([aTable])
 For($vlRecord;1;Records in selection([aTable]))
  ` レコードについての何らかの処理
    SEND RECORD([aTable])
  ` ...
  ` 次レコードへ移動
    NEXT RECORD([aTable])
 End for

データベースで作成する大部分のFor...End forループは、上記例題のいずれかの形式になるでしょう。

ループに際してカウンタ変数を増加させるのではなく、減少させたい場合があります。その場合、Start_ExpressionEnd_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]のカレントセクションの各レコードについて処理を行います。

 LAST RECORD([aTable])
 For($vlRecord;Records in selection([aTable]);1;-1)
  ` レコードについての何らかの処理
    SEND RECORD([aTable])
  ` ...
  ` 前レコードへ移動
    PREVIOUS RECORD([aTable])
 End for

必要に応じて、Increment_Expression (正または負の値) に、その絶対値が1より大きな値を指定できます。

9. 以下の例は、配列anArrayの偶数要素について処理を行います。

 For($vlElem;2;Size of array(anArray);2)
  ` 何らかの処理を要素 #2,#4...の偶数要素に対して行う
    anArray{$vlElem}:=...
 End for

一定回数のループを行いたいが、他の条件が真になった場合はループから抜けたい場合があります。この場合、ループ内で条件判定を行い、判定結果が真であれば、カウンタ変数に終了値を越える値を明示的に設定することで可能となります。

10. 以下の例は、実際に処理が終了するか、あるいは最初にFALSEに設定されているインタープロセス変数<>vbWeStopがTRUEになるまでレコードセレクションを参照します。この変数はON EVENT CALL プロジェクトメソッドで処理されこのメソッドにより処理を中断します。

 <>vbWeStop:=False
 ON EVENT CALL("HANDLE STOP")
  ` HANDLE STOP は<>vbWeStop変数 を Ctrl+ピリオド(Windows) またはCmd+ピリオド(Macintosh)がタイプされた場合にTrueにします
 $vlNbRecords:=Records in selection([aTable])
 FIRST RECORD([aTable])
 For($vlRecord;1;$vlNbRecords)
  ` 何らかのレコード処理
    SEND RECORD([aTable])
  ` ...
  ` 次のレコードに移動
    If(<>vbWeStop)
       $vlRecord:=$vlNbRecords+1 ` カウンタ変数値をループ終了値以上に設定し、ループを抜ける
    Else
       NEXT RECORD([aTable])
    End if
 End for
 ON EVENT CALL("")
 If(<>vbWeStop)
    ALERT("処理は中断されました。")
 Else
    ALERT("正常終了しました。")
 End if

For...End forループの例をもう一度見てみましょう。

以下の例は、100回の繰り返しを行います。

 For(vCounter;1;100)
  ` 何らかの処理
 End for

ループとループで、同じ処理を実行する方法を調べてみましょう。

以下の例は、同じ処理を実行するループです。

 $i :=1 `カウンタの初期化
 While($i<=100) ` 100回のループ
  ` 何らかの処理
    $i :=$i +1 ` カウンタの増加は必須 (自分で書く)
 End while

同じ事をループで記述すると以下のようになります。:

 $i :=1 ` カウンタ変数
 Repeat
  ` 何らかの処理
    $i :=$i +1 ` カウンタの増加は必須 (自分で書く)
 Until($i=100) ` 100回のループ

TipFor...End forループは、ループよりも高速です。これは4Dが内部的にカウンタ変数のテストおよび増加を行うからです。可能な限りFor...End forループの使用を推奨します。

カウンタ変数 (インタープロセス、プロセス、ローカル変数) には実数、整数、倍長整数タイプを使用します。数多く繰り返されるループの場合、とくにコンパイルモードでは、倍長整数タイプのローカル変数を使用してください。

11. 以下に例を示します

 C_LONGINT($vlCounter` 倍長整数変数を使用します<gen9>
 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. 以下の例は、データベースのすべての日付フィールドに対するポインタの配列を作成します。

 ARRAY POINTER($apDateFields;0)
 $vlElem:=0
 For($vlTable;1;Get last table number)
    If(Is table number valid($vlTable))
       For($vlField;1;Get last field number($vlTable))
          If(Is field number valid($vlTable;$vlField))
             $vpField:=Field($vlTable;$vlField)
             If(Type($vpField->)=Is date)
                $vlElem:=$vlElem+1
                INSERT IN ARRAY($apDateFields;$vlElem)
                $apDateFields{$vlElem}:=$vpField
             End if
          End if
       End for
    End if
 End for

 
プロパティ 

プロダクト: 4D
テーマ: プログラミング言語の構成要素

 
参照 

Case of...Else...End case
If...Else...End if
Repeat...Until
While...End while
制御フロー

 
ARTICLE USAGE

ランゲージリファレンス ( 4D v12.4)
ランゲージリファレンス ( 4D v11 SQL Release 6)
ランゲージリファレンス ( 4D v14 R3)
ランゲージリファレンス ( 4D v14 R2)
ランゲージリファレンス ( 4D v13.5)
ランゲージリファレンス ( 4D v14.3)
ランゲージリファレンス ( 4D v14 R4)