当前位置:文档之家› delphi中TreeView控件使用

delphi中TreeView控件使用

DELPHI中利用TreeView控件建立目录树2000-06-26 00:00:00·-·中国计算机报社p>Rainbow的话:关于TreeView的使用,还可以参看:联合使用TreeView 组件TreeView是一个显示树型结构的控件,通过它能够方便地管理和显示具有层次结构的信息,是Windows应用程序的基本控件之一。

DELPHI虽然具有比较强大的文件管理功能,提供了多个用于文件管理的标准控件,如DriveComboBox、DirectoryListBox、FileListBox等,通过设置它们的属性,使其建立起联系,甚至不用编写一行程序,我们就可以实现在不同的目录之间进行切换,然而这样的目录切换只适用于进行文件的查找定位,而不能方便地进行目录的浏览,例如我们要从c:\windows目录转到c:\program files目录,就必须返回到根目录才能进行切换,而不能象Windows资源管理器那样任意地在不同的目录之间进行浏览与切换。

要实现在不同目录之间任意切换和浏览,还是需要使用TreeView控件,以下程序就利用DELPHI的TreeView控件来建立目录树。

在该程序中采用的各部件以及界面设计如下图所示:各部件的主要属性设置如下:部件属性属性值form namecaptionform1 ‘目录浏览’drivecommbobox name visible drivecommbobox1 falsefilelistbox name visible filetype filelistbox1 false fddirectoryimagelist name imagelist1treeview name images该程序利用DriveCommboBox控件来获得系统具有的驱动器,并以此作为目录树的最上层,利用FileListBox控件,通过设置其Filetype属性为fdDirectory,可以获得所需的子目录,在TreeView控件的OnExpanding事件中将得到的子目录加到该控件的某一节点下。

整个程序的源代码如下:unit main;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, FileCtrl, ComCtrls, ImgList;typeTForm1 = class(TForm)DirTreeView: TTreeView;FileListBox1: TFileListBox;DriveComboBox1: TDriveComboBox;ImageList1: TImageList;procedure FormCreate(Sender: TObject);procedure DirTreeViewExpanding(Sender: TObject; Node: TTreeNode;var AllowExpansion: Boolean);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.DFM}procedure (Sender: TObject);varFirstNode,DirNode : TTreeNode;ItemCount,Index:integer;Itemstr:string;beginItemCount:= and (itemstr 〈〉 ..) thenbeginDirNode := );:=true;:= 0;:= 1;icount:=icount+1;end;if icount = 0 then:= false;end;end;end;end.程序的运行效果如图所示:我们可以展开目录树中的任何一个节点,并且可以在任意节点之间切换,就象我们在Windows资源管理器中所作的那样,而不需要逐级回退之后才能进行切换。

•••••••••Delphi中根据分类数据生成树形结构的最优方法很多系统都有类似于如下的表结构(table1):ID Name ParentID---------------------------------------------------------001 电子类0002 金属类 0003 电容电子 001004 电阻电子 001005 有色金属002而且大家都习惯于用树(TreeView)来显示,这样就可以很好的显示整个表的分类情况。

但如果数据量多时会造成树的生成比较慢,特别是用递归来实现时要访问数据库的次数很多(根据层数),用在三层中效果更加显。

在此提供一个好的方法来生成树形结构。

这个算法只访问一次数据库,具体的实现如下:1、一次性从数据库中取出所有的数据,并按照ParentID字段进行排序,这样就保证每一条数据的父节点都在它的前面。

2、取出第一条数据画到树中,在添加到树中时先找到这条数据的父节点,如果没有则将此记录直接作为树的第一级节点3、如果还有数据,则取出来执行第2步,直到没有数据为止。

程序实现:本程序将用一个stlID的TStringList变量来存放对应树中每一个节点的ID值,用FindParent函数来父节点。

function FindParent(ID:String):TTreeNode;vari:Integer;beginresult:=nil;for i:= downto 0 doif [i]=ID thenbeginresult:=[i];break;end;end;sString),('Name').AsString);('ID').AsString);如何初始化一个TreeView?弄一个窗口,放上一个TreeView和一个Button,分别取名为TV1和Btn1。

如果需要在每个节点前有个图,请在窗口上放上一个ImageList,取名为ImageList1,双击它,加入六个图标。

还要记得记得将TV1的Images属性改为ImageList1噢。

双击按钮Btn1,在里面填入以下代码,然后按F9运行,点击Btn1就可以看到效果了。

procedure (Sender: TObject);ConstMyDocDir = 'C:\My Documents';PersonDir = '3hSoft';VarI : Word;SubNodeName : array [1..5] of ShortString; RootNode, SubNode : TTreeNode;P : PString;beginSubNodeName[1] := '便笺';SubNodeName[2] := '发件箱';SubNodeName[3] := '联系人';SubNodeName[4] := '任务';SubNodeName[5] := '日记';New(P);P^ := MyDocDir + '\' + PersonDir;RootNode := '个人文件夹', P);TreeView中如何设置选中结点vari:integer; {i为设置的选中结点的索引值}beginif i> then[i].selected:=true;或:=[i];三。

设置TreeView结点的图形1. 设置TreeView的images属性为已存在的images对象:=imagelist1;2. 在加入结点后执行:varanode:TTreeNode;begeinanode:=(nil,'item1');:=0; {结点未选中时显示的图标}:=1; {结点选中时显示的图标}end3. 如果结点图形在改变后未发生变化,可以执行:;四。

如何批量处理TreeView结点使用TreeView的items属性的BeginUpdate和EndUpdate方法,例:for i:=0 to dobeginfile :ext:=lowercase[i].text);end;五。

实现TreeView结点拖拽的实例下面的程序片段演示了如何实现拖拽treeview构件结点的例子{鼠标按下时执行的语句}procedure (Sender: TObject;Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin{判断左键按下并且鼠标点在一个结点上开始实现拖拽}if ( Button = mbLeft ) and( htOnItem in ( X, Y ) ) thenbegin( False );end;end;{鼠标拖动执行语句}procedure ( Sender, Source: TObject;X, Y: Integer; State: TDragState; var Accept: Boolean);varNode : TTreeNode;beginif Source = Treeview1 thenbeginNode := ( X, Y ); {取当前结点}if Node <> nil then {当前结点不为空才能实现拖拽,accept:=true}Accept := true;end;end;{鼠标释放时执行的语句}procedure ( Sender, Source: TObject;X, Y : Integer );varTempNode : TTreeNode;AttachMode : TNodeAttachMode;beginif = nil thenExit;AttachMode := naAddChild; {设置结点移动模式,设移动结点为子结点}{ 注意在这里存在一个bug,当移动结点时,如果目标结点没有子结点,}{ 则加入的新的子结点会失败,所以先在当前目标结点的下面 }{ 加入一个临时子结点,移动完毕后,再将临时结点删除 }tryTempNode := ,'Temp' );try{ 移动选中的结点到目标结点 }, AttachMode );finally; { 不要忘了释放临时结点 }end;finallyend;end;今天上午到现在的心得想从以下的一段代码来说明。

代码很简单(当我搞完后才觉得简单,搞了半天,哎,没办法,资质有限呀),主要是要完成当双击TreeView中的一项的时候将数据库中符合条件的数据显示在一个DBGird中。

相关主题