안녕하세요. 천리안 프로그래머 포럼 C++Builder 담당자 임펠리테리입니다.
혹 제가 아는 윈텍님 맞으신지..? 제가 알기로 윈텍님은 C++Builder를 사용하시는
데요... 일단 C코딩으로 알려드리죠.
현재 클릭한 마지막 메뉴아이템이 상위 메뉴아이템에서 몇번째인가 하는 인덱스는
메뉴아이템의 MenuIndex 속성으로 알아낼 수 있습니다. 그러니까 다음과 같이 하면
되죠.
Label1->Caption = (dynamic_cast<TMenuItem *>(Sender))->MenuIndex;
이 문제는 이런식으로 간단히 해결됩니다.
그런데, 그 상위 메뉴아이템이 다시 그 윗 메뉴에서 몇번째인가 하는 것은 바로 알
려주는 속성이 없습니다. 이건 당연한 건데요, 메뉴의 구조가 트리 형식이기 때문
에 어디까지 내려갈지 알수 없는 메뉴의 구조상 일일이 상위 메뉴아이템의 인덱스
를 저장할 수가 없겠죠.
그래서.. 간접적으로(?) 알아낼 수밖에 없는데, 일단은 TComponent 클래스의 멤버
인 GetParentComponent() 메소드를 사용하여 상위 메뉴아이템을 알아낸 다음 다시
MenuIndex를 읽어오는 방법을 생각해 볼 수 있습니다. 이렇게 생각한다면.. 다음과
같이 코딩이 가능하겠죠?
Label2->Caption = (dynamic_cast<TMenuItem *>((dynamic_cast<TMenuItem *>
(Sender))->GetParentComponent()))->MenuIndex;
조금 복잡하죠? 어쨌든.. 적법해 보이고, 문법적으로 하자가 없어보입니다만, 답변
을 드리기 위해서 테스트해본 결과 에러가 납니다.. 쩝...
TMenuItem에서 TComponent를 상속받으면서 GetParentComponent() 메소드를 프로텍
티드로 선언했더군요. 그래서 억세스 불가 에러가 생깁니다. 그러니까, 이젠 이걸
TComponent형으로 캐스팅 한후에 다시 메소드를 호출하면 되겠죠. 그런데 안그래도
캐스팅을 할 필요가 있으니까 TMenuItem으로 캐스팅하는 대신에 TComponent형으로
캐스팅하면 됩니다.
Label2->Caption = (dynamic_cast<TMenuItem *>((dynamic_cast<TComponent *>
(Sender))->GetParentComponent()))->MenuIndex;
이렇게 하면 Label2의 캡션이 상위 메뉴아이템의 인덱스로 됩니다. 만약 다시 더
상위의 메뉴아이템의 인덱스를 알아낼 필요가 있다면 이 캐스팅 문장은 더더욱
복잡해지겠죠? 쩝... 만약 이렇게 복잡한 것이 싫으시다면 그냥 생성시에 Tag에 인
덱스를 달아주고 하는 방법도 있겠습니다만.. 복잡하더라도 나중의 문제거리를
미리 막는다고 생각하면, 이 방법이 최선이겠습니다.
그럼, 도움되시길 바라면서, 이만...
독립문에서 임펠리테리였습니다.
(cbuilder, skyhi18, cbuilder@thrunet.com)
|