DELPHI: cómo usar & # 8220; break & # 8221; fuera de bucle o caso?
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.
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á.