Pregunta

considere el siguiente código de 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 }

Sé que probablemente hay algunas cosas polimórficas que podría hacer con TComponent, pero esa no es mi pregunta. Me pregunto si hay una manera de deshacerse de la iteración de repetición única hasta que aparezca. Sin él, no puedo usar la instrucción break en ningún lugar del bloque de procesamiento, y necesito eso para detener el procesamiento en cualquier momento.

¿Fue útil?

Solución

Empacalo en una función y usa exit para saltar hacia atrás. Si hay más código para seguir la instrucción de repetición, use una función / procedimiento local, algo como:

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;

Otros consejos

Hay otra manera fácil de seguir:

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;

Lo que realmente estás haciendo es usar break como un goto. La sugerencia de Ralph de usar una función como un alcance es buena. Pero, de lo contrario, podrías ser honesto y usar un "ir a terminar". Perder la repetición lo hará más legible.

¿Por qué quieres usar break en lugar de Exit? Break in Delphi no es lo mismo que " break " en los idiomas de la llave.

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 punto sobre el diseño. Si no tratara de reducir tanto los espacios en blanco, no podría toma " otra hora para asegurarte de que todos mis if-else estén alineados correctamente " como dijiste en un comentario anterior.

Si tiene un código que desea ejecutar después de esto, use la sugerencia de Ralph de un procedimiento local, o envuélvalo en un intento ... finalmente, el código que se encuentra finalmente se ejecutará.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top