감사합니다.
박지훈님 덕분에 몰랐던 좋은 정보를 배워갑니다~
박지훈.임프 님이 쓰신 글 :
: 아직 C++빌더의 방식에 익숙하지 않으신 것 같습니다.
: C++빌더에서 모든 컴포넌트는, Owner 구조를 이용해서 자동으로 해제가 가능합니다. 그래서 명시적으로 delete를 할 필요가 없습니다.
: 모든 컴포넌트의 조상인 TComponent 클래스의 생성자를 보면 단 하나의 인자 Owner를 가지고 있으며, 이 Owner로 다른 컴포넌트를 지정해주면 그 컴포넌트가 현재 생성중인 컴포넌트의 메모리 해제를 책임지게 됩니다.
:
: [VCL] Sender, Parent, this, Owner 에 대한 설명
:
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_faq&no=15
:
: 문경재님의 코드에서 메뉴아이템을 생성하는 코드에 보시면 new TMenuItem(Application) 이렇게 하셨으니, Application 객체를 Owner로 지정하신 것입니다. 이것은 객체가 해제될 때 이 메뉴아이템 객체가 덩달아 해제된다는 의미입니다.
:
: 폼에 속한 컴포넌트를 생성하면서 Owner로 Application을 지정한 것은 좀 적절하진 않은데요. 애플리케이션이 실행중인 상태에서 이 폼이 중간에 해제될 수도 있는데, 그렇게 되면 이 메뉴아이템은 애플리케이션이 끝날 때까지 계속 메모리를 점유하게 됩니다.
:
: 그래서 당연히, 폼에 속한 컴포넌트를 동적 생성할 때는 Owner를 폼으로 지정하는 것이 가장 일반적입니다. 반드시 Owner로 Application을 지정해야 하는 경우도 있는데요, 폼을 동적으로 생성할 때죠.
:
: 컴포넌트나 폼을 동적으로 생성할 때 이 Owner를 지정하지 않고 대신 NULL을 넘길 수도 있습니다. 그러면 짐작하시겠지만 누구도 해당 객체의 해제를 자동으로 해주지 않으므로 개발자가 직접 delete로 삭제해야 합니다.
:
: 이 Owner 방식은 자바 등의 가비지컬렉션과 좀 비슷한 효과를 갖지만, 가비지컬렉션처럼 느리지도 않고 가비지컬렉션처럼 복잡한 로직으로 동작하지도 않습니다. 심플하고 빠릅니다.
:
:
:
: 문경재 님이 쓰신 글 :
: : 콤보박스에 적혀 있는 갯수만큼 메뉴아이템을 추가해야해서
: :
: : 콤보박스의 내용이 변경될때마다
: :
: : //콤보박스만큼돌면서 팝업메뉴에 넣어주기
: : for(int i = 0 ; i < AdvComboBox3->Items->Count ; i++)
: : {
: : TMenuItem * miStatus = new TMenuItem(Application);
: : miStatus->Caption = AdvComboBox3->Items->Strings[i];
: : PopupMenu1->Items->Insert(i,miStatus);
: : }
: :
: : 이런식으로 했는데요.
: :
: : 질문1. new를 했으니 어딘가에서 delete를 해줘야할것 같은데 콤보박스가 계속 바뀌어서..어디서 해줘야 할지...
: :
: : 질문2. 동적으로 만들어진 menuItem을 클릭했을때 이벤트를 발생시키려면 어떻게 해야하는지..
: :
: :
: :
: : 감사합니다.~