|
제가 너무 많은 이야기를 써서 질문의 요지를 파악하기가 힘드셨던 듯 하군요.
일단, 제가 만들고 있는 컨트롤 자체에 대해서는 모두 잊으시구요,
결론적으로는 다음과 같은 경우에 어떻게 처리하는가의 문제입니다.
1. 비어있는 폼 하나에 두개의 PageControl을 배치합니다.
2. PageControl1에 두개의 페이지를 추가합니다. TabSheet1과 TabSheet2가
Form1의 멤버로 들어갈겁니다.
3. PageControl2에도 역시 두개의 페이지를 추가합니다. TabSheet3와 TabSheet4가
Form1의 멤버로 추가될 것입니다.
4. 이제 폼의 헤더에는
TPageControl* PageControl1;
TPageControl* PageControl2;
TTabSheet* TabSheet1;
TTabSheet* TabSheet2;
TTabSheet* TabSheet3;
TTabSheet* TabSheet4;
이와 같은 형태가 들어갈겁니다.
5. PageControl의 ActivePage프라퍼티를 생각해보죠. ActivePage 프라퍼티는
TTabSheet* 타입의 프라퍼티이며,
__property TTabSheet* ActivePage = {read=FActivePage, write=SetActivePage};
와 같은 형태로 정의되어 있습니다.
6. 만약에 여러분의 새로 만드는 컴포넌트에 이와 같은 프라퍼티를 추가했다고 생각해 보죠.
오브젝트인스펙터에서 ActivePage의 콤보버튼을 누르면, 어떤 컨트롤이 나오겠습니까?
단순히 프라퍼티만 추가한 상태라면 동일한 타입, 즉 TTabSheet* 타입의 모든 멤버들이
후보가 됩니다. 즉,
TabSheet1, TabSheet2, TabSheet3, TabSheet4 4개가 표시됩니다.
그러나, 페이지 컨트롤에서 보면
PageControl1에서는 TabSheet1, TabSheet2 즉, 자신의 자식에 해당하는 컴포넌트만 나옵니다.
제 질문은 이런걸 어떻게 구현하는 것인가 입니다.
제가 만든 컨트롤은 TDefaultEditor를 상속받아 이를 에디터 클래스로 사용합니다.
TDefaultEditor->Designer를 참조하면 IFormDesigner를 얻을 수 있고,
IFormDesigner에는 GetComponentNames라는 가상함수가 있습니다.
제가 보기엔 이 GetComponentNames 함수를 오버라이드 시키거나, Proc를 가로채면 되는 문제인
듯 한데... 해답을 찾기가 어렵군요.
어떻게 풀 수 있을까요?
지금 뉴스그룹을 뒤져서 비슷한 질문을 몇개 봤는데 어렵다는 얘기 뿐, 시원한 답이 안보이네요
볼렌드 커뮤니티에서는 아예 IFormDesigner를 키워드로 아무것도 안나오구요..
김성진.kark 님이 쓰신 글 :
: 안녕하세요.. 카크랍니다.
:
: 솔직히 어떤 상황인지 잘 모르겠군요..^^
:
: 몰라도 답변올리는 용기 대단하져..^^ (길게 썼는데 아무런 언급이 없으면
:
: 짜증나자나요..)
:
: 근데 좀 의아한게, 보통 PageControl에서는 여러개의 TabSheet가 있을때
:
: Next Page, Previous Page가 항상 Enable 되어 있어서 마지막에서 next를
:
: 선택하면 젤 처음으로가고..이런 식으로 동작하자나요. 결국..패패루님의
:
: 의도를 파악 못한것 같다는 겁니다.. ㅜ.ㅜ
:
: : 이런식으로 같은 타입의 멤버 중 특정 조건에 맞는 것만 선택 가능하게 제
: : 한하는 것을 어떻게 처리하는지가 궁금합니다.
:
: 이 부분도 좀 의아하지만 콤포넌트를 찾아서 조건에 맞는것을 찾는 정도만이라면
:
: 아래와 같이 할수 있겠네요..
:
: unsigned short i;
: TClass ClassRef;
:
: for(i=0;i<ComponentCount-1;i++)
: {
: ClassRef = Components[i]->ClassType();
:
: if(String(ClassRef->ClassName())=="TTabSheet")
: {
: // 원하는 검색조건을 넣으시구..
: if(dynamic_cast<TnWizardPage *>(Components[i])->Name == "nWizardPage1")
: // 조건 제한에 따른 무언가...
: }
: }
:
: 다시한번 자세히 설명 올리시면, 많은 분들이 도움을 주실것 같습니다..^^
:
: 패패루님 어여 완성하셔서...공개하시는 날이 오길..
:
: 수거하세여..
:
: 패패루 님이 쓰신 글 :
: : 현재 만들고 있는 위저드컨트롤은, TPageControl과 유사한 방식으로
: : 동작합니다.
: :
: : 음.. NewPage를 하면, 새로운 위저드페이지가 삽입되면서, 페이지 위
: : 치에 따라 배경 그림과 각종 기본 캡션이 자동으로 그려지는 방식이구
: : 요, 각 페이지에는 NextPage와 PriorPage라는 프라퍼티가 있어서
: : 이 값이 NULL인 경우 Next버튼이나 Prior버튼이 Disable 처리되는 구조
: : 입니다.
: :
: : 따라서 이 컨트롤을 써서 위저드를 구현할 경우, 라디오버튼 등에 의해
: : 페이지 분기가 일어난다는지 하는 액션을 효율적으로 구현할 수 있고
: : 아무튼 제가 지금까지 본 위저드컨트롤보다 훨씬 편리할 것 같습니다.
: : 완성되면 이 사이트에도 공개할거구요.
: :
: : 빌더 컴포넌트 제작에 필요한 거의 모든 기술을 다 쓰게 되는것 같네요.
: : 저 역시 20여개의 컴포넌트를 만들어봤지만 이런 형태의 컴포넌트는
: : 처음이라서 많이 헤매고 있습니다.
: :
: : 지금 잘 안되는 것은, 각 페이지의 NextPage와 PriorPage 프라퍼티에
: : 넣을 수 있는 페이지포인터를 제한하는 것인데,
: : 좀 쉽게 설명드리자면, 폼에 PageControl을 2개를 박아 넣고, 각각
: : 2개의 TabSheet를 만듭니다.
: : 이렇게 하면, Form에는 PageControl1, PageControl2, TabSheet1,
: : TabSheet2, TabSheet3, TabSheet4, 여섯개의 멤버가 추가되겠죠.
: :
: : PageControl1에서 ActivePage프라퍼티의 콤보박스를 선택하면, TabSheet1과
: : TabSheet2만 선택이 가능하죠.
: : PageControl2에서는 역시 TabSheet3와 TabSheet4만 선택이 가능하구요.
: :
: : 이런식으로 같은 타입의 멤버 중 특정 조건에 맞는 것만 선택 가능하게 제
: : 한하는 것을 어떻게 처리하는지가 궁금합니다.
: :
: : 제 컨트롤의 이름은 TnWizard이고, 각각의 페이지는 TnWizardPage입니다.
: : 이 TnWizardPage의 프라퍼티인 NextPage와 PriorPage는 모두 TnWizardPage*
: : 타입의 프라퍼티이구요.
: : 프라퍼티의 속성상, 자신의 포인터는 지정할 수 없어야 하고, 페이지가 맨
: : 첫페이지이거나 맨 마지막 페이지인 경우에는 각각 PriorPage와 NextPage에는
: : NULL만이 들어갈 수 있어야 합니다.
: : 현재는 SetNextPage() 메쏘드에서 이를 채크하여 거부하는 구조인데, TPageControl
: : 에서 이루어지는 것 처럼 아예 대입할 수 있는 후보목록에서 나오지 않게 하고
: : 싶습니다.
: : 즉, 맨 처음 페이지에서 PriorPage 프라퍼티의 콤보박스를 선택하면, 선택할 수 있
: : 는 페이지포인터가 전혀 없고,
: : 두번째 페이지에서는 두번째 페이지의 포인터 외에 다른 페이지의 포인터들이 나열
: : 되고...
: :
: : 어떻게 미리 제한을 거는지 잘 모르겠네요.
: : 제 생각엔, TDesigner 클래스를 이용하는 것 같기도 한데..
: : 아무튼, 어떻게 하는지 알고 계시다면 알려주시면 고맙겠습니다.
: :
: : 패패루였슴다.
|