음...
TNotebook은 TPageControl과 비슷합니다.
1. TPageControl 에 TabSheet를 추가하고 그위에 control을 동적으로 올릴때
Control의 Parent를 무엇으로 설정해줄까요? TPageControl 일까요?
아닙니다. TTabSheet입니다.
마찬가지로 TNotebook도 동적으로 control을 activepage에 올리려면?
TNotebook이 아닌 activepage의 control을 parent로 설정해 줘야 합니다.
2. 그럼 TNotebook에 control이 올라가는 컨테이너 컨트롤의 이름은 뭘까요?
TNotebook에 Button하나 올리고 Click이벤트에 아래오 같이 코딩해보세요
void __fastcall TForm1::Button5Click(TObject *Sender)
{
String str=Button5->Parent->ClassName();
ShowMessage(str);
}
Parent control의 classname은 TPage 로 나옵니다.
즉 동적으로 control을 new해서 parent를 설정해줄때 TPage형으로 해줘야 하는것입니다.
그런데 TNotebook에는 각 page에서 TPage를 알수 있는 방법(Method)가 없습니다.
3. 그래서 TNotebook의 vcl소스를 봤습니다.
TNotebook = class(TCustomControl)
private
FPageList: TList;
FAccess: TStrings;
FPageIndex: Integer;
...
위와같이 정의되어있더군요
코드를 보면 TPage는 TNotebook의 FPageList에 들어있습니다.
그런데 FPageList는 private멤버죠
그냥은 접근이 안되죠
4. 하지만 private멤버라도 얼마든지 접근할수 있습니다.
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=723
위 링크에 private멤버 접근하는 몇가지 방법에 대해 소개 해 놓았습니다.
5. 결론적으로
님의 코딩에서 Frame의 Parent만 TNotebook의 FPageList에 있는 TPage 컨트롤로 설정해주시면 됩니다.
그럼..
모나리자 님이 쓰신 글 :
: 안녕 하세요.
: 몇칠째 찾아 보고 연구 해보고 했지만 잘 돼지 않아서 이렇게 글을 올리 됩니다.
: 미리 생성해둔 Fream을 동적으로 생성 해서 TNotebook 페이지에 Fream을 넣으려고 합니다.
: 제가 만든 예제 소스를 보여 드리자면...
: //---------------------------------------------------------------------------
: void __fastcall TForm1::Notebook_Add(AnsiString strPageName)
: {
: int iPageIndex;
:
: Notebook->Pages->Add(strPageName);
: iPageIndex = Notebook->Pages->IndexOf(strPageName);
: Notebook->PageIndex = iPageIndex;
:
: TFrame2 * pNewFrame = new TFrame2(NULL);
: pNewFrame->Align = alClient;
: pNewFrame->Parent = Notebook;
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: //
: Notebook_Add("A");
: }
: //---------------------------------------------------------------------------
: 이런 식입니다...
: Button1을 클릭 했을 경우 Notebook_Add 함수를 호출 합니다.
: Notebook_Add 함수에서 페이지를 추가 하고 IndexOf 함수로 페이지 이름을 찾아 인덱스를 설정 합니다.
: 그리고 동적으로 Fream을 생성 하여 Notebook에 Fream에 넣습니다..
:
: 제 이론이 맞는지 알수 없지만..저렇게 하면 될꺼 같은데 잘 돼지 않습니다.ㅠ