做了一个浏览指定文件格式的 TreeView(方便查看Source目录下的源码)
2016-11-03 23:28
239 查看
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 = -1): 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 = -1 then Node := nil else Node := aTree.Items[aNum]; if FindFirst(LDir + '\*.*', faAnyFile, sr) = 0 then begin repeat if sr.Name[1] = '.' then Continue; if (sr.Attr and faDirectory) = faDirectory then begin NodeTemp := aTree.Items.AddChild(Node, sr.Name); NodeTemp.ImageIndex := 0; NodeTemp.SelectedIndex := 0; DirToTree(aTree, '', LDir + '\' + sr.Name, aExt, aKey, aTree.Items.Count-1); end else begin if aKey <> '' then if Pos(aKey, StringReplace(LDir + '\' + sr.Name, LRootDir, '', [rfIgnoreCase])) = 0 then Continue; if ExtractFileExt(sr.Name) = aExt then begin NodeTemp := aTree.Items.AddChild(Node, ChangeFileExt(sr.Name, '')); NodeTemp.ImageIndex := 1; NodeTemp.SelectedIndex := 1; end; end; Application.ProcessMessages; until (FindNext(sr) <> 0); 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[1] = '*' 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 <> 1 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 := 0; Node.SelectedIndex := 0; end; procedure TDirTreeView.Expand(Node: TTreeNode); begin inherited; Node.ImageIndex := 2; Node.SelectedIndex := 2; end; procedure TDirTreeView.OpenList(const aKey: string); var i: Integer; begin Items.Clear; DirToTree(Self, FRootPath, '', FExt, aKey); {取消空文件夹} Items.BeginUpdate; for i := Items.Count - 1 downto 0 do begin if (not Items[i].HasChildren) and (Items[i].ImageIndex = 0) 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 := 200; 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
- 做了一个浏览指定文件格式的 TreeView
- 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本
- 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本
- 将Linux系统的多个目录及文件备份并压缩到一个文件,以方便查看和维护
- 使用java的输出流写一个json格式的文件在指定目录下
- 一个使用多线程删除指定目录及子目录下所有指定文件的Java程序(源码)
- 分享下java 读取目录及子目录下指定文件名的路径 并放到一个List数组里面返回遍历和写到文件里
- C#如何生成一个XML文件,并保存在硬盘的指定目录下
- Aveiconifier是一个非常实用方便的制作ico格式文件的小工具~
- 在Asp.net中如何遍历一个本地目录下的所有文件并上载到Web 服务器上指定的目录中
- 将一个文件另存到一个指定的目录下
- 一个用来监听指定目录下的文件系统类FileSystemWatcher
- 将多级目录的文件拷贝到一个指定目录
- 得到一个指定目录下所有文件的文件名,子目录名不要
- 在某一个目录中寻找与指定的文件内容相同的文件
- Linux网络编程一步一步学-自己编写一个HTTP协议的目录浏览和文件下载服务器
- 一个emacs扩展,从指定目录或文件中搜索指定关键字
- 浏览文件窗口中指定默认目录
- 将多级目录的文件拷贝到一个指定目录