|
음....
TTreeView에서 TreeNode의 주소가 바뀌는것은?
Parent 윈도우 핸들이 바뀌면 그 하위 윈도우 핸들은 모두 다시 생성합니다.
TreeView로 윈도우 핸들이 새로 만들어지고 Item들도 모두 새로 생성됩니다.
TreeNode에 들어있는 Text , ImageIndex , Data등의 정보는 MemoryStream에 저장했다가
다시 Create한후에 새로 TreeNode를 만들어 주면서 MemoryStream에 들어있던 정보로 셋팅해 줍니다.
그래서 원래 모양 그대로 인것처럼 보일뿐 사실은 Items가 Clear 되었다가 새로 생성된것입니다.
그러므로 원론적으로 주소를 그대로 유지하는 방법은 어렵습니다.
그밖에 TreeNode의 주소가 바뀌는경우
Form의 Parent를 바꾸는 경우 말고도
1. 그냥 TreeView의 Parent를 바꿔도 같은 현상이 나구요
(혹 이경우 같은 주소가 나오는경우가 있더라도 삭제되고 새로 생성된것이 똑같아서 그럴뿐.. 원론적으로는 주소가
새로 만들어진것 입니다.)
2. Form이나 TreeVew를 포함한 Parent 중에 아무거나에서 RecreateWnd() 를 호출해도
Form1->RecreateWnd();
TreeVeiw1->Perform(CM_RECREATEWND, 0, 0);
..
3. Form의 Style을 바꾸어도...
Form의 Style을 fsNomal 이서 faStayOnTop등으로 바꾸면
RecreateWnd()가 호출됩니다.
----------------------------------------------------------------------------------
[TreeNode의 포인터로 접근하는 방법]
TreeNode의 주소는 RecreateWnd가 호출되면서 변경되어버리지만
TreeNode의 Text나 ImageIndex, SelectedIndex,StateIndex, Data 등은 변하지 않습니다.
위 내용중에 특별히 Data 에다가 특별한 Node정보를 넣어두고
RecreateWnd 호출될때 Data의 Node를 Reset해주고
Data를 통해서 Node에 접근하면 Node 메모리 주소가 바뀌어도 문제없이 access가능할것입니다.
그럼..
한빈짱 님이 쓰신 글 :
: 트리뷰에 아이템을 추가하고,
:
: TreeView1->Items->Clear();
: TTreeNode *pNode = TreeView1->Items->Add(NULL, "First node");
: pNode = TreeView1->Items->Add(NULL, "Second node");
:
: 트리뷰를 가진 폼의 parent를 바꿔 보니.
: Parent = Form1; <--> Parent = NULL;
:
: node의 주소가 변하네요.
: 트리뷰에 아이템추가하고 node의 주소를 저장해뒀다가,
: 필요할때 접근하고 했었는데..
: Parent가 변할 때 node의 주소가 바껴버려서.. 어떻게 해야될지 ㅜㅜ
: node주소를 고정되게 사용하는 법 없나요?
|