For문을 사용하셨군요. 그래서 오류가 발생한것입니다.
소스를 잘 보시면요...
처음에 For가 시작될때 ControlCount가 10개라고 한경우
Controls[t].free가 수행되고 나면 하나씩 ControlCount가 줄어들게 됩니다.
하지만 For문은 10번을 끝까지 수행하게 되지요..
그러다 어느정도 지나게 되면 Controls[2]이라고 한다면 오류가 나겠지요...
Control의 수는 free에 의해서 2개보다 적은데요...
이런 경우
repeat문이나 while문에 의한 조건 반복문을 권장하고 싶습니다.
수고하십시오.
왕초보 wrote:
> 프로그램을 하나 짜고 있습니다.
> 그 프로그램 내부에...컴포넌트를 생성하고...선택후 삭제하고...
> 머 이런 기능이 있습니다.
> 그런데....
> 컴포넌트를 삭제하면..에러가 납니다.
> list index out of bound(2) 머 이런식으로....
>
> 아래가 그 일부분의 소스입니다.
>
> if Estr = 9999 then
> for t := 0 to pan_map.ControlCount - 1 do
> begin
> if pan_map.Controls[t] is TDandaio then
> if pan_map.Controls[t].name = some then
> pan_map.Controls[t].free;
> end
> else
> for t := 0 to pan_map.ControlCount -1 do
> begin
> if pan_map.Controls[t] is TDandaio then
> if (pan_map.Controls[t] as TDandaio).name = some then
> begin
> (pan_map.Controls[t] as TDandaio).left := UnLocateEast(EStr)- 80;
> (pan_map.Controls[t] as TDandaio).top := UnLocateNorth(NStr) - 60;
> (pan_map.Controls[t] as TDandaio).progress := Forc;
> end;
> end;
>
> 제발 함 보시고...답변좀 올려주세요...
> 그럼...이만.
>
> For문을 사용하셨군요. 그래서 오류가 발생한것입니다.
>
> 소스를 잘 보시면요...
> 처음에 For가 시작될때 ControlCount가 10개라고 한경우
> Controls[t].free가 수행되고 나면 하나씩 ControlCount가 줄어들게 됩니다.
> 하지만 For문은 10번을 끝까지 수행하게 되지요..
> 그러다 어느정도 지나게 되면 Controls[2]이라고 한다면 오류가 나겠지요...
> Control의 수는 free에 의해서 2개보다 적은데요...
>
> 이런 경우
> repeat문이나 while문에 의한 조건 반복문을 권장하고 싶습니다.
> 수고하십시오.
>
> 왕초보 wrote:
> > 프로그램을 하나 짜고 있습니다.
> > 그 프로그램 내부에...컴포넌트를 생성하고...선택후 삭제하고...
> > 머 이런 기능이 있습니다.
> > 그런데....
> > 컴포넌트를 삭제하면..에러가 납니다.
> > list index out of bound(2) 머 이런식으로....
> >
> > 아래가 그 일부분의 소스입니다.
> >
> > if Estr = 9999 then
> > for t := 0 to pan_map.ControlCount - 1 do
> > begin
> > if pan_map.Controls[t] is TDandaio then
> > if pan_map.Controls[t].name = some then
> > pan_map.Controls[t].free;
> > end
> > else
> > for t := 0 to pan_map.ControlCount -1 do
> > begin
> > if pan_map.Controls[t] is TDandaio then
> > if (pan_map.Controls[t] as TDandaio).name = some then
> > begin
> > (pan_map.Controls[t] as TDandaio).left := UnLocateEast(EStr)- 80;
> > (pan_map.Controls[t] as TDandaio).top := UnLocateNorth(NStr) - 60;
> > (pan_map.Controls[t] as TDandaio).progress := Forc;
> > end;
> > end;
> >
> > 제발 함 보시고...답변좀 올려주세요...
> > 그럼...이만.
> >
for문을 아래와 같이 수정하며 error 발생하지 안을 것에요.
for t := pan_map.ControlCount - 1 downto 0 do
보통 컴포넌트 free하는 경우에 뒤에서 부터 해야지.
아니면 에러 발생할 것에요..
왜 그러가 하면 하나를 프리하면 컴포넌트 개수가 하나가 줄어서 개수가 9이 되고
시작위치 0이 됨
0 : 컴
1 : 컴
2 : 컴
3 : 컴
....
10 : 컴
처음 0번째 컴 Free하면
다음 상태로 변경됨
1 : 컴
2 : 컴
3 : 컴
4 : 컴
....
9 : 컴
그래서 10번 부터 free해야함...
0 : 컴
1 : 컴
2 : 컴
3 : 컴
....
9 : 컴