1. unit DirTreeView;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils, Classes, Controls, Forms, ComCtrls;
  7.  
  8. type
  9.   TDirTreeView = class(TTreeView)
  10.   private
  11.     FRootPath: string;
  12.     FExt: string;
  13.     FFileName: string;
  14.   protected
  15.     procedure Collapse(Node: TTreeNode); override;
  16.     procedure Expand(Node: TTreeNode); override;
  17.     procedure Change(Node: TTreeNode); override;
  18.   public
  19.     constructor Create(AOwner: TComponent; const aRootPath,aExt: string); reintroduce;
  20.     procedure OpenList(const aKey: string = '');
  21.     property FileName: string read FFileName;
  22.   end;
  23.  
  24. implementation
  25.  
  26. function DirToTree(aTree: TTreeView; const aRootDir,aDir,aExt: string; const aKey: string=''; aNum: Integer = -): Boolean;
  27. var
  28.   sr: TSearchRec;
  29.   Node,NodeTemp: TTreeNode;
  30.   LRootDir,LDir: string;
  31. begin
  32.   LRootDir := ExcludeTrailingPathDelimiter(aRootDir);
  33.   LDir := ExcludeTrailingPathDelimiter(aDir);
  34.   if LRootDir <> '' then LDir := ExcludeTrailingPathDelimiter(LRootDir) + LDir;
  35.   if aNum = - then Node := nil else Node := aTree.Items[aNum];
  36.  
  37.   if FindFirst(LDir + '\*.*', faAnyFile, sr) = then
  38.   begin
  39.     repeat
  40.       if sr.Name[] = '.' then Continue;
  41.       if (sr.Attr and faDirectory) = faDirectory then
  42.       begin
  43.           NodeTemp := aTree.Items.AddChild(Node, sr.Name);
  44.           NodeTemp.ImageIndex := ;
  45.           NodeTemp.SelectedIndex := ;
  46.           DirToTree(aTree, '', LDir + '\' + sr.Name, aExt, aKey, aTree.Items.Count-);
  47.       end else begin
  48.         if aKey <> '' then
  49.           if Pos(aKey, StringReplace(LDir + '\' + sr.Name, LRootDir, '', [rfIgnoreCase])) = then
  50.             Continue;
  51.         if ExtractFileExt(sr.Name) = aExt then
  52.         begin
  53.           NodeTemp := aTree.Items.AddChild(Node, ChangeFileExt(sr.Name, ''));
  54.           NodeTemp.ImageIndex := ;
  55.           NodeTemp.SelectedIndex := ;
  56.         end;
  57.       end;
  58.       Application.ProcessMessages;
  59.     until (FindNext(sr) <> );
  60.   end;
  61.   Result := True;
  62. end;
  63.  
  64. { TDirTreeView }
  65. constructor TDirTreeView.Create(AOwner: TComponent; const aRootPath, aExt: string);
  66. begin
  67.   inherited Create(AOwner);
  68.   AutoExpand := True;
  69.   ShowButtons := False;
  70.   ShowLines := False;
  71.   FRootPath := ExcludeTrailingPathDelimiter(aRootPath) + '\';
  72.   FExt := aExt;
  73.   if FExt[] = '*' then FExt := StringReplace(FExt, '*.', '.', [rfIgnoreCase]);
  74. end;
  75.  
  76. procedure TDirTreeView.Change(Node: TTreeNode);
  77. var
  78.   n: TTreeNode;
  79.   TmpPath: string;
  80. begin
  81.   if not Node.Selected then Exit;
  82.   if Node.ImageIndex <> then Exit;
  83.   Cursor := crHourGlass;
  84.   n := Node;
  85.   TmpPath := n.Text;
  86.   while n.Parent <> nil do
  87.   begin
  88.     TmpPath := n.Parent.Text + '\' + TmpPath;
  89.     n := n.Parent;
  90.   end;
  91.   FFileName := FRootPath + TmpPath + FExt;
  92.   Cursor := crDefault;
  93.   inherited;
  94. end;
  95.  
  96. procedure TDirTreeView.Collapse(Node: TTreeNode);
  97. begin
  98.   inherited;
  99.   Node.ImageIndex := ;
  100.   Node.SelectedIndex := ;
  101. end;
  102.  
  103. procedure TDirTreeView.Expand(Node: TTreeNode);
  104. begin
  105.   inherited;
  106.   Node.ImageIndex := ;
  107.   Node.SelectedIndex := ;
  108. end;
  109.  
  110. procedure TDirTreeView.OpenList(const aKey: string);
  111. var
  112.   i: Integer;
  113. begin
  114.   Items.Clear;
  115.   DirToTree(Self, FRootPath, '', FExt, aKey);
  116.   {取消空文件夹}
  117.   Items.BeginUpdate;
  118.   for i := Items.Count - downto do
  119.   begin
  120.     if (not Items[i].HasChildren) and (Items[i].ImageIndex = ) then
  121.       Items[i].Delete
  122.     else if aKey <> '' then
  123.       Items[i].Expanded := True;
  124.   end;
  125.   Items.EndUpdate;
  126. end;
  127.  
  128. end.

测试: 
1、在空白窗体上放 Memo1: TMemo; 和 Splitter1: TSplitter;
2、再放 ImageList1: TImageList; 添加三个图标, 分别表示: 文件夹、文件、已打开的文件夹.


  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, ComCtrls, ImgList, StdCtrls, ExtCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     ImageList1: TImageList;
  12.     Memo1: TMemo;
  13.     Splitter1: TSplitter;
  14.     procedure TreeViewOnChange(Sender: TObject; Node: TTreeNode);
  15.     procedure FormShow(Sender: TObject);
  16.     procedure FormCreate(Sender: TObject);
  17.   end;
  18.  
  19. var
  20.   Form1: TForm1;
  21.  
  22. implementation
  23.  
  24. {$R *.dfm}
  25.  
  26. uses DirTreeView;
  27.  
  28. procedure TForm1.FormCreate(Sender: TObject);
  29. begin
  30.   Memo1.Font.Name := 'Fixedsys';
  31.   Memo1.Align := alClient;
  32.   Memo1.ScrollBars := ssBoth;
  33. end;
  34.  
  35. procedure TForm1.FormShow(Sender: TObject);
  36. var
  37.   dir: string;
  38. begin
  39.   dir := GetEnvironmentVariable('Delphi') + '\source';
  40.   with TDirTreeView.Create(Self, dir, '.pas') do begin //测试浏览 Delphi 官方源码
  41.     Parent := Self;
  42.     Align := alLeft;
  43.     Width := ;
  44.     Images := ImageList1;
  45.     OnChange := TreeViewOnChange;
  46.     OpenList(); //其参数是要过滤的关键字
  47.   end;
  48. end;
  49.  
  50. procedure TForm1.TreeViewOnChange(Sender: TObject; Node: TTreeNode);
  51. var
  52.   FileName: string;
  53. begin
  54.   FileName := TDirTreeView(Sender).FileName;
  55.   Memo1.Lines.LoadFromFile(FileName);
  56. end;
  57.  
  58. end.

测试效果图:

http://www.cnblogs.com/del/archive/2011/07/07/2100069.html

做了一个浏览指定文件格式的 TreeView(方便查看Source目录下的源码)的更多相关文章

  1. 2018-01-28-TF源码做版本兼容的一个粗暴方法

    layout: post title: 2018-01-28-TF源码做版本兼容的一个粗暴方法 key: 20180128 tags: IT AI TF modify_date: 2018-01-28 ...

  2. 分享一个客户端程序(winform)自动升级程序,思路+说明+源码

    做winform的程序,不管用没用过自动更新,至少都想过自动更新是怎么实现的. 我这里共享一个自动更新的一套版本,给还没下手开始写的人一些帮助,也希望有大神来到,给指点优化意见. 本初我是通过sock ...

  3. [ASP.NET]分析MVC5源码,并实现一个ASP.MVC

    本节内容不是MVC入门教程,主要讲MVC原理,实现一个和ASP.NET MVC类似基本原理的项目. MVC原理是依赖于ASP.NET管道事件基础之上的.对于这块,可阅读上节内容 [ASP.NET]谈谈 ...

  4. koa2源码解读及实现一个简单的koa2框架

    阅读目录 一:封装node http server. 创建koa类构造函数. 二:构造request.response.及 context 对象. 三:中间件机制的实现. 四:错误捕获和错误处理. k ...

  5. JGUI源码:从头开始,建一个自己的UI框架(1)

    开篇 1.JGUI是为了逼迫自己研究底层点的前端技术而做的框架,之前对web底层实现一直没有深入研究,有了技术瓶颈,痛定思痛从头研究, 2.虽然现在vue技术比较火,但还在发展阶段,暂时先使用JQue ...

  6. Netty 核心组件 Pipeline 源码分析(二)一个请求的 pipeline 之旅

    目录大纲: 前言 针对 Netty 例子源码做了哪些修改? 看 pipeline 是如何将数据送到自定义 handler 的 看 pipeline 是如何将数据从自定义 handler 送出的 总结 ...

  7. 从vue.js的源码分析,input和textarea上的v-model指令到底做了什么

    v-model是 vue.js 中用于在表单表单元素上创建双向数据绑定,它的本质只是一个语法糖,在单向数据绑定的基础上,增加了监听用户输入事件并更新数据的功能:对,它本质上只是一个语法糖,但到底是一个 ...

  8. 适合新手:从零开发一个IM服务端(基于Netty,有完整源码)

    本文由“yuanrw”分享,博客:juejin.im/user/5cefab8451882510eb758606,收录时内容有改动和修订. 0.引言 站长提示:本文适合IM新手阅读,但最好有一定的网络 ...

  9. Java源码系列4——HashMap扩容时究竟对链表和红黑树做了什么?

    我们知道 HashMap 的底层是由数组,链表,红黑树组成的,在 HashMap 做扩容操作时,除了把数组容量扩大为原来的两倍外,还会对所有元素重新计算 hash 值,因为长度扩大以后,hash值也随 ...

随机推荐

  1. 微信小程序要调数据 微信小程序 for 循环详解

    现在要完成这样的效果: 我的代码是: <view class="l-setlist clr" > <template name="listab" ...

  2. 弄App Store提示和技巧推荐

    众所周知上苹果的主页推荐是对产品最佳(高曝光率+零广告费)推广,然而苹果却对选择的方式和规则讳莫如深. 下面是搜集的一些获得推荐的开发人员的经验. 1. 产品要新颖.且质量上乘.这个质量包括非常多细节 ...

  3. Linux 下的任务管理 —— ps、top

    ps:report a snapshot of the current processes. ps 命令支持三种使用的语法格式 UNIX 风格,选项可以组合在一起,并且选项前必须有"-&qu ...

  4. 可以左右移动横向无缝滚动的JS图片展示代码

    在酷站网站下的,具体路径忘了,稍微改了一下,让它看起来像组滑动 1)被引用的js文件ScrollPic.js ?){){i+=l.length;)I=document.cookie.length;o= ...

  5. 他们实际上控制的定义很easy5/12

    尊重原创转载请注明:From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige 侵权必究! 炮兵镇楼 近期龙体欠安.非常多任务都堆着,虽 ...

  6. New in 10.2.2: C++ and Debugger Improvements

    In RAD Studio 10.2.2, we've made a number of great quality improvements for the C++ toolchain and fo ...

  7. /var/tmp/.oracle 和 oracle listener (监听)的一点理解

    关于 /var/tmp/.oracle 的作用測试 ~---查看 /var/tmp 的权限 [root@lixora var]# ll total 164 ... drwxrwxrwt  3 root ...

  8. 在sql语句中 inner join ,left join,right join 和on 以及where

    当使用几种join的时候,on是指表连接起来基于的条件,where是对连接的表进行过滤的条件. where 1=1  当我们需要拼接字符串的时候 在基础sql字符串中写上where 1=1 可以不需要 ...

  9. WinEdt && LaTex(三)—— 宏包

    amsmath:最常用的数学宏包 1. bm:bold math 数学字体加粗 \documentclass{article} \usepackage{bm} \begin{document} \[ ...

  10. Visual C# 2010 实现资源管理器

    演练:使用设计器创建带有 ListView 和 TreeView 控件的资源管理器样式的界面 Visual Studio 2010     其他版本     此主题尚未评级 - 评价此主题   Vis ...