C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[14] 팁! 동적생성된 컴퍼넌트를 TList에서 삭제...
박지훈.임프 [] 10079 읽음    1999-06-04 00:00
임펠리테리입니다.
방금 비파툴에서 답변하고 오는 길인데.. 이점은 의외로 실수하기 쉽겠다 싶어서,
오늘의 팁으로 올립니다.

동적으로 컴퍼넌트를 생성할때, 그 갯수를 정확히 예측할 수 없거나 아주 많을 경우
TList에다 그 컴퍼넌트의 포인터를 저장합니눼? 아주 많이 쓰이는 코딩이죠.
그리고 삭제할때는? 리스트 객체의 Delete 메소드를 쓰면 그 컴퍼넌트가 삭제될까요?

정답은... "안된다" 입니다. 보통은 된다고 착각하기 쉽겠죠.
하지만, 논리적으로 가만히 생각해보면 이게 사실이 아님을 금방 알수 있습니다.
컴퍼넌트를 삭제하려면 그 컴퍼넌트의 destructor를 호출해야 합니다.
그리고 destructor를 호출하려면 당연히 그 destructor가 있는 클래스를 알아야 합니
다. 다시 말해서, type을 모르면 destructor를 호출할 수 없고, 결과적으로 컴퍼넌트
삭제는 불가능합니다.
그런데 TList 객체는 어떤 객체든 void *형으로 저장합니다. 당연히 TList 객체의
Delete 메소드는 컴퍼넌트를 삭제해줄 수 없습니다.

예를 들어서 다음과 같이 버튼들을 동적으로 생성했다고 합시다.
TList *MyButtonList = new TList;
for(int i=0; i<100; i++)
{
    TButton *TempButton = new TButton(this);
    TempButton->Parent = this;
    MyButtonList->Add(TempButton);
}


이 경우 컴퍼넌트 삭제는 다음과 같이 해야 합니다.
while(MyButtonList->Count)
{
    delete (TButton *)(MyButtonList->Items[0]);
    MyButtonList->Delete(0);
}


빌더 프로그래밍에 익숙하신 분들도 의외로 실수하시기 쉬운 부분이죠.
그럼 도움되시길 바랍니다...



독립문에서 임펠리테리였습니다.

+ -

관련 글 리스트
14 팁! 동적생성된 컴퍼넌트를 TList에서 삭제... 박지훈.임프 10079 1999/06/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.