3

考虑以下德尔福帕斯卡代码:

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 语句,我需要它来随时停止处理。

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 跳转回来。如果重复语句后面有更多代码,请使用本地函数/过程,例如:

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

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

于 2009-07-29T16:05:10.907 回答
1

为什么要使用 break 而不是 Exit?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 都正确排列”。

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

于 2009-07-29T21:52:14.480 回答