DELPHI: come usare "break" al di fuori del loop o del case?
Domanda
considera il seguente codice pascal 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 }
So che probabilmente ci sono alcune cose polimorfiche che potrei fare con TComponent, ma non è questa la mia domanda. Mi chiedo se c'è un modo per sbarazzarsi della singola ripetizione dell'iterazione. Senza di essa, non posso usare l'istruzione break in nessun punto del blocco di elaborazione e ne ho bisogno per interrompere l'elaborazione in qualsiasi momento.
Soluzione
Comprimilo in una funzione e usa exit per tornare indietro. se è presente più codice per seguire l'istruzione repeat, utilizzare una funzione / procedura locale, ad esempio:
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;
Altri suggerimenti
C'è un altro modo semplice per andare:
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;
Quello che stai effettivamente facendo è usare break come goto. Il suggerimento di Ralph di usare una funzione come ambito è buono. Ma per il resto potresti anche essere onesto e usare un "goto finito". Perdere la ripetizione la renderà effettivamente più leggibile.
Perché vuoi usare break anziché Exit? Break in Delphi non è lo stesso di "break" nelle lingue delle parentesi graffe.
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 sul layout. Se non hai provato a ridurre così tanto gli spazi bianchi, non è così prendi " un'altra ora per assicurarti che tutti i miei if-else siano allineati correttamente " come hai detto in un commento precedente.
Se si dispone del codice che si desidera eseguire dopo questo, utilizzare il suggerimento di Ralph di una procedura locale o concludere in un tentativo ... in definitiva - il codice in finalmente verrà comunque eseguito.