做了一个浏览指定文件格式的 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值也随 ...
随机推荐
- cordova之File Transfer (Permission denied) 权限导致下载失败 - 简书
原文:cordova之File Transfer (Permission denied) 权限导致下载失败 - 简书 在文件上传时,由于权限问题,会报错(Permission denied),安卓6. ...
- 使用 jquery 的 上传文件插件 uploadify 3.1 配合 java 来做一个简单的文件上次功能。并且在界面上有radio 的选择内容也要上传
使用 jquery 的 上传文件插件 uploadify 3.1 配合 java 来做一个简单的文件上次功能.并且在界面上有radio 的选择内容也要上传 uploadify 插件的 下载和文档地址 ...
- C# 8.0 预览特性
初试C# 8.0 Visual Studio 2019的第一个预览版(使用Visual Studio 2019提高每个开发人员的工作效率)和.NET Core 3.0(宣布.NET Core 3预览1 ...
- iOS6 与iOS7以及7以上状态栏的颜色设置
iOS7默认状态栏文字颜色为黑色 修改为白色的方法:(chenyong注意 我的Status bar style 使用的仍是默认值Gray style(default)) 1在Info.plist中设 ...
- CMake 添加头文件目录,链接动态、静态库(添加子文件夹)
CMake支持大写.小写.混合大小写的命令. 当编译一个需要第三方库的项目时,需要知道: 去哪找头文件(.h),-I(GCC) INCLUDE_DIRECTORIES() 去哪找库文件(.so/.dl ...
- Call、Apply和Bind
首先说一下bind,灵活的通过bind来改变this指针 bind方法会创建一个新函数,称为绑定函数.当调用这个绑定函数时,绑定函数会以创建它时传入bind方法的第一个参数作为this, 传入bind ...
- HDU 4847-Wow! Such Doge!(定位)
Wow! Such Doge! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 手把手教你启用Win10的Linux子系统(超详细)
原文:手把手教你启用Win10的Linux子系统(超详细) 版权声明:转载请保留出处,谢谢! https://blog.csdn.net/zhangdongren/article/details/82 ...
- 零元学Expression Design 4 - Chapter 4 教你如何自制超炫笔刷
原文:零元学Expression Design 4 - Chapter 4 教你如何自制超炫笔刷 在Chapter 2 有稍微讲过Design内建笔刷的用法,本章将教大家如何自制独一无二的笔刷,并且重 ...
- OpenGL(十九) gluOrtho2D、glViewport、glutInitWindowSize区别与关系
gluOrtho2D定义剪裁面,通过正交投影,把景物(模型)按照1:1的比例绘制到一个剪裁面上,相当于对世界坐标窗口的一个截取. glViewport定义视口,即视见窗口,是从世界坐标系窗口到屏幕坐标 ...