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
[42352] Re:트리뷰에서 폴더방식의 처리 문제
박지훈.임프 [cbuilder] 852 읽음    2005-11-03 04:52
잘못된 부분은 FileInsert() 함수에 있습니다.

먼저 마지막 인자 position은 전혀 필요가 없구요.
그리고 node = TreeView1->Items->Item[position]; 이 라인은 둘다 필요없습니다.
대신 do~while 문 안의 TreeView1->Items->AddChild(node, sr.Name); 의 리턴값을 일단 받아놔야 합니다.
그러니까 TTreeNode *ChildNode = TreeView1->Items->AddChild(node, sr.Name); 이렇게 바꿉니다.
그리고 그 아래쪽 FileInsert()를 재귀호출할 때는 node를 넘기는 것이 아니라 방금 리턴받아둔 ChildNode를 넘깁니다.
그러면 FileInsert(ChildNode,...); 이렇게 바뀌겠죠.

FileInsert() 함수의 전체 코드는 다음과 같이 될 겁니다.

int __fastcall TDataViewDlg::FileInsert(TTreeNode* node,AnsiString Path)
{
    TSearchRec sr;

    if(FindFirst(Path + "/*.*", faAnyFile , sr) == 0)
    {
        if(sr.Attr == faArchive || faReadOnly || faSysFile || faHidden)
            if(!(sr.Name == ".") || (sr.Name == ".."))
                TreeView1->Items->AddChild(node, sr.Name);

        do
        {
            if(sr.Attr == faArchive || faReadOnly || faSysFile || faHidden )
            {
                if((sr.Name == ".") || (sr.Name == "..")) continue;

                TTreeNode *ChildNode = TreeView1->Items->AddChild(node, sr.Name);

                iNodeValue++;
                FileInsert(ChildNode,Path + "/" + sr.Name);
            }
        }
        while(FindNext(sr) == 0);
    }

    FindClose(sr);
}



오호라 님이 쓰신 글 :
: 이번에 트리뷰로 해서 원하는 data타 폴더에 트리로 된 구성을 짜려고 합니다.
: 음 많이 생각해서 해봤는데..
: 아직도 구현이 잘안되더라구용....
:  int             iNodeValue;
:  int             iNodeValue_1;
:  int             iValue;
:  TTreeNode*      node;
: void __fastcall TDataViewDlg::FormShow(TObject *Sender)
: {
:     AnsiString Path = "c:/CSpring/data/";
:     DirInsert(Path);
:     iNodeValue_1 = 0;
:
: }
:             void __fastcall TDataViewDlg::DirInsert(AnsiString strPath)
: {
:     TStringList*    list = new TStringList;
:     AnsiString Temp;
:     TSearchRec sr;
:     AnsiString sFileName ;
:     AnsiString Path = strPath +"/*.*";
:
:     try
:     {
:         if(FindFirst(strPath + "*.*", faAnyFile, sr) == 0)
:         {
:             do
:             {
:                 if((sr.Name != "." && sr.Name != "..") && sr.Attr == faDirectory)
:                 {
:                      TreeView1->Items->Add(NULL, sr.Name);
:                      TTreeNode* node = TreeView1->Items->Item[iValue];
:                      AnsiString sTemp = TreeView1->Items->Item[iValue]->Text;
:
:                      list->Add(sr.Name);
:                      Temp = strPath + sr.Name;
:
:                      iNodeValue = 0;
:                      FileInsert(node,Temp,iValue+1);
:
:                      iValue++;
:                      iValue += iNodeValue;
:                 }
:             }
:             while(FindNext(sr) == 0);
:
:         }
:     }
:     __finally
:     {
:         FindClose(sr);
:     }
:
: }
: //---------------------------------------------------------------------------
:
: int __fastcall TDataViewDlg::FileInsert(TTreeNode* node,AnsiString Path,int position)
: {
:     TSearchRec sr;
:
:     if(FindFirst(Path + "/*.*", faAnyFile , sr) == 0)
:     {
:         if(sr.Attr == faArchive || faReadOnly || faSysFile || faHidden)
:         {
:             if(!(sr.Name == ".") || (sr.Name == ".."))
:             {
:                 TreeView1->Items->AddChild(node, sr.Name);
:                 node = TreeView1->Items->Item[position];
:             }
:         }
:
:         do
:         {
:             if(sr.Attr == faArchive || faReadOnly || faSysFile || faHidden )
:             {
:                 if((sr.Name == ".") || (sr.Name == "..")) continue;
:
:                 TreeView1->Items->AddChild(node, sr.Name);
:                 node = TreeView1->Items->Item[position];
:
:                 iNodeValue++;
:                 position += iNodeValue;
:                 FileInsert(node,Path + "/" + sr.Name,TreeView1->Items->Count);
:             }
:         }
:         while(FindNext(sr) == 0);
:     }
:
:     FindClose(sr);
: }
:
: 이렇게 했지만.. 원하는 결과는 나오지 않습니다.
: 구성이
:
: LG전자 
:            2005
:                    200510
:                               2005101112.xsl
:            2006
:            2007
:
: 삼성전자
:          2005
:          2006
:          2007
:                 200710
:                             20071011.xsl
:
: 이런식으로 구성을 합니다.
: 음..  잘되신분이나 .. 조언좀 부탁드립니다. 
: 정형화된것이 아닌..  사용자가  임의로 등록이 가능해서  폴더가 많이 늘어납니다...

+ -

관련 글 리스트
42259 트리뷰에서 폴더방식의 처리 문제 오호라 764 2005/10/25
42352     Re:트리뷰에서 폴더방식의 처리 문제 박지훈.임프 852 2005/11/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.