使用目录树和过滤填充 TTreeView

Nat*_*pos 0 delphi treeview tree lazarus

在 Lazarus 0.9.28.2 项目中,我有一个TTreeView, 名称DirTree位于我的 Form( frmConvert) 上,但我想用所有目录树填充它,因为C:\.

像这样:
C:\ 目录树 http://i.imagehost.org/0185/cdirtree.png

当用户选择目录时,在第二个TTreeView名称为 的目录中FileTree,会显示该目录中的所有文件,但经过过滤后仅显示 PDF。

我还需要帮助来放置这些图标,因为对于最终用户来说更有组织性和友好性非常好。

问题

  • 如何使用DirTree所有目录填充第一个 TTreeView( ),如图所示?
  • 如何使用FileTree所选目录中的文件填充第二个 TTreeview( ) DirTree
  • 如何为每个文件夹(仅限文件夹)设置图标DirTree

Spa*_*rky 5

填充 dirTree 的代码(已修订)

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;
Run Code Online (Sandbox Code Playgroud)

****填充 FileTree 的代码(已修订)****

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;
Run Code Online (Sandbox Code Playgroud)

添加到表单的附加程序

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;
Run Code Online (Sandbox Code Playgroud)

您需要在表单中添加一个图像列表,为其添加一个文件夹图标(borland常用文件中有一个),然后将图像列表与目录树视图和文件树树视图关联起来

如何调用 FilteredTV 过程的示例

将以下代码附加到目录树的OnClick事件中

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;
Run Code Online (Sandbox Code Playgroud)

  • 好吧,我误解了你的问题。您将需要对每个目录进行递归调用...性能方面,这可能会大大减慢树逻辑,因为您现在需要扫描硬盘的整个结构。我将为您调整上面的代码... (2认同)