DELPHI: wie „break“ außerhalb der Schleife oder Falles benutzen?
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.
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