|
잘못된 부분은 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
:
: 이런식으로 구성을 합니다.
: 음.. 잘되신분이나 .. 조언좀 부탁드립니다.
: 정형화된것이 아닌.. 사용자가 임의로 등록이 가능해서 폴더가 많이 늘어납니다...
|