delphi中TreeView控件使用

合集下载

Delphi中为TreeView添加单选和复选框

Delphi中为TreeView添加单选和复选框

Delphi中为TreeView添加单选和复选框 打开电脑,进⼊Windows操作系统,在资源管理器的左边栏中清楚地显⽰了系统管理的所有磁盘的信息以及各个磁盘所容纳的⽂件与⽂件夹(如图⼀)。

这种常见的显⽰⽅式是由⼀个根节点和若⼲个⼦节点构成的,这被称为“树形结构”。

这种树形结构的⽤途⾮常⼴泛,在很多常⽤软件中都出现过它的⾝影。

Windows中将这种结构封装为“树形控件”,即TreeView控件,它与ListView、Button等⼀样都属于系统⾃带的通⽤公共控件。

在Delphi中,TreeView也被封装成了VCL组件,它的位置在“Win32组件”⾯板上,是我们最常⽤的⼏个组件之⼀。

Delphi⾃带的TreeView组件可以显⽰树形结构,也可以为每个节点指定不同的图标来区分各⾃的功能。

但在平时的使⽤中,我们发现它并不能嵌⼊CheckBox或者是RadioButton组件,这样⽤户就不能直观地选择某⼀部分节点或某个节点。

如何来解决这个问题呢?我们思考之后发现,有两种思路可以完成前⾯所述的任务。

⼀种是在TreeView组件的基础上继承的它的功能,并添加所要的功能(使TreeView能嵌⼊CheckBox或者是RadioButton组件)即重写⼀个组件。

另⼀种是利⽤⽤户的错觉,将CheckBox或者是RadioButton所能实现的外观⽤两种状态的图⽚(⼀种是选中状态另⼀种是未选中状态)来交替显⽰,⾛迂回路线来完成任务。

我们来分析⼀下这两种⽅法的优缺点:第⼀种⽅法要重写⼀个组件,显然难度较⼤,所⽤时间较长;第⼆种⽅法,利⽤TreeView组件本⾝就具备的显⽰图标功能,简便易⾏,所⽤时间短,能够完成需求。

⽐较之后,我们选择作⽤第⼆种⽅法,先来看⼀下完成之后的效果(如图⼆),应该说是达到了⽬的,现在我们来细述⼀下完成的过程: ⾸先,我们在Win32⾯板上选择ImageList组件,设置它的StateImages属性,包括两种状态的图标,⼀种是选中状态,另⼀种是未先中状态。

DelPhi Treeview 操作实例

DelPhi Treeview 操作实例

DelPhi Treeview 操作实例onclick节点treeview1.Selected.Level2011-08-31 15:58怎么改变Treeview中的图标? OnClick事件Click获取Node.text 批量处理及实现TreeView结点拖拽的实例//这个过程根据你的要求选择图标procedure TForm1.TreeView1GetImageIndex(Sender: TObject; Node: TTreeNode);beginif Node.HasChildren thenif Node.Expanded thenNode.ImageIndex := 3 //节点有子节点时打开的图标elseNode.ImageIndex := 0 //节点有子节点时收起来的图标else Node.ImageIndex := 1; //节点没有子节点时图标end;//这个过程显示选择的图标procedure TForm1.TreeView1GetSelectedIndex(Sender: TObject; Node: TTreeNode);beginNode.SelectedIndex := Node.ImageIndex; //节点选择后使用的图标end;——————————————————————————————————-//treeview的单击事件procedure TForm1.TreeView1Click(Sender: TObject);begin//如果选中节点的等级(level)为0(根节点等级为0,根节点的子节点等级为1,依次类推)并且其序号(index)为0(同等级下的的节点按从上到下数第一个为0,第二个为1,以此类推)if(treeview1.Selected.Level = 0)and(treeview1.Selected.Index = 0) thenbegin//这里写点中了第一个根节点后要做的事form1.Color := clred;endelseif (treeview1.Selected.Level = 1)and(treeview1.Selected.Index=1) thenbegin//这里写点中了第三个根节点的第2个子节点后要做的事form1.Color := clblue;end;end;//如果你想点节点前的“+”号也有同样的效果,那么就应该在Expanding事件里写判断处理程序。

delphi树控件的用法

delphi树控件的用法

一:TreeView.Items[0].Expanded:=True;//展开第一个节点二:TreeView.Items[0].Item[0].Selected:=True;//移动到第一个节点的第一个子节点找当前节点的下一个节点,按序号找如下:if treeview1.Selected.GetNext<>nil thentreeview1.Selected.GetNext.Selected:=true;TreeView1.SetFocus;找当前节点的下一个同层兄弟如下:if treeview1.Selected.getNextSibling<>nil thentreeview1.Selected.getNextSibling.Selected:=true;TreeView1.SetFocus;TreeView.Selected.getPrevSibling//当前选中节点的上一个兄弟节点TreeView.Selected.Parent//当前选中节点的父节点getfirstchild是跳到该节点子结点中的第一个getlastchild是跳到该节点子结点中的最后一个如果你是想跳到同层兄弟结点的第一个if treeview1.selected.parent<>nil thentreeview1.selected.parent.getfirstchild.selected:=trueelsetreeview1.items.item[0].selected:=true;如果你是想跳到同层兄弟结点的最后一个if treeview1.selected.parent<>nil thentreeview1.selected.parent.getlastchild.selected:=trueelsetreeview1.Items.Item[treeview1.Items.Count-1].Selected:=true;TreeView的使用方法基本信息:TreeView是一个显示树型结构的控件,每一个节点都是一个新类,使用具有代表性每个节点都有四个值:TEXT:显示文字Image Index:显示图形序号Selected Index:State Index:(1)建立目录项(本例中使用的TREEVIEW名称为:TvwTips)增加根目录下的节点:(节点)varCatNode:TTreeNode;//先建立一个TREEVIEW使用的子对象beginTvwTips.SetFocus;//将焦点置到这个TREEVIEW控件上{在根标题下建立一个新的子标题}CatNode:=TvwTips.Items.AddChild(TvwTips.Items.GetFirstNode,'New Category');CatNode.ImageIndex:=1;CatNode.SelectedIndex:=2;CatNode.EditText;{允许用户改变这个标题}end;增加下一级目录(内容):varParentNode,TipNode:TTreeNode;//先建立TREEVIEW使用的子对象VersionNum:Integer;TvwTips.SetFocus;//将焦点置到这个TREEVIEW控件上VersionNum:=TMenuItem(Sender).Tag;{Ver num of new tip} ParentNode:=TvwTips.Selected;{取出当前的选中节点}if ParentNode.Level=nlTip then{Parent cannot be a tip node} ParentNode:=TvwTips.Selected.Parent;TipNode:=TvwTips.Items.AddChildObject(ParentNode,'NewSubject',Pointer(VersionNum));TipNode.ImageIndex:=3;{Normal tip bitmap}TipNode.SelectedIndex:=4;{Highlighted tip bitmap}TipNode.MakeVisible;{Move new tip node into view}TipNode.EditText;{Immediately allow user to edit subject} EnableTreeViewFunctions(TipNode.Level);RtfTip.Clear;RtfTip.Modified:=False;end;(2)说明TvwTips.Items.GetFirstNode返回TREEVIEW的第一个节点,函数类型为:TTreeNodeTvwTips.Items.Count返回当前TreeView的全部节点数,整数TvwTips.Selected.Level返回当前选中节点的在目录树中的级别,根目录为0TvwTips.Selected.Parent返回当前选中节点上级节点,函数类型为:TTreeNode三、下面这段程序是用TREEVIEW连数据库及一些操作:unit bmzd;usesWindows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs, StdCtrls,ComCtrls,Db,DBTables,ImgList,Buttons,ExtCtrls,Grids, DBGrids;typeTfrmbmzd=class(TForm)Panel1:TPanel;cmd_new:TBitBtn;cmd_delete:TBitBtn;cmd_exit:TBitBtn;tvwcode:TTreeView;ScrollBox1:TScrollBox;GroupBox2:TGroupBox;Label3:TLabel;Label2:TLabel;Label1:TLabel;Label4:TLabel;Label5:TLabel;Edit2:TEdit;Edit3:TEdit;Edit4:TEdit;Edit5:TEdit;ImageList1:TImageList;Edit1:TEdit;cmd_save:TBitBtn;cmd_update:TBitBtn;procedure FormShow(Sender:TObject);procedure FormClose(Sender:TObject;var Action:TCloseAction); procedure cmd_newClick(Sender:TObject);procedure cmd_deleteClick(Sender:TObject);procedure Edit2KeyPress(Sender:TObject;var Key:Char); procedure tvwcodeChange(Sender:TObject;Node:TTreeNode); procedure cmd_updateClick(Sender:TObject);procedure BitBtn2Click(Sender:TObject);procedure tvwcodeClick(Sender:TObject);private{Private declarations}function LoadCode(crTbl:TDBDataSet):Integer;function GetLevel(sFormat,sCode:String):Integer;public{Public declarations}end;varfrmbmzd:Tfrmbmzd;ii:integer;tv:ttreenode;constSCodeFormat='222222';//科目代码结构SFirstNodeTxt='部门分类';implementationuses dm;{$R*.DFM}function tfrmbmzd.LoadCode(crTbl:TDBDataSet):Integer; var NowID,sName,ShowTxt:String;i,Level:Integer;MyNode:array[0..6]of TTreeNode;//保存各级节点,最长支持6级(重点)beginScreen.Cursor:=crHourGlass;Level:=0;With frmdm.tabbm dobegintryif not Active then Open;First;tvwCode.Items.Clear;//以下是增加第一项MyNode[Level]:=tvwCode.Items.Add (tvwCode.TopItem,SFirstNodeTxt);MyNode[Level].ImageIndex:=0;MyNode[Level].SelectedIndex:=0;//以上是增加第一项While Not Eof dobeginNowID:=Trim(FieldByName('bumeng_id').AsString); ShowTxt:=FieldByName('bumeng_name').AsString; Level:=GetLevel(SCodeFormat,NowID);//返回代码的级数//以下是增加子项//以下用上一级节点为父节点添加子节点if Level>0then//确保代码符合标准beginMyNode[Level]:=tvwCode.Items.AddChild(MyNode[Level-1],NowID+''+ShowTxt);MyNode[Level].ImageIndex:=1;MyNode[Level].SelectedIndex:=2;end;//以上是增加子项Next;end;finallyClose;end;end;MyNode[0].Expand(False);//将首节点展开Screen.Cursor:=crDefault;end;//以上函数将Code.db表中的科目代码和科目代码名称显示出来//下面函数的功能是返回一代码的级数,//参数sFormat传递科目代码结构;//参数sCode传递某一科目代码function tfrmbmzd.GetLevel(sFormat,sCode:String):Integer;var i,Level,iLen:Integer;beginLevel:=-1;//如果代码不符合标准,则返回-1iLen:=0;if(sFormat<>'')and(sCode<>'')thenfor i:=1to Length(sFormat)doiLen:=iLen+StrToInt(sFormat[i]);if Length(sCode)=iLen thenbeginLevel:=i;Break;end;end;Result:=Level;end;procedure Tfrmbmzd.FormShow(Sender:TObject);beginif not frmdm.tabbm.active then frmdm.tabbm.Open;frmdm.tabbm.IndexFieldNames:='BUMENG_ID';//按字段aCode排序(不要漏掉)LoadCode(frmdm.tabbm);end;procedure Tfrmbmzd.FormClose(Sender:TObject;var Action:TCloseAction); beginAction:=caFree;end;procedure Tfrmbmzd.cmd_newClick(Sender:TObject);tvwcode.SetFocus;if tvwcode.selected.AbsoluteIndex<>0thenbegincmd_delete.Enabled:=true;cmd_update.Enabled:=true;cmd_save.Enabled:=true;if not frmdm.tabbm.Active then frmdm.tabbm.Open;edit1.text:=frmdm.tabbm.Fields[0].asstring;end;tvwcode.SetFocus;tvwcode.Items.AddChild(tvwcode.selected,'新建部门');if tvwcode.Selected.HasChildren thenbeginif tvwcode.Selected.GetLastChild.index+1>9thenedit2.text:=inttostr(tvwcode.Selected.GetLastChild.index+1) elseedit2.text:='0'+inttostr(tvwcode.Selected.GetLastChild.index+1); edit3.text:='新建部门';edit2.Enabled:=true;edit3.Enabled:=true;endelsebeginedit2.text:='01';edit3.text:='新建部门';edit2.Enabled:=true;edit3.Enabled:=true;end;if not frmdm.tabbm.Active then frmdm.tabbm.Open;frmdm.tabbm.edit;frmdm.tabbm.Append;cmd_new.Enabled:=false;cmd_delete.Enabled:=false;cmd_update.Enabled:=false;cmd_save.Enabled:=true;//新建下级部门tvwcode.Selected.GetLastChild.Selected:=true;//设选择tv:=tvwcode.Selected;tvwcode.autoExpand:=true;tvwcode.SetFocus;end;procedure Tfrmbmzd.cmd_deleteClick(Sender:TObject);varI:integer;seno,setext:string;beginif tvwcode.Selected.HasChildren=true thenbeginapplication.messagebox('该部门包含下级,不能删除','提示',MB_OKCANCEL+mb_iconquestion);endelsebeginif application.messagebox('你确实要删除当前部门吗','提示',MB_OKCANCEL+mb_iconquestion)=IDOKbeginsetext:=tvwcode.selected.text;i:=0;while setext[i]<>''dobeginI:=I+1;seno:=seno+setext[i];end;if not frmdm.tabbm.Active then frmdm.tabbm.Open;frmdm.tabbm.setkey;frmdm.tabbm.Fields[0].asstring:=seno;if frmdm.tabbm.GotoKey thenbeginfrmdm.tabbm.edit;frmdm.tabbm.Delete;end;tvwcode.Selected.Delete;cmd_new.Enabled:=true;tvwcode.autoExpand:=true;tvwcode.SetFocus;end;end;end;procedure Tfrmbmzd.Edit2KeyPress(Sender:TObject;var Key:Char); beginif key in['0'..'9',Chr(vk_Back)]thenbeginkey:=#0;application.messagebox('','',mb_ok);end;end;procedure wcodeChange(Sender:TObject;Node:TTreeNode); vari,lev:integer;strr,seno,setext:string;beginif cmd_new.Enabled=true thenbeginif tvwcode.selected.AbsoluteIndex<>0thenbegincmd_delete.Enabled:=true;cmd_update.Enabled:=true;cmd_save.Enabled:=true;setext:=tvwcode.selected.text;i:=0;while setext[i]<>''dobeginI:=I+1;seno:=seno+setext[i];end;if not frmdm.tabbm.Active then frmdm.tabbm.Open;frmdm.tabbm.setkey;frmdm.tabbm.Fields[0].asstring:=seno;frmdm.tabbm.GotoKey;strr:='';case tvwcode.Selected.Level of2:strr:=copy(frmdm.tabbm.fields[0].asstring,1,2);3:strr:=copy(frmdm.tabbm.fields[0].asstring,1,4);end;edit1.text:=strr;//加上级编码edit3.text:=frmdm.tabbm.Fields[1].asstring;//本级编码edit2.text:=copy(frmdm.tabbm.fields[0].asstring,length(frmdm.tabbm.fields[0].asstring)-1,2);endelsebeginedit1.text:='';edit2.text:='';edit3.text:='部门分类';cmd_delete.Enabled:=false;cmd_update.Enabled:=false;end;end;end;procedure Tfrmbmzd.cmd_updateClick(Sender:TObject);vari:integer;beginfor i:=0to ComponentCount-1dobeginif(Components[I]is tedit)then(Components[I]as tedit).enabled:=false;end;for i:=0to ComponentCount-1dobeginif(Components[I]is tbitbtn)then(Components[I]as tbitbtn).enabled:=true;end;if tvwcode.Selected.AbsoluteIndex<>0thenbeginif not frmdm.tabbm.Active then frmdm.tabbm.Open;frmdm.tabbm.Edit;frmdm.tabbm.Fields[0].asstring:=edit1.text+edit2.text;frmdm.tabbm.Fields[1].asstring:=edit3.text;tryfrmdm.tabbm.Post;//表的保存excepton edbengineerror dobeginedit2.Enabled:=true;application.messagebox('编号不能重复,请重新输入','提示',MB_OK+mb_iconquestion); exit;end;end;tvwcode.Selected.Text:=edit1.text+edit2.text+''+edit3.text;tvwcode.SetFocus;//修改树end;cmd_new.Enabled:=true;edit2.Enabled:=false;end;procedure Tfrmbmzd.BitBtn2Click(Sender:TObject);begincmd_new.Enabled:=false;cmd_delete.Enabled:=false;edit2.enabled:=true;edit3.Enabled:=true;end;procedure wcodeClick(Sender:TObject);vari:integer;beginif cmd_new.Enabled=false thenbeginapplication.MessageBox('当前是修改状态,请单击保存按钮','提示',mb_ok); tv.Selected:=true;end;if tvwcode.selected.AbsoluteIndex=0thenbeginfor i:=0to ComponentCount-1dobeginif(Components[I]is tedit)then(Components[I]as tedit).enabled:=false;end;for i:=0to ComponentCount-1dobeginif(Components[I]is tbitbtn)then(Components[I]as tbitbtn).enabled:=false;cmd_new.Enabled:=true;cmd_exit.Enabled:=true;end;end;end;end四、使用概述树形图(Treeview)是Win95下新增加的通用显示部件(Common Control,在COMCTL32.DLL中)之一,从Delphi2.0开始也增加了相应的控件Treeview,用于取代原Outline控件。

TreeView控件使用教程

TreeView控件使用教程

TreeView控件使用教程11. TreeView 控件TreeView 控件显示Node 对象的分层列表,每个Node 对象均由一个标签和一个可选的位图组成。

TreeView 一般用于显示文档标题、索引入口、磁盘上的文件和目录、或能被有效地分层显示的其它种类信息。

语法Treeview说明创建了TreeView 控件之后,可以通过设置属性与调用方法对各Node 对象进行操作,这些操作包括添加、删除、对齐和其它操作。

可以编程展开与折回Node 对象来显示或隐藏所有子节点。

Collapse、Expand 和NodeClick 三个事件也提供编程功能。

Node 对象使用Root、Parent、Child、FirstSibling、Next、Previous 和LastSibling 属性。

在代码中可通过检索对Node 对象的引用,从而在树上定位。

也可以使用键盘定位。

UP ARROW 键和DOWN ARROW 键向下循环穿过所有展开的Node 对象。

从左到右、从上到下地选择Node 对象。

若在树的底部,选择便跳回树的顶部,必要时滚动窗口。

RIGHT ARROW 键和LEFT ARROW 键也穿过所有展开的Node 对象,但是如果选择了未展开的Node之后再按RIGHT ARROW 键,该Node 便展开;第二次按该键,选择将移向下一个Node。

相反,若扩展的Node 有焦点,这时再按LEFT ARROW 键,该Node 便折回。

如果按下ANSI 字符集中的键,焦点将跳转至以那个字母开头的最近的Node。

后续的按该键的动作将使选择向下循环,穿过以那个字母开头的所有展开节点。

控件的外观有八种可用的替换样式,它们是文本、位图、直线和+/- 号的组合,Node 对象可以任一种组合出现。

TreeView 控件使用由ImageList 属性指定的ImageList 控件,来存储显示于Node 对象的位图和图标。

任何时刻,TreeView 控件只能使用一个ImageList。

《delphi学习园地》之 Treeview使用详解

《delphi学习园地》之 Treeview使用详解

TreeView由节点构成,建树通过对TreeView.items属性进行操作。

Items是一个TTreeNodes对象,这是一个TTreeNode集。

一、针对TTreeNodes,也就是 TreeView.Items,有这些属性:1、count,节点个数。

2、item[index] ,通过index得到节点。

二、针对TTreeNodes,也就是 TreeView.Items,常用的添加节点的操作有:AddFirst添加第一个根节点。

由此函数添加的节点总排在前面,除非后来又使用此函数添加了一个节点,则后添加的节点将排在前面。

该函数返回新添加的节点。

AddChildFirst添加第一个子节点,要求有父节点作为其参数。

返回新添加的节点。

AddChild添加一个子节点,要求有父节点作为其参数。

返回新添加的节点。

Add添加一个兄弟节点,要求有兄弟节点作为其参数。

返回新添加的节点。

三、针对TTreeNodes,也就是 TreeView.Items,常用的得到节点的操作有:GetFirstNode() 得到根节点。

然后配合TTreeNode.GetNext(),就可以访问所有的节点。

四、建树举例:varroot_node,cur_node:TTreeNode;beginroot_node:=AddFirst(nil,'根节点1');cur_node:=addChildfirst(root_node,nil,'根节点1_child1');add(cur_node,'根节点1_child2');root_node:=Add(nil,'根节点2');AddChildFirst(root_node,''根节点2_child1');end;五、事件触发:当从一个节点跳到另一个节点,会触发TTreeView.OnChange事件。

该事件中,将传递node,即当前被选中的节点。

treeview用法

treeview用法

treeview用法Treeview一种用于展示数据层次的可视化控件,它通常被用来展示文件夹的内容、文件树状结构、网站的导航结构等。

它可以使用鼠标点击来展开和收起,它的数据通常以树的形式呈现,它可以使用来递归展示数据,以及实现展开和收起的效果。

Treeview使用步骤是:1. 入 Treeview件首先,我们需要在项目中引入 Treeview件,一般来讲,我们可以使用 JavaScript、jQuery、bootstrap相关库来引入 Treeview。

2. 建数据源在使用 Treeview件之前,我们需要准备一份用于展示的文件树状结构的数据。

常见的数据源有 JavaScript数组、JSON式的数据格式等。

3. 始化 Treeview件接着,我们将 Treeview件初始化,通常我们需要指定数据源,以及一些属性,比如支持展开收起等。

4. 建 Treeview 事件当我们在使用 Treeview件的时候,可以创建一些事件,比如点击事件等,这样我们就可以在点击 Treeview件的任意节点时做出相应的反应。

总的来说,Treeview 为我们提供了一种实现文件树状结构展示的可视化控件。

它可以为我们呈现出简洁清晰的数据层次结构,它可以帮助我们更方便地使用它来构建文件层次结构。

Treeview 也可以用于其他更多的场景,比如用于网站的导航设计。

简单的设计可以让用户快速地找到所需的内容,而复杂的设计则可以实现对访问量的控制,帮助用户快速地找到有用的内容。

另外,通过 Treeview件,我们可以让用户看到更直观、更清晰的网站结构,从而使用户可以更加顺利地浏览网站。

另外,Treeview件还可以用于实现较大数据量的展示。

针对于较大的数据量,我们可以利用 Treeview层级展示,实现较大数据量的展示,同时又保留了数据的层次结构,使用户可以更加顺利地浏览数据。

Treeview一种使用极为广泛的可视化控件,它可以用于文件树状结构的展示、网站的导航设计、较大数据量的展示等,它的使用与实现相比较简单,使用它来可视化展示数据是一种更加有效的方式。

delphi中TreeView使用常见问题

delphi中TreeView使用常见问题

delphi中TreeView使⽤常见问题编程⼼得1,在Delphi中,TreeView控件是⼀款很出⾊⽽且很常⽤的控件。

在使⽤过程中,了解到其TTreeNode对象的data属性存储相关数据很有⽤,⼀般情况下,我们先声明⼀个结构体以及其指针,例如:typePMyRc = ^TMyRc;TMyRc = Recordid:string;name:string;age:integer;end;添加⼀个节点,显⽰信息为TMyRc的name,同时存储id,age。

⽅法如下:varp:PMyRc;i:integer;beginRandomize;for i:= 0 to 9 dobeginNew(p);p.id:=inttostr(random(100));:='name'+ inttostr(random(205));p.age:=random(90);// Caption := p.id+' '+ + ' '+inttostr(p.age);TreeView1.Items.AddObject(nil,,Tobject(p));//dispose(p); 如果在这⾥释放指针,id,age并不能存在树中,⽽是在这⾥就被释放了。

应该在释放树的事件⾥书写。

end;end;释放树的事件deletion,即使是删除也会执⾏这些代码。

所以不⽤担⼼内存泄漏。

但是如果不书写以下代码,或者⽤相关的⽅式释放内存,必定会造成内存泄漏。

procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);begindispose(pmyrc(node.data));end;访问某个树枝中的age值:Pmyrc(TreeView1.Selected.data)^.age。

目录树控件TreeView的使用

目录树控件TreeView的使用

TreeView控件百科名片TreeView控件用来显示信息的分级视图,如同Windows里的资源管理器的目录。

TreeVie w控件中的各项信息都有一个与之相关的Node对象。

TreeView显示Node对象的分层目录结构,每个Node对象均由一个Label对象和其相关的位图组成。

在建立TreeView控件后,我们可以展开和折叠、显示或隐藏其中的节点。

TreeView控件一般用来显示文件和目录结构、文档中的类层次、索引中的层次和其他具有分层目录结构的信息。

目录[隐藏]概述属性方法常用属性常用方法常用事件简单示例[编辑本段]概述TreeView 控件显示Node 对象的分层列表,每个Node 对象均由一个标签和一个可选的位图组成。

TreeView 一般用于显示文档标题、索引入口、磁盘上的文件和目录、或能被有效地分层显示的其它种类信息。

创建了TreeView 控件之后,可以通过设置属性与调用方法对各Node 对象进行操作,这些操作包括添加、删除、对齐和其它操作。

可以编程展开与折回Node 对象来显示或隐藏所有子节点。

Colla pse、Expand 和NodeClick 三个事件也提供编程功能。

Node 对象使用Root、Pa rent、Child、FirstSibling、Next、Previous 和LastSibling 属性。

在代码中可通过检索对Node 对象的引用,从而在树上定位。

也可以使用键盘定位。

UP ARROW 键和DOWN ARROW 键向下循环穿过所有展开的Node 对象。

从左到右、从上到下地选择Node 对象。

若在树的底部,选择便跳回树的顶部,必要时滚动窗口。

RI GHT ARROW 键和LEFT ARROW 键也穿过所有展开的Node 对象,但是如果选择了未展开的Node之后再按RIGHT ARROW 键,该Node 便展开;第二次按该键,选择将移向下一个Node。

相反,若扩展的Node 有焦点,这时再按LEFT A RROW 键,该Node 便折回。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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中。

相关文档
最新文档