C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[61802] Re:TreeView에서 노드 값의 차일드 값**표기 방법[질문]
장성호 [nasilso] 1199 읽음    2010-07-06 11:12
화면에 보여지는 내용과
실제 가지고 있는 정보를 달리하고 싶은게네요


방법1. CustomDraw를 이용하는 방법
   TreeView의 CustomDraw를 이용하여 Node의 Text와는 다르게 화면에 표시할수 있습니다.

다음과 같이..
void __fastcall TForm2::TreeView1CustomDrawItem(TCustomTreeView *Sender,
      TTreeNode *Node, TCustomDrawState State, bool &DefaultDraw)
{
	DefaultDraw=false;
    TRect rc=Node->DisplayRect(true);
	Sender->Canvas->TextRect(rc,rc.left,rc.top,"***");
}
//---------------------------------------------------------------------------

 

방법2. Node의 정보를 따로 가지고 있는 방법
    Node에 Text는 "PW:****" 이렇게 넣어주시구요
  
    실제 사용할때는 file등에서 정보를 직접 읽어와서 처리합니다.
void __fastcall TForm2::Button3Click(TObject *Sender)
{
    String pw=iniFile->ReadString("asdfasd","PW","");

    if(Edt_Password->Text!=pw)
    {
     	ShowMessage("비밀번호가 틀렸습니다.");
        return;
    }

    //다음과정 진행..

}
//---------------------------------------------------------------------------

    
위 코드에선 pw정보가 inifile에 있는 경우였는데..
ini파일이 아니라.. db등 얼마든지 다른곳에 저장해둘수 있겠죠..

방법3. Node의 Data를 이용하는 방법

TTreeView의 TTreeNode에는 Data라는 void *를 저장할수 있는 property가 있습니다.
pointer를 저장할수 있다는것은 어떤게 많은 정보도 저장할수 있다는것이죠

Node를 add할때 Node->Data에 정보가 담킨 class나 구조체를 하나 생성해서 같이 add해주는 방식입니다.

//---------------------------------------------------------------------------
struct DataCls
{
	String pw;
    String name; //기타 다른 정보도..
    int    level;
};
void __fastcall TForm2::Button4Click(TObject *Sender)
{
	TTreeNode *NewNode=TreeView1->Items->Add(NULL);

    NewNode->Text="PW:***";

    DataCls *NodeData=new DataCls;
    NodeData->pw="asdf";
    NewNode->Data=NodeData;

}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button5Click(TObject *Sender)
{
    TTreeNode *Node=TreeView1->Selected;
    if(Node==NULL)return;
    if(Node->Data==NULL)return;
    DataCls *NodeData=(DataCls *)Node->Data;


    if(Edt_Password->Text!=NodeData->pw)
    {
     	ShowMessage("비밀번호가 틀렸습니다.");
        return;
    }

    //다음과정 진행..
}
//---------------------------------------------------------------------------



이 세번째 방법은 매우 유용한 방법이며..
매우 광범위 하게 활용할수 있습니다.

Node->Data를 이용한 방법은
TTreeView말고도 TListView에서 TListItem에 Data라는 프로퍼티가 있으며

TStringGrid 에서는 Objects 라는 프로퍼티가 있습니다.
TListBox , TComboBox 등에도 Items->Objects라는게 있습니다.


3번 방법에서 주의할점은 반드시 Data 객체를 해제해줘야 한다는것과
Form의 Style을 변경한다든지.. RecreateWnd() 을 하지 않아야 합니다.
(왜냐하면 Form의 Style을 변경하면 자동으로 RecreateWnd가 호출되면.. Form의 RecreateWnd가 호출되면
Form의 윈도우 핸들이 다시 생성되면서 폼위에 올려진 모든 wincontrol의 window-handle이 다시 생성됩니다.
이때 TreeView의 Node-Data의 Address가 이상해집니다.

님께는 2번 방법이 가장 적당할것 같네요

그럼..


공부중 님이 쓰신 글 :
: TreeView의 구성은 아래와 같습니다.(첨부파일에 첨부 하였습니다)
: 노드 값 -> 차일드 값
:             -> 차일드 값
:             -> 차일드 값
:             -> 차일드 값
:
:  여기에서 차일드 중 4번째 차일드 값을 ***로 변환 출력 하고 싶습니다.
: 하지만 4번째 값을 추후 사용 하기 때문에 값을 정상적으로 가지고 있어야 합니다.

+ -

관련 글 리스트
61801 TreeView에서 노드 값의 차일드 값**표기 방법[질문] 공부중 878 2010/07/06
61802     Re:TreeView에서 노드 값의 차일드 값**표기 방법[질문] 장성호 1199 2010/07/06
61803         답변 감사 합니다 공부중 672 2010/07/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.