都知道,TreeView组件有一个OnChange事件,当TreeView组件的节点发生改变的时候就会发生该事件。若在该事件中加入相应的代码,把改变的节点所表示目录下的子目录添加到TreeView组件中,这样,程序运行时速度就会很快。
这种方法实现步骤如下:
往窗体Form1上再添加一个Button组件和一个TreeView组件,它们的Name属性分别为:Button3和TreeView2。把Button3的Caption属性改为“装载TreeView2”,然后双击Button3组件,在Button3的OnClick事件中加入以下代码:
AnsiString Path=Edit1->Text; if(Path.SubString(Path.Length(),1)!="\\") Path+="\\"; TreeView2->Items->Add(NULL,Path); 在TreeView2的OnChangeing事件中加入: Screen->Cursor=crHourGlass; Animate1->Active=true; //防止重复增加节点 if(Node->Count==0) { TSearchRec sr; AnsiString DirName,DirTmp; TTreeNode * NodeTmp=Node; 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+="\\"; if (FindFirst(DirName+"*.*", faAnyFile, sr) == 0) { do { if((sr.Attr & faDirectory) && sr.Name!="." && 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+"*.*", faAnyFile, sr) == 0) { do { if((sr.Attr & faDirectory) && sr.Name!="." && 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+="\\";
|