2009-12-27 13 views
0

在一個拉撒路0.9.28.2項目,我有一個TTreeView,我的表(frmConvert)上的名字DirTree,但我想所有的目錄樹來填充它,因爲C:\填充TTreeView隨着目錄樹和過濾

像這樣:
C:\ Directory Tree http://i.imagehost.org/0185/cdirtree.png

,並在用戶選擇的目錄,在第二TTreeView,名爲FileTree,出現在目錄中的所有文件,但過濾,只顯示PDF文件。

另外我想幫助把這些圖標,因爲非常好,對最終用戶更有組織和友好。

問題

  • 我怎樣才能在圖像填充第一TTreeView(DirTree)與所有directorys,怎麼樣?
  • 我怎麼能填充第二TTreeview(FileTree)與上DirTree選擇的目錄中的文件?
  • 如何爲DirTree上的每個文件夾(僅限文件夾)設置圖標?填充dirTree
+0

的圖像是有聯繫的外部第三方來源,這似乎的OnClick事件不再可用... – 2012-07-21 18:00:11

回答

4

代碼(修訂本)

procedure TForm1.FormClick(Sender: TObject); 
var 
    sr: TSearchRec; 
    FileAttrs: Integer; 
    theRootNode : tTreeNode; 
    theNode : tTreeNode; 
begin 
    FileAttrs := faDirectory;  // Only care about directories 
    theRootNode := DirTree.Items.AddFirst(nil,'c:\'); 
    if FindFirst('c:\*.*', FileAttrs, sr) = 0 then 
    begin 
     repeat 
     if (sr.Attr and FileAttrs) = sr.Attr then 
     begin 
      theNode := dirTree.Items.AddChild(theRootNode,sr.name); 
      AddDirectories(theNode,'c:\'+sr.Name); 
     end; 
     until FindNext(sr) <> 0; 
     FindClose(sr); 
    end; 
// DirTree.FullExpand; 
end; 

****代碼來填充文件樹(修訂本)****

procedure TForm1.FilteredTV(theDir: string;ext:String;startNode:tTreeNode); 
var 
    sr: TSearchRec; 
    FileAttrs: Integer; 
    theNode : tTreeNode; 
begin 
    if copy(ext,1,1)<>'.' then ext := '.'+ext; 
    FileAttrs := faAnyfile; 
    if startNode = nil then 
     StartNode := FileTree.Items.AddFirst(nil,theDir); 
    if FindFirst(theDir+'\*.*', FileAttrs, sr) = 0 then 
    begin 
     repeat 
     if (sr.Attr=faDirectory) and (copy(sr.Name,1,1)<>'.') then 
      begin 
       theNode := FileTree.Items.AddChild(StartNode,sr.name); 
       theNode.ImageIndex := 0; // Use folder image for directories 
       FilteredTV(theDir+'\'+sr.name,ext,theNode); 
      end 
     else 
      if ((sr.Attr and FileAttrs) = sr.Attr) and (ExtractFileExt(sr.name)=ext) 
      then 
      begin 
       theNode := FileTree.Items.AddChild(StartNode,sr.name); 
       theNode.ImageIndex := -1; // No image for files 
      end; 

     until FindNext(sr) <> 0; 
     FindClose(sr); 
    end; 
    FileTree.FullExpand; 
end; 

附加步驟添加形成

procedure TForm1.AddDirectories(theNode: tTreeNode; cPath: string); 
var 
    sr: TSearchRec; 
    FileAttrs: Integer; 
    theNewNode : tTreeNode; 
begin 
    FileAttrs := faDirectory;  // Only care about directories 
    if FindFirst(cPath+'\*.*', FileAttrs, sr) = 0 then 
    begin 
     repeat 
     if ((sr.Attr and FileAttrs) = sr.Attr) and (copy(sr.Name,1,1) <> '.') 
     then 
     begin 
      theNewNode := dirTree.Items.AddChild(theNode,sr.name); 
      AddDirectories(theNewNode,cPath+'\'+sr.Name); 
     end; 
     until FindNext(sr) <> 0; 
     FindClose(sr); 
    end; 
end; 

您需要的圖像列表添加到您的窗體中添加一個文件夾圖標(其中有一個在Borland共同文件),然後關聯與目錄樹視圖和文件樹樹視圖中的圖像列表

實施例如何CALLED FILTEREDTV過程

下面的代碼附加到目錄樹

procedure TForm1.DirTreeClick(Sender: TObject); 
var 
    cBuild : string; 
    theNode : tTreeNode; 
begin 
    if DirTree.Selected <> nil then 
    begin 
     theNode := DirTree.Selected; 
     cBuild := theNode.Text; 
     while theNode.Parent <> nil do 
     begin 
      cBuild := theNode.Parent.Text+'\'+cBuild; 
      theNode := theNode.Parent; 
     end; 
     cBuild := stringReplace(cBuild,'\\','\',[rfReplaceAll]); 
     FilteredTV(cBuild,'pdf',nil); 
    end; 

end; 
+2

好的,我誤解了你的問題。您將需要對每個目錄進行遞歸調用......性能明智,可能會顯着減慢樹邏輯,因爲您現在需要掃描硬盤的整個結構。我會修改上面的代碼給你... – Sparky 2009-12-28 14:50:07

+0

看到修訂版,他們應該給你你正在尋找的 – Sparky 2009-12-28 15:21:39

+0

非常感謝!但我如何使用'TForm1.FilteredTV'? – 2009-12-28 15:25:52