6

whileループはbreakで終了できます。

ifから抜け出す方法 。

Delphiには一種のGOTOがありますか?

procedure ...
begin

  if .... then
    begin

      here the code to execute

      if (I want to exit = TRUE) then
        break or GOTO

      here the code not to execute if has exited

    end;

  here the code to execute

end;
4

9 に答える 9

12

のようPiskvor mentionedに、ネストされた if ステートメントを使用します。

procedure Something;
begin    
  if IWantToEnterHere then
  begin
    // here the code to execute    
    if not IWantToExit then
      // here the code not to execute if has exited
  end;    
  // here the code to execute
end;
于 2012-07-27T10:48:06.357 に答える
4

私はこの方法で Exit を使用することに賛成ではありませんが、あなたはそれを求めました...

@mrabat が @Arioch へのコメントで提案したように、「答えとして、Exit と例外に関係なく、finally ブロックが常に実行されるという事実を利用して、ここで有利になることができます。

procedure ...
begin

  if Cond1 then
  try
    // Code to execute

    if Cond2 then
      Exit;

    // Code NOT to execute if Cond2 is true
  finally
    // Code to execute even when Exit was called
  end;
end;
于 2012-07-27T14:02:50.607 に答える
3

これは通常、次のように実装されます。

function testOne: Boolean;
begin
  ...
end;

function testTwo: Boolean;
begin
  ...
end;

procedure runTests;
var
  bOK: Boolean;

begin
  bOK = True;

  if bOK then
  begin
    // Test something
    bOK = testOne;
    // If we passed, keep going
  end;

  if bOK then
  begin
    // Test something else
    bOK = testTwo;
    // If we passed, keep going
  end;

  ...
end;
于 2012-07-27T15:01:25.247 に答える
2

さまざまなコメントを読んだ後、 GoTo命令の使用方法を示す回答を投稿することにしました...ところで、他の回答で説明されている他の方法を好み、その使用を避けます:

procedure ...
label
  CodeToExecute;
const
  iWantToExit = True;
begin
  if ... then
    begin
      ShowMessage('here the code to execute 1');
      if iWantToExit then
        goto CodeToExecute;

        ShowMessage('here the code not to execute if has exited');
    end;

CodeToExecute:
  ShowMessage('here the code to execute 2');

end;
于 2012-07-27T16:16:46.587 に答える
2

一般に、break や GOTO の使用はエレガントなプログラミング スタイルとは見なされません。条件を逆にして、次のように言うことをお勧めします。

procedure ...
begin

  if .... then
    begin

    here the code to execute

    If (I want to exit <> TRUE) then
      here the code to execute if has exited( in your original code)

end;

ここで実行するコード

終わり;

于 2012-07-27T10:23:37.187 に答える
2

例外を使用できます。

内側の if またはループで Abort を呼び出し、続行したい場所で EAbort 例外をキャッチします

procedure ...
begin

 try 
  if .... then
    begin

      (*      here the code to execute  *)

      if I_want-to-exit then Abort;

      (*      here the code not to execute if has exited *)

    end;
  
   except on E: EABORT do ;
   end;

   (*  here the code to execute *)
end;

アップデート。誰かがこれに賛成しました。トピックはずっと前に埋葬されていないようです。わかりました、それからあちこちのコメントに埋もれていたものの簡単な要約を与えます。

このアプローチは、Marjan の try-exit-finally よりも劣る可能性があります。彼の回答を参照してください: https://stackoverflow.com/a/11689392/976391

例外は、Delphi ではいくらか安価です。Borland はこれに関する特許をほとんど保有していませんが、それでも+finallyよりも高速に実行される可能性があります。raiseexcept

OTOH、このアプローチは、例外のキャンセルと異なるクラスを使用できるため、いくつかのネストされた終了可能な if ブロックと異なる終了ターゲットを持つように一般化できます。そして、except-block が単なる終了アンカーであり、実際のコードがその内部ではなくその後ろにある場合 (finally-solution に必要なように)、コードが少しきれいになり、開発者 (トピックの開始者) の一連の思考をより適切に表現しているように感じます。 )。

type EExitException1 = class(Exception) end;
type EExitException2 = class(Exception) end;
procedure ...
begin

 try 
  if .... then
    begin

      (*      here the code to execute  *)
       try
         if .... then
         begin

            (*      here the nested code to execute  *)


            if I_want-to-exit then raise EExitException1.Create();

            (** ...  **)
            if I_want-to-exit-far-away then raise EExitException2.Create();

            (*      here the code not to execute if if-block cancelled *)

         end; // if

       (*      here the code to execute  *)  

       if I_want-to-exit-outer-if-here then raise EExitException2.Create();

        (*      here the code not to execute  *)  

       except on E: EExitException1 do ; end; // killing the exception
           
       (*      here the code to execute after the outer if-block exit *)

    end;

   (* one more piece of skippable code *)
  
   except on E: EExitException2 do ; end;

   (*  here the code to execute yet again *)
end;

ただし、この一般化は、別の種類のスパゲッティにも急速に変化する傾向があります。

確かに、問題そのものは厄介なようで、全体のリファクタリングが必要です。すべてのソリューションをリファクタリングしないと、何らかの形で面倒になります。はしご、普通の古いgoto、旗の vars の場合 - あなたの毒を選んでください。どちらが醜くないかは死ぬまで議論できますが、それらはすべて醜いです.

于 2012-07-27T10:37:39.410 に答える
1

文 の代わりにローカルinlineプロシージャを使用します。文はコードの可視性を低下させます。GOTOGOTO

procedure ...

  procedue Check; inline;
  begin
    if .... then
      begin

        here the code to execute

        if (I want to exit = TRUE) then
          exit;

        here the code not to execute if has exited

      end;
  end;

begin

  Check;

  here the code to execute

end;
于 2012-07-27T10:52:03.000 に答える
0

次のメソッドを使用して、'break' を使用して 'if' ブロックから抜け出すことができます。次の例では、フォームに 2 つの編集ボックスがあることを前提としています。repeat ... until true;通常のものに置き換えますbegin ... end;

   if ... then
   repeat
     Edit1.Text := 'test';
     if someCondition then 
       break;
     Edit2.Text := 'test';
   until true;

編集:明確化、解決策は、質問が頭の体操であると仮定することです。これは、状況を処理するための推奨される方法ではなく、コードでこれを使用することはありません。

于 2012-07-27T17:53:25.910 に答える