DELPHI: как пользоваться & # 8220; break & # 8221; вне цикла или дела?

StackOverflow https://stackoverflow.com/questions/1201260

  •  05-07-2019
  •  | 
  •  

Вопрос

рассмотрим следующий код на языке Delphi:

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 где-либо в блоке обработки, и мне нужно, чтобы он прекратил обработку в любое время.

Это было полезно?

Решение

Упакуйте его в функцию и используйте выход для возврата назад. если есть код, следующий за оператором повторения, используйте локальную функцию / процедуру, что-то вроде:

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(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;

Что вы на самом деле делаете, так это используете break как goto. Предложение Ральфа использовать функцию в качестве области является хорошим. Но в противном случае вы можете быть честными и использовать «готово». Потеря повтора сделает его более читабельным.

Почему вы хотите использовать разрыв, а не выход? Break в Delphi - это не то же самое, что «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 правильно выстроены» как вы сказали в предыдущем комментарии.

Если у вас есть код, который вы хотите выполнить после этого, либо воспользуйтесь предложением Ральфа о локальной процедуре, либо перенесите попытку try..finally - код в finally все равно будет выполнен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top