델파이 : 루프 나 케이스 외부에서 "브레이크"를 사용하는 방법은 무엇입니까?
문제
다음 Delphi Pascal 코드를 고려하십시오.
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와 함께 할 수있는 다형성의 것들이 있다는 것을 알고 있지만 그것은 내 질문이 아닙니다. 단일 반복 반복문을 제거 할 수있는 방법이 있는지 궁금합니다. 그것 없이는 처리 블록의 어느 곳에서나 Break 문을 사용할 수 없으며 언제든지 처리를 중지해야합니다.
해결책
기능으로 포장하고 출구를 사용하여 뒤로 점프하십시오. 반복 문을 따르는 코드가 더 있으면 로컬 함수/절차를 사용하십시오.
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 완료'를 사용할 수도 있습니다. 반복을 잃으면 실제로 더 읽기 쉬워집니다.
출구보다는 브레이크를 사용하고 싶은 이유는 무엇입니까? 델파이의 휴식은 곱슬 브레이스 언어에서 "브레이크"와 같지 않습니다.
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;
레이아웃에 대한 요점. 당신이 창백원을 너무 많이 줄이려고하지 않으면 이전 의견에서 말한 것처럼 "내 모든 if-else가 올바르게 줄 지어 있는지 확인하는 데 또 다른 시간이 걸리지 않을 것입니다.
이 후에 실행하려는 코드가있는 경우 Ralph의 로컬 프로 시저에 대한 제안을 사용하거나 시도한 시도로 랩핑하십시오. 결국 코드의 코드는 여전히 실행됩니다.
제휴하지 않습니다 StackOverflow