unit DirTreeView;

interface

uses
  SysUtils, Classes, Controls, Forms, ComCtrls; type
  TDirTreeView = class(TTreeView)
  private
    FRootPath: string;
    FExt: string;
    FFileName: string;
  protected
    procedure Collapse(Node: TTreeNode); override;
    procedure Expand(Node: TTreeNode); override;
    procedure Change(Node: TTreeNode); override;
  public
    constructor Create(AOwner: TComponent; const aRootPath,aExt: string); reintroduce;
    procedure OpenList(const aKey: string = '');
    property FileName: string read FFileName;
  end; implementation function DirToTree(aTree: TTreeView; const aRootDir,aDir,aExt: string; const aKey: string=''; aNum: Integer = -): Boolean;
var
  sr: TSearchRec;
  Node,NodeTemp: TTreeNode;
  LRootDir,LDir: string;
begin
  LRootDir := ExcludeTrailingPathDelimiter(aRootDir);
  LDir := ExcludeTrailingPathDelimiter(aDir);
  if LRootDir <> '' then LDir := ExcludeTrailingPathDelimiter(LRootDir) + LDir;
  if aNum = - then Node := nil else Node := aTree.Items[aNum];   if FindFirst(LDir + '\*.*', faAnyFile, sr) = then
  begin
    repeat
      if sr.Name[] = '.' then Continue;
      if (sr.Attr and faDirectory) = faDirectory then
      begin
          NodeTemp := aTree.Items.AddChild(Node, sr.Name);
          NodeTemp.ImageIndex := ;
          NodeTemp.SelectedIndex := ;
          DirToTree(aTree, '', LDir + '\' + sr.Name, aExt, aKey, aTree.Items.Count-);
      end else begin
        if aKey <> '' then
          if Pos(aKey, StringReplace(LDir + '\' + sr.Name, LRootDir, '', [rfIgnoreCase])) = then
            Continue;
        if ExtractFileExt(sr.Name) = aExt then
        begin
          NodeTemp := aTree.Items.AddChild(Node, ChangeFileExt(sr.Name, ''));
          NodeTemp.ImageIndex := ;
          NodeTemp.SelectedIndex := ;
        end;
      end;
      Application.ProcessMessages;
    until (FindNext(sr) <> );
  end;
  Result := True;
end; { TDirTreeView }
constructor TDirTreeView.Create(AOwner: TComponent; const aRootPath, aExt: string);
begin
  inherited Create(AOwner);
  AutoExpand := True;
  ShowButtons := False;
  ShowLines := False;
  FRootPath := ExcludeTrailingPathDelimiter(aRootPath) + '\';
  FExt := aExt;
  if FExt[] = '*' then FExt := StringReplace(FExt, '*.', '.', [rfIgnoreCase]);
end; procedure TDirTreeView.Change(Node: TTreeNode);
var
  n: TTreeNode;
  TmpPath: string;
begin
  if not Node.Selected then Exit;
  if Node.ImageIndex <> then Exit;
  Cursor := crHourGlass;
  n := Node;
  TmpPath := n.Text;
  while n.Parent <> nil do
  begin
    TmpPath := n.Parent.Text + '\' + TmpPath;
    n := n.Parent;
  end;
  FFileName := FRootPath + TmpPath + FExt;
  Cursor := crDefault;
  inherited;
end; procedure TDirTreeView.Collapse(Node: TTreeNode);
begin
  inherited;
  Node.ImageIndex := ;
  Node.SelectedIndex := ;
end; procedure TDirTreeView.Expand(Node: TTreeNode);
begin
  inherited;
  Node.ImageIndex := ;
  Node.SelectedIndex := ;
end; procedure TDirTreeView.OpenList(const aKey: string);
var
  i: Integer;
begin
  Items.Clear;
  DirToTree(Self, FRootPath, '', FExt, aKey);
  {取消空文件夹}
  Items.BeginUpdate;
  for i := Items.Count - downto do
  begin
    if (not Items[i].HasChildren) and (Items[i].ImageIndex = ) then
      Items[i].Delete
    else if aKey <> '' then
      Items[i].Expanded := True;
  end;
  Items.EndUpdate;
end; end.

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


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ImgList, StdCtrls, ExtCtrls; type
  TForm1 = class(TForm)
    ImageList1: TImageList;
    Memo1: TMemo;
    Splitter1: TSplitter;
    procedure TreeViewOnChange(Sender: TObject; Node: TTreeNode);
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  end; var
  Form1: TForm1; implementation {$R *.dfm} uses DirTreeView; procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Font.Name := 'Fixedsys';
  Memo1.Align := alClient;
  Memo1.ScrollBars := ssBoth;
end; procedure TForm1.FormShow(Sender: TObject);
var
  dir: string;
begin
  dir := GetEnvironmentVariable('Delphi') + '\source';
  with TDirTreeView.Create(Self, dir, '.pas') do begin //测试浏览 Delphi 官方源码
    Parent := Self;
    Align := alLeft;
    Width := ;
    Images := ImageList1;
    OnChange := TreeViewOnChange;
    OpenList(); //其参数是要过滤的关键字
  end;
end; procedure TForm1.TreeViewOnChange(Sender: TObject; Node: TTreeNode);
var
  FileName: string;
begin
  FileName := TDirTreeView(Sender).FileName;
  Memo1.Lines.LoadFromFile(FileName);
end; 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. 【14.67%】【codeforces 615D】Multipliers

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  2. UWP 和 WPF 对比

    原文:UWP 和 WPF 对比 本文告诉大家 UWP 和 WPF 的不同. 如果在遇到技术选择或者想和小伙伴吹的时候可以让他以为自己很厉害,那么请继续看. 如果在看这文章还不知道什么是 UWP 和 W ...

  3. 调试分析工具 (C/C++)

    一.静态分析工具 cppcheck cppcheck主要用于对C/C++源代码进行分析检查的一个开源工具,可以用来检测未使用的变量.越界访问.内存泄漏等问题. 使用方法 cppcheck --enab ...

  4. dot net core 使用 usb

    原文:dot net core 使用 usb 本文告诉大家如何在 dot net core 使用 usb 目录 获得通知 读写 串口通信 LGPL 首先需要打开 Nuget 安装 CoreCompat ...

  5. AlertDialog通过反射机制阻止Dialog关闭

    在开发Android应用程序时,我们可能会用到需要用户输入的Dialog,如登录对话框等.这时候,如果用户没有输入登录信息而点击<确定>按钮时,我们并不希望登录Dialog消失,而是采用一 ...

  6. WPF依赖属性值源(BaseValueSource)

    原文:WPF依赖属性值源(BaseValueSource)   WPF依赖属性提供一个机制,可以获取依赖属性提供值的来源 其以BaseValueSource枚举表示 1.Default public ...

  7. Android开发中如何加载API源码帮助开发

    在eclipse中添加android源码既可以帮助我们的开发,又能使我们边开发边学习. android环境的搭建:http://blog.csdn.net/dawanganban/article/de ...

  8. Android系统联系人全特效实现(上),分组导航和挤压动画

    记得在我刚接触Android的时候对系统联系人中的特效很感兴趣,它会根据手机中联系人姓氏的首字母进行分组,并在界面的最顶端始终显示一个当前的分组.如下图所示: 最让我感兴趣的是,当后一个分组和前一个分 ...

  9. WPF的页面导航

    工作中之前接触过的WPF程序一直是使用TabControl作不同页面间的切换,每个Tab负责独立的功能,清晰简捷,所以一直就没有动力研究WPF自带的页面导航.(虽然接触过使用页面导航的WPF项目,也并 ...

  10. 从入门机器学习的零单排:OctaveMatlab经常使用绘图知识

    OctaveMatlab经常使用绘图知识 之前一段时间在coursera看了Andrew ng的机器学习的课程,感觉还不错,算是入门了.这次打算以该课程的作业为主线,对机器学习基本知识做一下总结.小弟 ...