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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top