首页编程delphi treeview,delphi中treeview的用法

delphi treeview,delphi中treeview的用法

编程之家2023-11-02103次浏览

这篇文章给大家聊聊关于delphi treeview,以及delphi中treeview的用法对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

delphi treeview,delphi中treeview的用法

delphi中TreeView1控件怎么在每个节点上写事件啊

有两种方法在TreeView节点上写事件

(1)onchange事件:TreeView1Change(Sender: TObject;

Node: TTreeNode);//注意传进来的Node参数就是TreeView1控件节点

begin

if TreeView1.Selected.Text= Node.Text

begin

delphi treeview,delphi中treeview的用法

//写你的Node节点事件代码

end;

end;

(2)TreeView1MouseDown事件:TreeView1MouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var

delphi treeview,delphi中treeview的用法

Node: TTreeNode;

begin

Node:= TreeView1.GetNodeAt(X, Y);//从MouseDown事件中获得TreeView1控件的节点

if TreeView1.Selected.Text= Node.Text

begin

//写你的Node节点事件代码

end;

end;

注意一点:最好用onchange事件,应为用TreeView1MouseDown事件的弊端是鼠标在TreeView1上MouseDown一次就会执行Node:= TreeView1.GetNodeAt(X, Y);占用系统资源,不是一个好算法,建议用onchange事件,这是高手的选择,希望我的回答能对您起到帮助~~~

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(),就可以访问所有的节点。

四、建树举例:

var

root_node,cur_node:TTreeNode;

begin

root_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,即当前被选中的节点。

当修改一个节点的text时,会触发TTreeView.onEdit事件。

六、将节点和节点所对应的数据联系起来

对于每个TTreeNode,有个Data属性,可以存放一个指针。我们可以利用这个域来存放与节点对应的自己的数据。

1.先定义一个数据结构,作为记录我们要记录的数据。如:

PMyData=^TMyData;

TMyData=Record

Name:string;

Sex:String;

Age:integer;

end;

2.然后,创建数时,将节点和节点数据联系起来:

procedure TForm1.Button1Click(Sender: TObject);

var

RecPtr: PMyData;

begin

New(RecPtr);//记住,一定要先分配内存。有几个节点,就要分配几次内存。

RecPtr^.Name:='康康';

RecPtr^.Sex:='男';

RecPtr^.Age:= 18+TreeView1.Items.Count;

TreeView1.items.AddObject(nil,'节点数据结构'+inttostr(TreeView1.Items.Count),RecPtr);

end;

3.当我们选中一个节点时,就可以使用我们的数据了。

procedure TForm1.TreeView1Change(Sender:TObject;Node:TTreeNode);

var

RecPtr: PMyData;

begin

if TreeView1.Selected=nil then Exit;

if TreeView1.Selected.Data<>nil then begin

RecPtr:=TreeView1.Selected.Data;

ShowMessage(TreeView1.Selected.Text+#13#10+'姓名:'+RecPtr.Name+#13#10+'性别:'+RecPtr.Sex+#13#10+'年龄:'+inttostr(RecPtr.Age));

end;

七、一般使用流程:

1、添加全局变量:

b_first:boolean;//记录是否是第一次访问节点,因为此时数据还未准备好,而一旦访问节点就会触发OnChange事件,在此事件处理函数中也许会出错。

2、在FormCreate中,

a、设置b_first:=true;

b.创建数并将节点与数据联系。

3、在FormShow中

设置b_first:=false;

4.在事件OnChange中处理节点被选中事件。

5.在Edit中处理节点被修改Text事件。

并调用OnChange.

6.在 TreeView.Destory中

释放Data中指向的内存空间。

delphi中treeview的用法

例一

//刷新Tree 1

procedure TMainForm.RefTree();

var

Tags:string;

RootNode0,RootNode1,RootNode2,RootNode3,RootNode4,RootNode5:TtreeNode;

i:integer;

begin

TreeView1.Items.Clear;

RootNode0:=TreeView1.Items.Add(nil,'全部');

RootNode1:=TreeView1.Items.Add(nil,'资分类');

RootNode2:=TreeView1.Items.Add(nil,'部门');

RootNode3:=TreeView1.Items.Add(nil,'情况');

RootNode4:=TreeView1.Items.Add(nil,'位置');

RootNode5:=TreeView1.Items.Add(nil,'方式');

TreeView1.Items[0].ImageIndex:=11;

TreeView1.Items[1].ImageIndex:=54;

TreeView1.Items[2].ImageIndex:=54;

TreeView1.Items[3].ImageIndex:=54;

TreeView1.Items[4].ImageIndex:=54;

TreeView1.Items[5].ImageIndex:=54;

RootNode0.SelectedIndex:=RootNode0.ImageIndex;

RootNode1.SelectedIndex:=RootNode1.ImageIndex;

RootNode2.SelectedIndex:=RootNode2.ImageIndex;

RootNode3.SelectedIndex:=RootNode3.ImageIndex;

RootNode4.SelectedIndex:=RootNode4.ImageIndex;

RootNode5.SelectedIndex:=RootNode5.ImageIndex;

//分类

with DataM.q1 do

begin

SQL.Clear;

SQL.Add('Select Name1 from Navtree where tag=''分类''');

Open;

while not eof do

begin

TreeView1.Items.AddChild(RootNode1,FieldValues['Name1']);

next;

end;

end;

(此处省略365个字.....呵呵)

end;

例二

procedure TForm1.showtree;//showtree自定义的

var

mynode:ttreenode;

begin

with adoquery1 do

begin

close;

sql.Clear;

sql.Add('select* from aa where value=''1''');

open;

if recordcount<> 0 then

begin

treeview1.Items.Add(treeview1.TopItem,fieldbyname('name').AsString);

end;

end;

with adoquery2 do

begin

close;

sql.Clear;

sql.Add('select* from aa where len(name)= 4');

open;

while not eof do

begin

mynode:= treeview1.Items.AddChild(treeview1.TopItem,fieldbyname('name').AsString);

with adoquery3 do

begin

close;

sql.Clear;

sql.Add('select* from aa where name like'''+'%'+ mynode.Text+''' and len(name)= 6');

open;

if recordcount<> 0 then

begin

first;

begin

treeview1.Items.AddChild(mynode,fieldbyname('name').AsString);

next;

end;

end;

end;

next;

end;

end;

end

例三

一、指标树的建立

具体方法是:创建一个数据库,设计指标表t_pub_index,包含index_id、parent_id、index_name字段,其它字段根据实际业务而定,指标名称index_name将在树型控件的节点上显示,index_id字段保存节点的唯一标识号,parent_id表示当前节点的父节点号,标识号组成了一个“链表”,记录了树上节点的结构。设计一窗体Frm_sys_index,其上放置TreeView控件tv_zb、Query控件Query1及其它指标属性编辑显示控件。一个树的节点又包含文本(Text)和数据(Data)。Text为String类,用来显示指标或指标目录名称。Data则为无定形指针(Untyped Pointer),可以指向一个与节点相联系的数据结构,该结构与数据库指标表相应域关联,如指标ID、上级节点ID。

Query控件的表达式为:

select index_id, parent_id, index_name from t_pub_index

start with index_id=0 connect by prior index_id=parent_id

其中start with和connect by是Oracle的SQL语句的保留字,使一条记录的parent_id列的值等于前一记录的index_id列的值,并以parent_id等于0的记录开始。

建树的基本思路是:

procedure TFrm_sys_index.createtree;

var

curValue: indexPointer;//指向与节点相联系的数据结构的指针

curNode: TTreeNode;//当前节点

curid: integer;//当前节点标识号

begin

curNode:= nil;

curid:=-1;

Query_index.Open;

Query_index.first;

while not Query_index.Eof do

begin

new(curValue);

With curValue^ do

将数据库指标表t_pub_index各字段值赋curValue所指数据结构

while(curid<> curValue.parent_id) do//当前节点的标识号不等于当前记录的父节点号

begin

curNode:= curNode.parent;

curid:= indexPointer(curNode.data).index_id;

end;

curNode:= tv_zb.Items.AddChildObject(curNode,

curValue^.index_name,curValue);//在当前节点上添加子节点,显示节点指标名称,所带指针指向一个与指标数据相联系的数据结构

curid:= indexPointer(curNode.data).index_id;

Query_index.next;

end;

Query_index.close;

end;

二、增加、删除、修改树节点

单纯在Treeview上增加、删除、修改节点只需用它本身提供的Treeview.Items. AddChildObject、 Treeview.Selected.Delete、Treeview.Selected.EditText等方法即可,但要相应修改数据库中的数据,必须通过递归调用同一个函数(用于删除一个选项)来遍历所选节点下的所有子节点。下面以删除节点为例介绍具体实现流程:

function TFrm_sys_index.delnode(node1:TTreenode):TTreenode;

var

childnode:TTreenode;

begin

childnode:=node1.GetLastChild;//按倒序获得子项,因为删除选项时,列表会发生变化

while childnode<>nil do

childnode:=delnode(childnode);//如子项不为空,进行递归调用

index_id:=inttostr(indexpointer(node1.data).index_id);//获得该节点对应指标

在数据库删除相应指标;

result:=node1.parent.GetPrevChild(node1);//定位到该节点的上一节点

node1.delete;//删除树节点

end;

三、拖动树节点

拖动树节点基本上是通过建立目标项的新子项、向它复制源项、删除原项来移动选项。与上述删除操作相似,也是通过递归调用同一个函数(用于移动一个选项),按倒序移动所选节点下的所有子节点。下面是递归过程的代码:

procedure TFrm_sys_index.CopyNodeUnder(treeview:TTreeview;

sourcenode,targetnode:ttreenode);

var

newnode:ttreenode;

i:integer;

begin

newnode:=treeview.items.addchildfirst(targetnode,'');//建立目标项

newnode.assign(sourcenode);//复制源项属性

for i:=sourcenode.count-1 downto 0 do//递归调用,按倒序移动其所有子项

CopyNodeUnder(treeview,sourcenode.item[i],newnode);

treeview.items.delete(sourcenode);//删除源项

end;

Treeview对拖动操作提供支持,我们将组件的DragKind属性设置为dkDrag,DragMode属性设置为dmAutomatic,并为OnDragOver与OnDragDrop事件编写了处理程序。OnDragOver事件处理程序对允许移动的条件进行判断,排除需要避免的特殊情况。代码如下:

procedure TFrm_sys_index.tv_zbDragOver(Sender, Source: TObject; X,

Y: Integer; State: TDragState; var Accept: Boolean);

var

targetnode,sourcenode:TTreenode;

begin

targetnode:=tv_zb.getnodeat(x,y);

if(Source=Sender) and(targetnode<>nil) then//保证移动在TreeView上,且目标节点不为空

begin

Accept:=true;

sourcenode:=tv_zb.selected;

//以下代码防止用户将一个选项拖到其子项上(它会随着选项一起移动,导致死循环)

while(targetnode.parent<>nil) and(targetnode<> sourcenode) do

targetnode:=targetnode.parent;

if(targetnode= sourcenode) then Accept:=false;

end

else Accept:=false;

end;

OnDragDrop事件处理程序启动前述移动过程CopyNodeUnder,修改数据库数据。此外,在大批量添加数据到Treeview中时最好使用TreeView.Items.BeginUpdate和 TreeView.Items.EndUpdate,这样能加快显示速度。大致流程如下:

procedure TFrm_sys_index.tv_zbDragDrop(Sender, Source: TObject; X,

Y: Integer);

var

targetnode,sourcenode:TTreenode;

begin

targetnode:=tv_zb.getnodeat(x,y);//获得源节点

sourcenode:=tv_zb.selected;//获得目标节点

修改数据库中当前节点的父节点号parent_id,使其等目标节点标识号;

tv_zb.items.beginupdate;//禁用TreeView重绘操作

try

copynodeunder(tv_zb,sourcenode,targetnode);//启动移动过程

tv_zb.selected:=targetnode;

finally

tv_zb.items.endupdate;//重新设置

end;

end;

例四

给你一段超级短的代码,caption字段就是你的value字段,因value是保留字,所以我改成这个了。

procedure TForm1.Button1Click(Sender: TObject);

var

ss: TStrings;

begin

AdoQuery1.SQL.Text:='SELECT name,caption FROM test8 ORDER BY name';

AdoQuery1.Open;

ss:= TStringList.Create;

while not AdoQuery1.Eof do

begin

ss.Add(StringOfChar(#9,(Length(Trim(AdoQuery1.FieldValues['name'])) div 2)-1)

+ AdoQuery1.FieldValues['caption']);

AdoQuery1.Next;

end;

ShowMessage(ss.Text);

ss.SaveToFile('d:\test8.txt');

ss.Free;

TreeView1.LoadFromFile('d:\test8.txt');

end;

文章到此结束,希望我们对于delphi treeview的问题能够给您带来一些启发和解决方案。如果您需要更多信息或者有其他问题,请随时联系我们。

收录优美的图片网站(我的收录优美的图片网进去后总是显示网页上有错误 怎么办)百度递交,递交是什么意思