NodeTmp=NodeTmp-> Parent; DirTmp=NodeTmp-> Text;
if(DirTmp.SubString(DirTmp.Length(),1)!= \
DirTmp+= \
DirName.Insert(DirTmp,0); }
if(DirName.SubString(DirName.Length(),1)!= \
DirName+= \
if (FindFirst(DirName+ \{ do {
if((sr.Attr & faDirectory) && sr.Name!= \{
TreeView2-> Items-> AddChild(Node,sr.Name); }
} while (FindNext(sr) == 0); FindClose(sr); } }
Screen-> Cursor=crDefault; Animate1-> Active=false;
这种方法速度虽然很快,但由于只是添加一层的子目录,所得到的节点表示的目录下不管有没有子目录,节点左边都没有“+”符号(有“+”表示有子节点),因此就有必要将它修改一下了,于是就有第三种方法的出现。 第二种方法是因为只添加了下一级的子目录,所以才会出现这种问题,如果我们添加到下两级的子目录,问题就会得到解决,这就是第三种方法。这样,当打开一个节点的时候,OnChange事件的代码就会把下两级的子目录添加进来,再打开一个节点,该节点下两级的子目录又被添加进来,看起来就像是把整个目录树放到了TreeView中一样。 第三种方法的实现如下:
再添加一个Button组件Button4和一个TreeView组件TreeView3到窗体Form1上,将Button4的Caption属性改为“装载TreeView3”,双击Button4组件,在Button4的OnClick事件中加入以下代码:
AnsiString Path=Edit1-> Text;
if(Path.SubString(Path.Length(),1)!= \
Path+= \
TTreeNode * Node1=TreeView3-> Items-> Add(NULL,Path); TSearchRec sr;
if (FindFirst(Path+ \{ do {
if((sr.Attr & faDirectory) && sr.Name!= \{
TreeView3-> Items-> AddChild(Node1,sr.Name); }
} while (FindNext(sr) == 0); FindClose(sr); }
在TreeView3的OnChangeing事件中加入:
Screen-> Cursor=crHourGlass; Animate1-> Active=true; TSearchRec sr;
TTreeNode * NodeTmp=Node; AnsiString DirName,DirTmp; DirName=Node-> Text;
for(int I=Node-> Level ;I> 0 ;I--) {
NodeTmp=NodeTmp-> Parent; DirTmp=NodeTmp-> Text;
if(DirTmp.SubString(DirTmp.Length(),1)!= \DirTmp+= \
DirName.Insert(DirTmp,0); }
if(DirName.SubString(DirName.Length(),1)!= \
DirName+= \
for(int J=0;J
if(Node-> Item[J]-> Count==0); {
if (FindFirst(DirName+Node-> Item[J]-> Text+ \0) { do {
if((sr.Attr & faDirectory) && sr.Name!= \{
TreeView3-> Items-> AddChild(Node-> Item[J] ,sr.Name); }
} while (FindNext(sr) == 0);
FindClose(sr); } } }
Screen-> Cursor=crDefault; Animate1-> Active=false;
好了,程序代码加入完后,将各个组件排列一下,按F9再编译运行一次,这三种将目录树的结构装入TreeView中的方法,你比较喜欢那一种呢?自己比较一下吧。以上的程序在Win98/Win2000,Borland C++ Builder 6.0下运行通过。