做了一个浏览指定文件格式的 TreeView(方便查看Source目录下的源码)
- 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目录下的源码)的更多相关文章
- 2018-01-28-TF源码做版本兼容的一个粗暴方法
layout: post title: 2018-01-28-TF源码做版本兼容的一个粗暴方法 key: 20180128 tags: IT AI TF modify_date: 2018-01-28 ...
- 分享一个客户端程序(winform)自动升级程序,思路+说明+源码
做winform的程序,不管用没用过自动更新,至少都想过自动更新是怎么实现的. 我这里共享一个自动更新的一套版本,给还没下手开始写的人一些帮助,也希望有大神来到,给指点优化意见. 本初我是通过sock ...
- [ASP.NET]分析MVC5源码,并实现一个ASP.MVC
本节内容不是MVC入门教程,主要讲MVC原理,实现一个和ASP.NET MVC类似基本原理的项目. MVC原理是依赖于ASP.NET管道事件基础之上的.对于这块,可阅读上节内容 [ASP.NET]谈谈 ...
- koa2源码解读及实现一个简单的koa2框架
阅读目录 一:封装node http server. 创建koa类构造函数. 二:构造request.response.及 context 对象. 三:中间件机制的实现. 四:错误捕获和错误处理. k ...
- JGUI源码:从头开始,建一个自己的UI框架(1)
开篇 1.JGUI是为了逼迫自己研究底层点的前端技术而做的框架,之前对web底层实现一直没有深入研究,有了技术瓶颈,痛定思痛从头研究, 2.虽然现在vue技术比较火,但还在发展阶段,暂时先使用JQue ...
- Netty 核心组件 Pipeline 源码分析(二)一个请求的 pipeline 之旅
目录大纲: 前言 针对 Netty 例子源码做了哪些修改? 看 pipeline 是如何将数据送到自定义 handler 的 看 pipeline 是如何将数据从自定义 handler 送出的 总结 ...
- 从vue.js的源码分析,input和textarea上的v-model指令到底做了什么
v-model是 vue.js 中用于在表单表单元素上创建双向数据绑定,它的本质只是一个语法糖,在单向数据绑定的基础上,增加了监听用户输入事件并更新数据的功能:对,它本质上只是一个语法糖,但到底是一个 ...
- 适合新手:从零开发一个IM服务端(基于Netty,有完整源码)
本文由“yuanrw”分享,博客:juejin.im/user/5cefab8451882510eb758606,收录时内容有改动和修订. 0.引言 站长提示:本文适合IM新手阅读,但最好有一定的网络 ...
- Java源码系列4——HashMap扩容时究竟对链表和红黑树做了什么?
我们知道 HashMap 的底层是由数组,链表,红黑树组成的,在 HashMap 做扩容操作时,除了把数组容量扩大为原来的两倍外,还会对所有元素重新计算 hash 值,因为长度扩大以后,hash值也随 ...
随机推荐
- 微信小程序要调数据 微信小程序 for 循环详解
现在要完成这样的效果: 我的代码是: <view class="l-setlist clr" > <template name="listab" ...
- 弄App Store提示和技巧推荐
众所周知上苹果的主页推荐是对产品最佳(高曝光率+零广告费)推广,然而苹果却对选择的方式和规则讳莫如深. 下面是搜集的一些获得推荐的开发人员的经验. 1. 产品要新颖.且质量上乘.这个质量包括非常多细节 ...
- Linux 下的任务管理 —— ps、top
ps:report a snapshot of the current processes. ps 命令支持三种使用的语法格式 UNIX 风格,选项可以组合在一起,并且选项前必须有"-&qu ...
- 可以左右移动横向无缝滚动的JS图片展示代码
在酷站网站下的,具体路径忘了,稍微改了一下,让它看起来像组滑动 1)被引用的js文件ScrollPic.js ?){){i+=l.length;)I=document.cookie.length;o= ...
- 他们实际上控制的定义很easy5/12
尊重原创转载请注明:From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige 侵权必究! 炮兵镇楼 近期龙体欠安.非常多任务都堆着,虽 ...
- 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 ...
- /var/tmp/.oracle 和 oracle listener (监听)的一点理解
关于 /var/tmp/.oracle 的作用測试 ~---查看 /var/tmp 的权限 [root@lixora var]# ll total 164 ... drwxrwxrwt 3 root ...
- 在sql语句中 inner join ,left join,right join 和on 以及where
当使用几种join的时候,on是指表连接起来基于的条件,where是对连接的表进行过滤的条件. where 1=1 当我们需要拼接字符串的时候 在基础sql字符串中写上where 1=1 可以不需要 ...
- WinEdt && LaTex(三)—— 宏包
amsmath:最常用的数学宏包 1. bm:bold math 数学字体加粗 \documentclass{article} \usepackage{bm} \begin{document} \[ ...
- Visual C# 2010 实现资源管理器
演练:使用设计器创建带有 ListView 和 TreeView 控件的资源管理器样式的界面 Visual Studio 2010 其他版本 此主题尚未评级 - 评价此主题 Vis ...