【问题标题】:DELPHI: how to use "break" outside of loop or case?DELPHI:如何在循环或案例之外使用“中断”?
【发布时间】:2009-07-29 15:53:58
【问题描述】:

考虑下面的 delphi pascal 代码:

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 做一些多态的东西,但这不是我的问题。我想知道是否有办法摆脱单次迭代重复直到语句。没有它,我无法在处理块的任何地方使用 break 语句,我需要它随时停止处理。

【问题讨论】:

  • 确实,你可以做一些“多态的东西”;这两种组件类型都来自TCustomEdit。将tc 的声明更改为那个。
  • +1。尽管您发布的代码很糟糕,但您问如何改进它是正确的。每当您有一个永远不会执行多次的循环时,您就做错了。

标签: delphi syntax pascal break


【解决方案1】:

还有另一种简单的方法:

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;

【讨论】:

  • 我认为这比您发布的第一个更好。
  • 我把另一个留在里面,也许它在类似的环境中会很有用。
  • 今天下午我是这样重写的。像往常一样,插入“中断”使代码工作,只需要大约 10 分钟就可以完成。正确编写代码又花了一个小时来确保我所有的 if-else 都正确排列。这只是我之前遇到的一个问题,我更想知道使用单个交互循环是否正确,以便您可以使用 break 语句。
【解决方案2】:

将其打包成一个函数并使用exit 跳转回来。如果重复语句后面有更多代码,请使用本地函数/过程,例如:

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-else 解决方案在这种特定情况下更正确,但这种解决方案更适用于现实生活中的情况。它需要移动一堆代码,但这没关系。我更喜欢把事情做对。
【解决方案3】:

您实际上在做的是使用 break 作为 goto。 Ralph 建议使用函数作为作用域是一个很好的建议。但除此之外,您还不如诚实并使用“goto finished”。省略重复会使它实际上更具可读性。

【讨论】:

  • 好吧,你想出了一个非常邪恶的 break 用法。无论如何,break/continue 都是结构化的 goto。
【解决方案4】:

为什么要使用 break 而不是 Exit? Delphi 中的 Break 与花括号语言中的“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;

关于布局的一点。如果您没有尝试过多地减少空格,则可能不会 正如您在之前的评论中所说,“再花一个小时确保我所有的 if-else 都正确排列”。

如果您有想要在此之后执行的代码,请使用 Ralph 对本地过程的建议,或者包装在 try..finally 中 - finally 中的代码仍将被执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多