2

次のような状況があります。

procedure Test;
begin
 repeat
  TryAgain := FALSE;
  try
   // Code
   // Code
   if this and that then begin
    TryAgain := TRUE;
    exit;
   end;
  finally
   // CleanUpCode
  end;
 until TryAgain = FALSE;
end;

フッターもexit自動的に呼び出すように、呼び出さずに最終セクションにジャンプするにはどうすればよいですか?repeat

4

2 に答える 2

11

Continue次の反復に進むために使用します。finallyブロックの部分のコードはtry..finally常に実行されるように設計されているため、強制的に次の反復にスキップしても:

procedure TForm1.Button1Click(Sender: TObject);
begin
  repeat
    TryAgain := False;
    try
      if SomeCondition then
      begin
        TryAgain := True;
        // this will proceed the finally block and go back to repeat
        Continue;
      end;
      // code which would be here will execute only if SomeCondition
      // is False, because calling Continue will skip it
    finally
      // code in this block is executed always
    end;
  until
    not TryAgain;
end;

しかし、まったく同じロジックを次のように簡単に書くことができます:

procedure TForm1.Button1Click(Sender: TObject);
begin
  repeat
    TryAgain := False;
    try
      if SomeCondition then
      begin
        TryAgain := True;
      end
      else
      begin
        // code which would be here will execute only if SomeCondition
        // is False
      end;
    finally
      // code in this block is executed always
    end;
  until
    not TryAgain;
end;
于 2013-09-03T22:54:47.977 に答える
7

callあなたは最終的にする必要はありません。を削除するだけで、すべてのループ反復の最後にexit自動的にコードを実行できるようになります。finallyデモ用のコードは次のとおりです。

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  i, j, Dummy: Integer;
  TryAgain: Boolean;

begin
  i := 0;
  Dummy := 0;
  TryAgain := True;
  repeat
    try
      for j := 0 to 200 do
        Dummy := Dummy + 1;
    finally
      Inc(i);
    end;
    TryAgain := (i < 10);
  until not TryAgain;
  WriteLn(i);
  ReadLn;
end.

finallyがすべての反復の最後に実行されなかった場合、は でインクリメントされるだけなrepeatので、決して終了しません。また、実行されていない場合、終了条件が満たされることはありません。代わりに、終了して を出力します。これは、 がループの反復ごとに 1 回実行されていることを示します。(余分な時間が実行されるため、代わりに出力されます。)ifinally11finallyrepeat1110finally

于 2013-09-03T22:49:39.947 に答える