Frage

den folgenden delphi pascal Code betrachten:

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 }

Ich weiß, dass es wahrscheinlich einige polymorphen Sachen, die ich mit TComponent tun könnte, aber das ist nicht meine Frage. Ich frage mich, ob es einen Weg gibt, der einzige Iteration loszuwerden repeat-until-Anweisung. Ohne sie kann ich verwenden, um die break-Anweisung überall in dem Verarbeitungsblock nicht, und ich brauche, dass die Verarbeitung jederzeit zu beenden.

War es hilfreich?

Lösung

Packen Sie es in eine Funktion und verwenden Ausgang zurück zu springen. wenn es mehr Code ist der repeat-Anweisung zu folgen, verwenden Sie eine lokale Funktion / Prozedur, so etwas wie:

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;

Andere Tipps

Es ist ein weiterer einfache Weg zu gehen:

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;

Was Sie tun, ist eigentlich Pause als gehe zu verwenden. Ralph Vorschlag, eine Funktion zu verwenden, wie ein Rahmen gut ist. Aber sonst könnte man auch ehrlich sein und verwendet einen ‚goto fertig‘. die Wiederholung verlieren wird es tatsächlich besser lesbar machen.

Warum wollen Sie Pause verwenden, anstatt Verlassen? Pause in Delphi ist nicht die gleiche wie „Pause“ in den geschweiften Klammer Sprachen.

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;

Ein Punkt über das Layout. Wenn Sie nicht Leerzeichen so viel zu reduzieren versuchen es vielleicht nicht nehmen „noch eine Stunde, um sicherzustellen, dass alle meine if-else der aufge korrekt“, wie Sie in einem frühen Kommentar sagten.

Wenn Sie Code, den Sie danach ausgeführt werden soll, entweder Ralph Vorschlag eines lokalen Verfahren verwenden, oder wickeln Sie sie in einem try..finally -. Den Code in das schließlich wird noch ausgeführt werden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top