DELPHI: comment utiliser & # 8220; break & # 8221; en dehors de la boucle ou de l'affaire?

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

  •  05-07-2019
  •  | 
  •  

Question

considérons le code pascal de Delphi suivant:

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 }

Je sais qu'il y a probablement des trucs polymorphes que je pourrais faire avec TComponent, mais ce n'est pas ma question. Je me demande s'il y a un moyen de se débarrasser de la déclaration répétition-jusqu'à-une seule itération. Sans cela, je ne peux utiliser l'instruction break nulle part dans le bloc de traitement et j'ai besoin de cela pour arrêter le traitement à tout moment.

Était-ce utile?

La solution

Emballez-le dans une fonction et utilisez exit pour revenir en arrière. s'il y a plus de code à suivre après l'instruction de répétition, utilisez une fonction / procédure locale, quelque chose comme:

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;

Autres conseils

Il existe un autre moyen facile de faire:

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;

Ce que vous êtes en train de faire consiste à utiliser break comme un goto. La suggestion de Ralph d'utiliser une fonction comme une étendue est bonne. Mais sinon, vous pourriez aussi bien être honnête et utiliser un 'goto done'. Perdre la répétition le rendra plus lisible.

Pourquoi voulez-vous utiliser break plutôt que Exit? La pause à Delphes n’est pas la même chose que "pause". dans les langues des accolades.

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;

Un point sur la mise en page. Si vous n'essayiez pas de réduire autant les espaces, il se pourrait que Prenez "une heure de plus pour vous assurer que tous mes if-else sont alignés correctement" comme vous l'avez dit dans un commentaire précédent.

Si vous avez du code que vous souhaitez exécuter par la suite, utilisez la suggestion de Ralph concernant une procédure locale ou intégrez un test..finalement - le code de la fonction finally sera toujours exécuté.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top