DELPHI:使用方法“ break”ループまたはケースの外側?
質問
次のデルファイパスカルコードを検討してください:
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 }
TComponentでできることはおそらく多態的なものがあることは知っていますが、それは私の質問ではありません。単一の繰り返しrepeat-untilステートメントを削除する方法があるかどうか疑問に思っています。これがないと、処理ブロック内のどこでもbreakステートメントを使用できず、いつでも処理を停止する必要があります。
解決
関数にパックし、exitを使用してジャンプします。 repeatステートメントの後に続くコードがある場合は、次のようなローカル関数/手順を使用します。
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;
他のヒント
別の簡単な方法があります:
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;
実際に行っているのは、breakをgotoとして使用することです。関数をスコープとして使用するというRalphの提案は良いものです。しかし、それ以外の場合は、正直に言って「goto finished」を使用することもできます。繰り返しを失うと、実際に読みやすくなります。
Exitではなくbreakを使用する理由Delphiでのブレークは" break"とは異なります。中括弧言語で。
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;
レイアウトに関するポイント。空白をあまり削減しようとしないと、 「もう1時間かかって、if-elseがすべて正しく整列していることを確認してください」以前のコメントで言ったように。
この後に実行するコードがある場合は、Ralphのローカルプロシージャの提案を使用するか、try..finallyでラップします。最終的に実行されるコードは引き続き実行されます。
所属していません StackOverflow