프로그래밍
TreeView의 TreeNode 클래스 바꾸기
by 알 수 없는 사용자
2012. 4. 18.
음...
TreeView를 조직도 및 여러가지 데이터를 관리하고 보여주는데 많이 사용한다.
그런데 VCL에서
TTreeView의 TTreeNode에는 담을수 있는 정보에 한계가 있다.
Text
Data
ImageIndex
StateIndex
SelectedIndex
등..
TTreeNode에 보다 많은 정보를 담아야할때( 연결해야) 할때는 어떻게 해야하나?
방법1.
void * Data 활용
일반적으로 정보는 따로 가지고 있고
void *Data에다가 Poiner를 연결해서 많이 쓴다.
|
class TMyClass
{
public:
String sName;
};
//정보 저장
Node->Data = (void *) MyData;
//정보 활용 TMyClass *MyData=(TMyClass *)Node->Data;
MyData->sName;
| |
방법 1-1
간단한 숫자 정보일경우
Node->Data=(void *) iNumber ; // 곧바로 숫자 정보를 집어 넣는다.
방법2
또 다른 좋은 방법으로
TTreeNode 클래스를 상속받은 Node-Class를 만들어서 Add하는 방법이 있다.
그런데 TTreeView는 TTreeNode객체를 직접생성해서 TreeView에 Add하는 방식이 아니라
TreeView를 통해서 객체를 생성한단.
바로 OnCreateNodeClass 라는 이벤트를 이용하는 것이다.
이 이벤트에서 TTreeNode를 상속받은 class의 MetaClass를 연결해주면 된다.
간단한 샘플 코드를 작성해 보았다.
프로그램 화면
샘플 코드
|
//---------------------------------------------------------------------------
// Group 정보를 담는 Node-Class
//---------------------------------------------------------------------------
class TGroupNode : public TTreeNode
{
private:
String FGroupName;
String FHints;
int FTag;
public:
__property String GroupName={read=FGroupName,write=FGroupName};
__property String Hints={read=FHints,write=FHints};
__property int Tag={read=FTag,write=FTag};
};
//---------------------------------------------------------------------------
//개인(사람) 정보를 담는 Node-Class
//---------------------------------------------------------------------------
class TPersonNode : public TTreeNode
{
private:
String FName;
String FAddress;
String FPhoneNumber;
String FHints;
int FTag;
public:
__property String Name={read=FName,write=FName};
__property String Address={read=FAddress,write=FAddress};
__property String PhoneNumber={read=FPhoneNumber,write=FPhoneNumber};
__property String Hints={read=FHints,write=FHints};
__property int Tag={read=FTag,write=FTag};
};
//---------------------------------------------------------------------------
// Node의 MetaClass 정보 연결 함수 //---------------------------------------------------------------------------
void __fastcall TForm1::TreeViewCreateGroupNodeClass(TCustomTreeView *Sender, TTreeNodeClass &NodeClass)
{
NodeClass = __classid(TGroupNode);
}
void __fastcall TForm1::TreeViewCreatePersonNodeClass(TCustomTreeView *Sender, TTreeNodeClass &NodeClass)
{
NodeClass = __classid(TPersonNode);
}
//---------------------------------------------------------------------------
// TreeView에 Node 추가 //---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//
TGroupNode *GNode;
TPersonNode *PNode;
for(int i=0;i<3;i++)
{
//Group-Node추가 TreeView1->OnCreateNodeClass=TreeViewCreateGroupNodeClass;
GNode=(TGroupNode *)TreeView1->Items->Add(NULL,"Group"+IntToStr(i));
GNode->GroupName="그룹["+IntToStr(i)+"]";
GNode->Data=(void *)1;
//Group-Node의 Child에 Person-Node 추가 TreeView1->OnCreateNodeClass=TreeViewCreatePersonNodeClass;
for(int i=0;i<10;i++)
{
PNode=(TPersonNode *)TreeView1->Items->AddChild(GNode,"사람"+IntToStr(i));
PNode->Name="사람"+IntToStr(1);
PNode->Address="대한 민국 서울";
PNode->PhoneNumber="010-1234-5678";
PNode->Tag=i+1;
}
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// GroupNode 정보 활용 //---------------------------------------------------------------------------
void __fastcall TForm1::PmGroupNameClick(TObject *Sender)
{
if(TreeView1->Selected==NULL || TreeView1->Selected->Level!=0)return;
TGroupNode *GNode=(TGroupNode *)TreeView1->Selected;
ShowMessage(GNode->GroupName );
}
//---------------------------------------------------------------------------
// Person-Node의 정보 활용 //---------------------------------------------------------------------------
void __fastcall TForm1::PmAddressClick(TObject *Sender)
{
if(TreeView1->Selected==NULL || TreeView1->Selected->Level<1)return;
TPersonNode *PNode=(TPersonNode *)TreeView1->Selected;
ShowMessage(PNode->Address);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PmPhoneNumberClick(TObject *Sender)
{
if(TreeView1->Selected==NULL || TreeView1->Selected->Level<1)return;
TPersonNode *PNode=(TPersonNode *)TreeView1->Selected;
ShowMessage(PNode->PhoneNumber);
}
//---------------------------------------------------------------------------
| |
그럼...