델파이 : 루프 나 케이스 외부에서 "브레이크"를 사용하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1201260

  •  05-07-2019
  •  | 
  •  

문제

다음 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의 로컬 프로 시저에 대한 제안을 사용하거나 시도한 시도로 랩핑하십시오. 결국 코드의 코드는 여전히 실행됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top