3

次のDelphiPascalコードを検討してください。

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ステートメントを使用できず、いつでも処理を停止する必要があります。

4

4 に答える 4

14

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

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;
于 2009-07-29T16:15:07.750 に答える
5

それを関数にパックし、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;
于 2009-07-29T15:55:50.253 に答える
4

あなたが実際にやっていることは、gotoとしてbreakを使用することです。関数をスコープとして使用するというラルフの提案は良いものです。ただし、それ以外の場合は、正直に「gotofinished」を使用することをお勧めします。リピートを失うと、実際に読みやすくなります。

于 2009-07-29T16:05:10.907 に答える
1

なぜExitではなくbreakを使用したいのですか?Delphiでのブレークは、中括弧言語での「ブレーク」と同じではありません。

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;

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

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

于 2009-07-29T21:52:14.480 に答える