DELPHI:使用方法“ break”ループまたはケースの外側?

StackOverflow https://stackoverflow.com/questions/1201260

  •  05-07-2019
  •  | 
  •  

質問

次のデルファイパスカルコードを検討してください:

var
  tc: TComponent
begin
{ do something to get tc }
repeat
  if(tc is TDBEdit)then begin
    if(check_something_about_edit(tc))then break;
    do_something_else_edit(tc);
    break;
  end else if(tc is TBMemo) then begin
    if(check_something_about_memo(tc))then break;
    do_something_else_memo(tc);
    break;
  end;
  raise exception.create('invalid component type');
until(true); {single iteration look required to use break }

TComponentでできることはおそらく多態的なものがあることは知っていますが、それは私の質問ではありません。単一の繰り返しrepeat-untilステートメントを削除する方法があるかどうか疑問に思っています。これがないと、処理ブロック内のどこでもbreakステートメントを使用できず、いつでも処理を停止する必要があります。

役に立ちましたか?

解決

関数にパックし、exitを使用してジャンプします。 repeatステートメントの後に続くコードがある場合は、次のようなローカル関数/手順を使用します。

procedure ...
  procedure testsomething(tc: TComponent);
  begin 
    if(tc is TDBEdit)then begin
      if(check_something_about_edit(tc))then exit;
      do_something_else_edit(tc);
      exit;
    end else if(tc is TBMemo) then begin
      if(check_something_about_memo(tc))then exit;
      do_something_else_memo(tc);
      exit;
    end;
    raise exception.create('invalid component type');
  end;

var
  tc: TComponent;
begin
{ do something to get tc }
  try
    TestSomething(tc);
    { do something more }
  except
     ...
  end;
end;

他のヒント

別の簡単な方法があります:

if(tc is TDBEdit)then begin
  if not (check_something_about_edit(tc)) then
    do_something_else_edit(tc);
end else if(tc is TBMemo) then begin
  if not (check_something_about_memo(tc)) then
    do_something_else_memo(tc);
end else
  raise exception.create('invalid component type');
end;

実際に行っているのは、breakをgotoとして使用することです。関数をスコープとして使用するというRalphの提案は良いものです。しかし、それ以外の場合は、正直に言って「goto finished」を使用することもできます。繰り返しを失うと、実際に読みやすくなります。

Exitではなくbreakを使用する理由Delphiでのブレークは" break"とは異なります。中括弧言語で。

var
  tc: TComponent
begin
  { do something to get tc }
  if (tc is TDBEdit) then 
  begin
    if not (check_something_about_edit(tc)) then 
      do_something_else_edit(tc);
    Exit;
  end;
  if (tc is TBMemo) then 
  begin
    if not (check_something_about_memo(tc)) then 
      do_something_else_memo(tc);
    Exit;
  end;
  raise exception.create('invalid component type');
end;

レイアウトに関するポイント。空白をあまり削減しようとしないと、 「もう1時間かかって、if-elseがすべて正しく整列していることを確認してください」以前のコメントで言ったように。

この後に実行するコードがある場合は、Ralphのローカルプロシージャの提案を使用するか、try..finallyでラップします。最終的に実行されるコードは引き続き実行されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top