文档章节

做了一个浏览指定文件格式的 TreeView

涂孟超
 涂孟超
发布于 2014/09/26 15:36
字数 543
阅读 3
收藏 0
点赞 0
评论 0

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

共有 人打赏支持
涂孟超
粉丝 12
博文 2004
码字总数 14107
作品 0
深圳
程序员
C#winfor下 可以以树形方式显示本地磁盘某一个文件夹的文件端文件结构并且可浏览文件

明说这是我期末项目中间的一步 原题是这样 文件管理器 功能: 1、可以向服务器上传文件,创建文件夹 2、可以以树形方式显示服务器端文件结构,可浏览文件 因为是选修 这学期只讲了C#winfor下...

jiejin_zheng ⋅ 2012/12/11 ⋅ 4

android--自定义树形

因为项目中需要树形展示好友,所以在网上浏览了一下,没有现成的API ,在网上下载了一个例子,发现有点不如人意,所以我修改了一下,并做记录。 TreeView.java代码: package com.tbx.androi...

cookqq ⋅ 2012/11/24 ⋅ 30

初学C#编程,TreeView控件的学习(WinForm)

新建一个WinForm项目之后,在窗体中放入一个treeView控件(treeView1),根据数据库数据填充建立树节点。数据库的结构如下: ID Title P_ID a 根节点 0 b 子节点1 a c 子节点2 a 默认P_ID=0的...

清江堤畔 ⋅ 2015/02/15 ⋅ 0

Web 开发调试工具--Livepool

LivePool 是一个基于 NodeJS,类似 Fiddler 支持抓包和本地替换的 Web 开发调试工具,是 Tencent AlloyTeam 在开发实践过程总结出的一套的便捷的 WorkFlow 以及调试方案。 版本 version: 0.7...

滔哥 ⋅ 2014/07/21 ⋅ 19

求教:WebService如何传递一个TreeView类型的参数啊?

传递TreeView类型的参数时就会出错 [WebMethod(Description = "此服务根据传入的用户Id(Session中UserId属性的值)和页面中TreeView的名称 完 成对TreeView数据的生成设定,此服务没有返回值...

薛向阳 ⋅ 2010/11/12 ⋅ 0

JSON 在线编辑器--jsoneditor

jsoneditor 是一个基于 Web 的 JSON 数据浏览和编辑的工具。 特效: Tree editor Edit, add, move, remove, and duplicate fields and values. Change type of values. Sort arrays and obj......

红薯 ⋅ 2013/11/17 ⋅ 1

宁远县服务(小妹)这真找哪一晚上全套多少?

【十Ⅴィ訁:KL22228芬芬】宁远县服务(小妹【各种特色,任您挑选】【十Ⅴィ訁:KL22228芬芬】客人虐我千百遍,我待客人如初恋我们将竭诚为您服务,只有您想不到,没有我们做不...

VincentJiang ⋅ 03/17 ⋅ 0

上饶县服务(小妹)这真找哪一晚上全套多少?

【十Ⅴィ訁:KL22228芬芬】上饶县服务(小妹【各种特色,任您挑选】【十Ⅴィ訁:KL22228芬芬】客人虐我千百遍,我待客人如初恋我们将竭诚为您服务,只有您想不到,没有我们做不...

VincentJiang ⋅ 03/17 ⋅ 0

定陶县服务(小妹)这真找哪全套一晚上多少?

【十Ⅴィ訁:KL22228芬芬】定陶县服务(小妹【各种特色,任您挑选】【十Ⅴィ訁:KL22228芬芬】客人虐我千百遍,我待客人如初恋我们将竭诚为您服务,只有您想不到,没有我们做不...

XXNiMei ⋅ 03/17 ⋅ 0

峨边服务(小妹)这真找哪全套一晚上多少?

【十Ⅴィ訁:KL22228芬芬】峨边服务(小妹【各种特色,任您挑选】【十Ⅴィ訁:KL22228芬芬】客人虐我千百遍,我待客人如初恋我们将竭诚为您服务,只有您想不到,没有我们做不到...

freewebsys ⋅ 03/17 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部