6

您可以使用break退出while循环。

如何退出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 的评论中建议的那样,“答案是,您可以利用 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

通常使用 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;

UPD。有人刚刚对此表示赞同。似乎这个话题很久以前就被埋没了。好的,然后快速总结一下这里和那里的评论中隐藏的内容。

这种方法可能不如 Marjan 的 try-exit-finally 一种,见他的回答:https ://stackoverflow.com/a/11689392/976391

Delphi 中的例外情况稍微便宜一些,Borland 在这方面持有的专利很少,但仍然finally可能比raise+执行得更快except

OTOH,由于可以使用异常取消和不同的分类,这种方法可以概括为具有多个嵌套的可退出 if 块和不同的退出目标。而且我觉得代码更简洁,更好地表达了开发人员(主题启动者)的思路,当 except-block 只是一个退出锚点时,真正的代码在它之后,而不是在它里面(最终解决方案所需要的) )。

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,标志变量 - 选择你的毒药。我们可以争论到底哪一个不那么丑,但他们都丑。

于 2012-07-27T10:37:39.410 回答
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 回答
1

使用本地inline程序代替GOTO语句; GOTO这句话降低了代码的可见性。

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”块。以下示例假设表单上有两个编辑框。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 回答
-1

可读代码

// if cond1 then if cond2 then if cond3 then -

procedure cond1_cond3;
begin

  if 
   not(Cond1) then exit;

cond1_work;

  if 
   not(Cond2) then exit;

cond2_work;

  if 
   not(Cond3) then exit;

cond3_work;


end;

procedure All_Work;

begin
   All_work_1;

   cond1_cond3; 

  All_work_2; 

end
于 2019-10-03T09:28:55.333 回答