For...End for

4D - Documentation   French   English   German   Spanish   日本語   4D v11 SQLコマンドテーマリスト   4D v11 SQLインデックス   4D v11 SQL定数テーマリスト   戻る   前   次

version 6.0


For...End for による制御フロー構造の正式な構文は以下のようになります。

   For (カウンタ変数; 開始値 (式) ; 終了値 (式) {; 増分値 (式) })
      スートメント
   End for 

For...End for ループは、カウンタ変数によりループをコントロールします。

カウンタ変数は、数値変数 (実数、整数、倍長整数) で、開始値 (式) に指定した値で初期化されます。

・ループを実行するたびに、任意の引数増分値 (式) の値が加算されます。増分値 (式) を指定しない場合、増分値は1になります。

・カウンタが終了値 (式) の値を超えた時点で、ループを停止します。

重要開始値 (式)終了値 (式)増分値 (式) の値は、ループの初めで一度だけ評価されます。

これらの数値が変数で指定されている場合、ループ内でこの変数の値を変更してもループは影響を受けません。

Tips:特別な目的のために、カウンタ変数の値を変更することができます。ループ内でカウンタ変数を変更すると、ループはその影響を受けます。

・通常、開始値終了値より小さい。

開始値 (式)終了値 (式) が等しい場合、1回だけループが行われる。

開始値 (式)終了値 (式) より大きい場合、増分値 (式) に負の値を指定しない限り、ループは行われない。

基本的な使用例

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 (Ascii (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 ループは、上記例題のいずれかの形式になるでしょう。

カウンタ変数の減算

ループに際してカウンタ変数を増加させるのではなく、減少させたい場合があります。その場合、開始値 (式)終了値 (式) より大きい値を設定し、増分値 (式) に負の数を指定する必要があります。次に挙げる例題は、前述の例と同じ処理を逆の順序で行います。

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 (Ascii (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 

カウンタ変数を1より大きな値で増加させる

必要に応じて、増分値 (式) (正または負の値) に、その絶対値が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 ループの例をもう一度見てみましょう。

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

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

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

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

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

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

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

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

For...End for ループの最適化

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

11. 以下に例を示します

   C_LONGINT ($vlCounter)   ` 倍長整数変数を使用します
   For ($vlCounter;1;10000)
      ` 何らかの処理
   End for 

For...End for ネスト (入れ子) 構造

必要に応じて、制御構造は好きなだけネストすることができます。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 

参照

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


4D - Documentation   French   English   German   Spanish   日本語   4D v11 SQLコマンドテーマリスト   4D v11 SQLインデックス   4D v11 SQL定数テーマリスト   戻る   前   次