delphi treeview(Delphi TreeView 选择父节点,选择所有子节点)
本文目录
- Delphi TreeView 选择父节点,选择所有子节点
- delphi TreeView子节点打开对应窗体
- Delphi:显示treeview中被显示的节点位置
- delphi中treeview的用法
- 如何编辑Treeview节点 delphi
- DELPHI 如何打开和 保存 TREEVIEW 的状态
- Delphi TreeView遍历所有节点问题
- DELPHI TreeView,动态添加父节点,子节点
- delphi TreeView怎样知道选的是子节点 ,并得到它子节点的TEXT
Delphi TreeView 选择父节点,选择所有子节点
1、点击节点,首先判断是否可以选择。
通过TreeNode.Parent是否nil,判断是否有父节点,如果有,则父节点是否可选择,如果不可选择,则当前节点,不可选择。
2、在点击节点时,遍历所有子节点。这里采用递归调用。
首先用HasChildren,判断选中节点是否有子节点。
没有,则返回。
有,则GetFirstChild,然后循环使用GetNextChild,所作操作(1)设置所有子节点的Selected属性和父节点相同(2)递归调用当前子节点。
delphi TreeView子节点打开对应窗体
一般没有将所有窗体都展示出来这样的用法,因为还有一些是配置窗体不用展示。
你可以用配置文件配置一下窗体的名称(name)对应xml展示的文本,Treeview读取xml文件即可。在点击时,根据窗体名称打开对应窗体。如果是使用的 Mdi 多窗口模式,可以使用以下属性来获取:
MainForm.MDIChildCount //获取子窗体的数量
MainForm.MDIChildren //按序号访问子窗体
Delphi:显示treeview中被显示的节点位置
TreeView1.Selected.Level; //这句的返回值是所选节点,在书中的层数,如果为0,说明他是首层的根节点,下一层节点就返回1,以此类推~~~
TreeView1.Selected.Count; //这句返回所选节点下包含子节点个数
根据这个你可以自己想想怎么实现哈~~~
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.ImageIndex:=11;
TreeView1.Items.ImageIndex:=54;
TreeView1.Items.ImageIndex:=54;
TreeView1.Items.ImageIndex:=54;
TreeView1.Items.ImageIndex:=54;
TreeView1.Items.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);
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,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)) div 2)-1)
+ AdoQuery1.FieldValues);
AdoQuery1.Next;
end;
ShowMessage(ss.Text);
ss.SaveToFile(’d:\test8.txt’);
ss.Free;
TreeView1.LoadFromFile(’d:\test8.txt’);
end;
如何编辑Treeview节点 delphi
TreeView1.Items.Clear;
Node1:=TreeView1.Items.Add(NULL,’全部’);
Node1.ImageIndex=0;
Node1.SelectedIndex=1;
ChildKHNode=TreeView1.Items.AddChild(Node1,“今天“);
ChildKHNode.ImageIndex=2;
ChildKHNode.SelectedIndex=2
呵呵
有些偷懒了。差不多这样的意思吧。具体参数,你可ATL+上
进入treeview的类里看。
DELPHI 如何打开和 保存 TREEVIEW 的状态
实现方法
将已经展开的节点索引 放在一个文本中
最后选中的那个节点索引放在最后一位
然后通过下面这个代码这实现
{
TreeView1.Items.Expand(False); //按节点索引 展开节点一级
TreeView1.Select(TreeView1.Items);// 按节点索引 选中节点
}
TreeView1.Selected.AbsoluteIndex; //选中的节点索引号
保存TREEVIEW状态代码
{
SaveTreeViewExplandState(TreeView1,’TreeView.txt’);
}
procedure SaveTreeViewExplandState(TreeView: TTreeView; FileName: string);
var
List: TStringList;
i: Integer;
begin
List := TStringList.Create;
With TreeView do
begin
for i := 0 to Items.Count - 1 do
begin
if Items.Item.Expanded then
List.Add(IntToStr(i));
end;
List.Add(IntToStr(Selected.AbsoluteIndex));
end;
List.SaveToFile(FileName);
List.free;
end;
加载TREEVIEW状态代码
{
LoadTreeViewExplandState(TreeView1, ’abc.txt’);
}
procedure LoadTreeViewExplandState(TreeView: TTreeView; FileName: string);
var
List: TStringList;
i: Integer;
begin
List := TStringList.Create;
with List do
begin
List.LoadFromFile(FileName);
for i := 0 to Count - 2 do //最后一行放的是最后选中的那个节点索引
begin
TreeView.Items.Expand(False);
end;
TreeView.Select(TreeView.Items);
free;
end;
end;
Delphi TreeView遍历所有节点问题
procedure aa(s:string;aItem:TTreeNode);
var
node:TTreeNode;
str:string;
begin
node:=aItem;
while node《》nil do begin
if s=’’ then str:=node.Text else str:=s+’\’+node.Text;
form1.ListBox1.Items.Add(str);
if node.HasChildren then aa(str,node.getFirstChild);
node:=node.getNextSibling;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
aa(’’,TreeView1.Items.GetFirstNode);
end;
在delphi xe5上测试通过,下面是图片效果:
DELPHI TreeView,动态添加父节点,子节点
TreeView由节点构成,建树通过对TreeView.items属性进行操作。Items是一个TTreeNodes对象,这是一个TTreeNode集。
一、针对TTreeNodes,也就是 TreeView.Items,有这些属性:
1、count,节点个数。
2、item ,通过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怎样知道选的是子节点 ,并得到它子节点的TEXT
获取 TreeView 控件当前选中节点是否是子节点,可以通过节点(TTreeNode)的 Parent 属性成员,如果有 Parent ,则说明当前节点是子节点。
获取节点的 Text,可以直接访问节点(TTreeNode)的 Text 属性。
示例代码如下:
procedure TForm1.btn1Click(Sender: TObject);
var CurItem: TTreeNode;
begin
CurItem := tv1.Selected;
if CurItem 《》 nil then
begin
if CurItem.Parent《》nil then
ShowMessage(’当前选中了子节点, 内容:’ + CurItem.Text)
else
ShowMessage(’当前选中了父节点, 内容:’ + CurItem.Text)
end;
end;
代码运行截图:
更多文章:
win7微软雅黑字体下载(我把电脑里面的自带微软雅黑字体删除了,重新下的微软雅黑字体都没有内容了,使用不了怎么弄)
2024年7月19日 01:10
谁有要塞2V1.4的升级补丁或下载地址 最好能把安装方法也告诉我~!?要塞2中文正式版那里有的下载
2024年2月5日 16:40
qq应用中心图标怎么点亮(QQ应用中心图标如何点亮 QQ上app图标怎么点亮/隐藏)
2023年5月23日 08:40
斑马网已经足够50元了为什么不能提现呀?斑马网上做任务福利单兼职是真的吗
2024年6月6日 23:59
悬浮秒表app和悬浮时钟app有区别吗?苹果手机怎么把时钟放在桌面上
2024年3月8日 23:40
魔兽世界战网更新 一直卡在获取编码表上几个小时没反应,有什么解决方法?战网更新一直卡在0%怎么办
2024年6月6日 11:07
share的用法和短语有哪些?win8怎么装SharePoint2010
2024年1月10日 19:40