|
안녕하세요..
아래는 하나의 트리뷰에서... 오른쪽 마우스 버튼을 클릭하면, 특정 popup menu를 띄워서
popupmenu 에서 눌린것에 따라서 무언가의 작업을 하려고 합니다.
트리뷰에는 root 밑에 여러개의 depth (level )을 가지고 있습니다.
만약 지금 현재 맨위의 root가 선택되어 있었고,,,
여기서 child node를 선택할 때, 방법은 두가지가 존재할 것 같습니다.
방법 1)
선택하고자는 child node를 마우스 왼쪽 버튼으로 누르고(먼저 child node 선택),,,
마우스 오른쪽 버튼을 눌러 popup menu를 띄은경우.
방법 2)
선택하고자는 child node를 ,바로 마우스 오른쪽 버튼을 누르고,
popup menu를 띄운경우.
위에서 방법 1로 했을 경우는 정상적으로 popmenu menu에 연결된 함수까지...모든것이 정상적으로
수행 됩니다.
문제는 2번인데... 왼쪽 버튼으로 먼저 선택하는 것 없이.. 마우스 오른쪽 버튼을 바로 누른경우...
선택됐음을 표시하는 반전막대가,,, 그전에 선택되었던 곳으로 (지금 같은 경우 root로 이동) 이동되는 것을 볼수 있습니다.
그러면서... 메모리 access violation 에러를 냅니다...
트리뷰가 잘못 만들어졌나 해서,,, 트리뷰를 여러번 만들었는데요...현상을 똑같습니다.
어떤 이유에서 이런 현상이 나타는 것인지요?
selected 속성과 관계가 있는 것 같은데... 무었때문이지 잘 모르겠습니다.
======= 트리뷰에서 마우스 오른쪽 버튼이 눌렸을 popup menu를 띄우려 합니다 ===
void __fastcall TmainFrame::TreeView1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
TTreeNode* pNode = TreeView1->GetNodeAt(X, Y);
if(Button == mbRight)
{
TPoint Pnt(X, Y);
Pnt = ((TTreeView*)Sender)->ClientToScreen(Pnt);
if(!pNode)
{ // 현재 트리노드가 선택되지 않았다.
if(TreeView1->Items->Count == 0)
{
ShowMessage ( "아무 노드가 없습니다" );
}
}
else
{
// 테스크 라는 곳에서... 마우스 오른쪽 버튼이 눌렸다면..
//여기서 "테스트" 라는 node를 왼쪽 버튼으로 선택후 , 마우스 오른쪽 버튼을
//누르면,,, 모든 것이정상적으로 수행, 그러나 마우스 오른쪽 버튼을 바로 누르면,,
//메모리 access violation error 가 나는 것을 볼수 있습니다.
//어떤 문제때문에 이런 현상이 나타나는 것인지요?
if(TreeView1->Selected->Text == "테스트" )
{
PopupMenu1->Popup(Pnt.x, Pnt.y);
}
}
|