楚天晴 發表於 2019-8-12 20:49:00

delphi中Treeview的使用介绍

<p>今天重点学习了TreeView的使用方法,基本的已经写了,现在主要想说的是如何显示数据库的资料,今天只是做了个较简单的例子,一个父节点下显示数据库中某个field的值。代码如下:</p>
<p>&nbsp;&nbsp; procedure TMainForm.TreeviewShow(Sender: TObject);<br>&nbsp;&nbsp; var<br>&nbsp;&nbsp;&nbsp;&nbsp; node1,subnode1: TTreeNode;<br>&nbsp;&nbsp;&nbsp;&nbsp; i: Integer;<br>&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp; Treeview1.Selected := nil;<br>&nbsp;&nbsp;&nbsp;&nbsp; node1 := Treeview1.Items.AddFirst(nil,'user');<br>&nbsp;&nbsp;&nbsp;&nbsp; ADOTable1.Active := True;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; while not ADOTable1.Eof do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for i := 0 to&nbsp; ADOTable1.RecordCount - 1 do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Treeview1.Items.AddChildObject(node1, ADOTable1.FieldByName('USERNAME').AsString, nil);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADOTable1.Next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>&nbsp;&nbsp; end;</p>
<p>使用的是ADO中的ADOTable1来完成。</p>
<p>心得:今天下午比较重要的心得或许就是当你在某个函数中写代码的时候,它会自动把那些不符合它返回值的函数功能屏蔽掉。打个比方,象Treeview1.Items.AddChildObject(node1, ADOTable1.FieldByName('USERNAME').AsString, nil);中的第二项,它要求的是返回String ,如果你使用得失ADODATASET的话,它就自动帮你屏蔽掉了FieldByName这个功能,因为返回的不是String,所以,在这种情况下最好是把你需要的函数在空白处得到在copy到里面去。</p>
<p>  每一个节点下子节点形成这一节点的<span>Items属性,当前节点有一个唯一的<span>Index(TreeNode的<span>Index属性<span>),用于说明子节点在<span>Items中的位置,每一个节点下的子节点是顺序编号的,第一个是<span>0,第二个是<span>1,依次类推。用<span>IndexOf方法获得子节点的顺序,绝对顺序<span>(AbsoluteIndex)则是指从<span>Treeview第一个项开始的顺序值,第一个是<span>0,如此推下去。<span>Item属性则根据<span>Index的值返回当前节点的第<span>Index个子节点。<span>Count则表明属于此项的所有子节点的数量。用<span>MoveTo方法将<span>Item由一个位置移到另一个位置。<br>  <span>Expanded属性表明是否所有的子项都全部展开<span>(包括子项的子项<span>),为<span>True表示全部展开。<span>IsVisible属性表明一个项是否在树中能被看到,如果树全部展开那么这个<span>Item是肯定可以被看到。<span>HasChildren属性表明一个项是否有子项。&nbsp;<span>GetFirstChild, GetLastChild, GetPrevChild, and GetNextChild分别返回当前项子项的第一个、最后一个和前一个、后一个项。<span>GetNextSibling and GetPrevSibling则返回在同一<span>Level下的下一个和上一个项。<span>GetNextVisible and GetPrevVisible则返回能看得到的下一个和上一个项。如果一个节点有<span>Parent,则<span>HasAsParent方法返回<span>True. Parent为当前项的父项。<span>Focused属性确定焦点是否落在此节点上,被<span>Focus时会一个标准的方框围住。很显然,只有一个节点会被聚焦。&nbsp;<span>Selected属性表明一个节点是否被选中,同样只有一个节点会被选中。<span>DropTarget属性表明节点在拖动操作中是源还是目标。<br><br><span>.1.添加、删除、修改节点:<br>静态的方法可以在设计时通过<span>Items的编辑器设置各节点的内容。<br>在添加和删除前必须保证有节点被选中<span>(Treeview.Selected = nil)<br>用<span>AddFirst, AddFirstChild, AddChild等先添加根节点,如<span>Treeview.Items.AddFirst( nil, 'Root');<br>然后以此为基础,添加此项的子节点。<br><br>删除节点<br><span>Treeview.Selected.Delete<br><br>编辑节点内容<br><span>Treeview.Selected.EditText<br><br>注意:由于根节点没有父节点&nbsp;<span>(TTreeNode.Parent= nil)<br>此外,在大批量添加数据到<span>Treeview中时最好使用<br>  <span>TreeView.Items.BeginUpdate;<br>  添加节点<br>  <span>TreeView.Items.EndUpdate<br>这样能加快显示速度。<br><br><span>2.在节点上添加图象<br><span>Treeview中几个与图象相关的属性:<br>  <span>SelectedIndex:当节点被选中时在<span>TimageList&nbsp;中选什么样的图象<br>  <span>OverlayIndex:选那副图象作为掩图(一幅图象透明地显示在另一幅图象的前面),比如一个节点不可用时加一副<span>X图象在其前面。<br>  <span>ImageIndex:在常态时选用的图的序号<br>  <span>StateIndex: 在<span>StateImages这个<span>ImageList中对应的序号,<span>-1时不显示图象<br>  比较典型的,象在文件管理器中的所显示的一样,<span>Treeview控件在节点之前也可以显示图象。在<span>Form中放置一<span>ImageList控件,加入几个图片,分别被<span>Index为<span>0,1,…在<span>Treeview的<span>Image属性项填入你所加入的<span>ImageList的控件名称。<span>TreeNode的<span>ImageIndex表示节点未被选中时<span>(Selected=nil)的图片序号,<span>SelectedIndex表示节点被选中时图片序号。</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p>&nbsp;&nbsp;&nbsp; 加入父节点使用的命令是Treeview.Items.AddFirst(nil,'father');里面的nil的意思是初始标记(不是0的意思,0已经代表了建立了一个关于节点的对象了,nil代表的是初始化时候的一个node)。在使用该函数来创建节点的时候,你会发现很多例子中都会建立一个TTreeNode对象来把刚才建立父节点的命令赋给这个对象,比如现在有个TTreeNode对象node1,那么就可以写成node1 := Treeview1.Items.AddFirst(nil,'father'),目的是把该节点的标识位置赋予node1,这里不需要再写多一个相同的AddFirst了,因为在赋予node1的同时就已经建立了这个父节点了。那为什么需要这个node1呢?当然,如果你只有一层节点没有子节点的话,可以不需要这个,这个node1主要是为了给建立子节点的时候给它一个标识,告诉系统这个子节点是属于哪个父节点的,命令如下reeview1.Items.AddChildObject(node1, 'child', nil);</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>delphi中TreeView使用常见问题</span></p>
<p>&nbsp;</p>
<p>编程心得</p>
<p>1,在Delphi中,TreeView控件是一款很出色而且很常用的控件。</p>
<p>在使用过程中,了解到其TTreeNode对象的data属性存储相关数据很有用,一般情况下,我们先声明一个结构体以及其指针,例如:</p>
<p>type</p>
<p>&nbsp; PMyRc = ^TMyRc;</p>
<p>&nbsp; TMyRc = Record</p>
<p>&nbsp;&nbsp;&nbsp; id:string;</p>
<p>&nbsp;&nbsp;&nbsp; name:string;</p>
<p>&nbsp;&nbsp;&nbsp; age:integer;</p>
<p>&nbsp; end;</p>
<p>添加一个节点,显示信息为TMyRc的name,同时存储id,age。方法如下:</p>
<p>var</p>
<p>&nbsp; p:PMyRc;</p>
<p>&nbsp; i:integer;</p>
<p>begin</p>
<p>&nbsp; Randomize;</p>
<p>&nbsp; for i:= 0 to 9 do</p>
<p>&nbsp; begin</p>
<p>&nbsp; New(p);</p>
<p>&nbsp; p.id:=inttostr(random(100));</p>
<p>&nbsp; p.name:='name'+ inttostr(random(205));</p>
<p>&nbsp; p.age:=random(90);</p>
<p>&nbsp;// Caption := p.id+'&nbsp; '+P.name + '&nbsp;&nbsp; '+inttostr(p.age);</p>
<p>&nbsp; TreeView1.Items.AddObject(nil,p.name,Tobject(p));</p>
<p>&nbsp; //dispose(p);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果在这里释放指针,id,age并不能存在树中,而是在这里就被释放了。应该在释放树的事件里书写。</p>
<p>&nbsp; end;</p>
<p>end;</p>
<p>释放树的事件deletion, 即使是删除也会执行这些代码。所以不用担心内存泄漏。但是如果不书写以下代码,或者用相关的方式释放内存,必定会造成内存泄漏。</p>
<p>procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);</p>
<p>begin&nbsp;</p>
<p>&nbsp; dispose(pmyrc(node.data));</p>
<p>end;</p>
<p>访问某个树枝中的age值:</p>
<p>Pmyrc(TreeView1.Selected.data)^.age</p>

</div>
<div id="MySignature" role="contentinfo">
    好的代码像粥一样,都是用时间熬出来的<br><br>
来源:https://www.cnblogs.com/jijm123/p/11342485.html
頁: [1]
查看完整版本: delphi中Treeview的使用介绍