Delphi实现树型结构具体实例
实例 实现 结构 具体 Delphi 树型
2023-06-13 09:15:06 时间
unitUnit1;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls,ComCtrls,DB,ADODB;
type
PNodeInfoEx=^TNodeInfoEx;
TNodeInfoEx=PackedRecord
NodeID :Integer;
ParentID :Integer;
NodeType :Integer;
ChnNodeTitle:String;
ImageIndex:SmallInt;
SelectedIndex:SmallInt;
end;
TForm1=class(TForm)
tv1:TTreeView;
btn1:TButton;
qry1:TADOQuery;
procedurebtn1Click(Sender:TObject);
procedureFormDestroy(Sender:TObject);
private
{Privatedeclarations}
functionStaticBuildTree(TreeView:TTreeView):Boolean;
functionAddTreeItem(TreeView:TTreeView;AddNodeInfo:PNodeInfoEx):TTreeNode;
functionFindTreeItem(TreeView:TTreeView;CurNodeID:integer):TTreeNode;
public
{Publicdeclarations}
end;
var
Form1:TForm1;
implementation
{$R*.dfm}
functionTForm1.StaticBuildTree(TreeView:TTreeView):Boolean;
var
AddNodeInfo:PNodeInfoEx;
begin
Result:=False;
qry1.LoadFromFile("c:/AdminixTree.xml");//这里以XML文件做为数据源
Treeview.Items.BeginUpdate;//记住:在进行批量添加数据时要使用BeginUpdate,来暂时关闭由于添加数据而触发的某些事件(如OnChange事件等)
Treeview.Items.Clear;//清空Treeview
try
try
ifqry1.RecordCount>0then
begin
qry1.First;
whileNotqry1.Eofdo
begin
New(AddNodeInfo);//生成结构体
AddNodeInfo^.NodeID:=qry1.FieldByName("NODE_ID").AsInteger;
AddNodeInfo^.ParentID:=qry1.FieldByName("PARENT_ID").AsInteger;
AddNodeInfo^.NodeType:=qry1.FieldByName("NodeType").AsInteger;
AddNodeInfo^.ChnNodeTitle:=qry1.FieldByName("ChnNodeTitle").AsString;
AddNodeInfo^.ImageIndex:=qry1.FieldByName("ImageIndex").AsInteger;
AddNodeInfo^.SelectedIndex:=qry1.FieldByName("SelectedIndex").AsInteger;
AddTreeItem(Treeview,AddNodeInfo);//把结构体的指针存到Treeview中
qry1.Next;
end;
end;
except
Application.MessageBox("生成树结点失败",MB_ICONSTOP+MB_OK);
raise;//向上级抛异常
end;
qry1.Close;
Result:=True;
finally
Treeview.Items.EndUpdate;
end;
end;
//在加入结点时,应先判断加入的是父结点还是子结点,判断的依据是在已存在的树结点中是否存在该结点的ParentID
functionTForm1.AddTreeItem(TreeView:TTreeView;AddNodeInfo:PNodeInfoEx):TTreeNode;
var
ParentNode:TTreeNode;
begin
ParentNode:=FindTreeItem(Treeview,AddNodeInfo^.ParentID);
IfParentNode<>nilthen
Result:=Treeview.Items.AddChildObject(ParentNode,Trim(AddNodeInfo.ChnNodeTitle),Pointer(AddNodeInfo))
else
Result:=Treeview.Items.AddObject(ParentNode,Trim(AddNodeInfo.ChnNodeTitle),Pointer(AddNodeInfo));
ifResult<>nilthen
begin
Result.ImageIndex :=AddNodeInfo.ImageIndex;
Result.SelectedIndex:=AddNodeInfo.SelectedIndex;
end;
end;
//这里是判断是否存在其父结点
functionTForm1.FindTreeItem(TreeView:TTreeView;CurNodeID:integer):TTreeNode;
var
i:Integer;
begin
Result:=nil;
fori:=0toTreeview.Items.Count-1do
begin
ifCurNodeID=PNodeInfoEx(Treeview.Items[i].Data)^.NodeIDthen
begin
Result:=Treeview.Items[i];
Exit;
end;
end;
end;
//生成树结构
procedureTForm1.btn1Click(Sender:TObject);
begin
StaticBuildTree(tv1)
end;
//在窗体释放时一定要把树结点中的结构体指针给释放掉,对于在Dispose时为什么要进行强制转型后释放,以前有专门的讲解,在此不在累述
procedureTForm1.FormDestroy(Sender:TObject);
var
i:Integer;
begin
fori:=0totv1.Items.Count-1do
begin
Dispose(PNodeInfoEx(tv1.Items[i].Data) )
end;
end;
end.
//如何访问树结点?
procedureTForm1.tv1MouseDown(Sender:TObject;Button:TMouseButton;
Shift:TShiftState;X,Y:Integer);
var
pNode:TTreeNode;
begin
pNode:=tv1.GetNodeAt(x,y);
if(pNode<>nil)and (Button=mbleft)then
ShowMessage(PNodeInfoEx(pNode.Data)^.ChnNodeTitle);
end;
相关文章
- 【SpringBoot-3】切面AOP实现权限校验:实例演示与注解全解
- java实现递归树形结构_java递归算法经典实例
- 汉字转16进制java_java实现汉字转unicode与汉字转16进制实例[通俗易懂]
- 微信支付商家转账到零钱实例参考
- FFMPEG 转码部署实例
- SQL Server 实现数字辅助表实例代码
- MongoDB运行日志实现自动分割的方法实例
- sqlite之增删改查实例 – 实现简单的iOS收藏夹功能详解手机开发
- JavaScript验证字符串只能包含数字或者英文字符的代码实例详解编程语言
- Linux下实现即时响应:ndelay使用实例(linuxndelay)
- 安装Oracle实例安装指南:一步步搭建你的系统(oracle实例下载)
- Oracle复制实例实现高可用性(oracle复制实例)
- javascript中的对象创建实例附注释
- jquery实现图片滚动效果的简单实例
- java基于包结构的请求路由实现实例分享
- java实现哈弗曼编码与反编码实例分享(哈弗曼算法)
- Android中使用ViewFlipper进行手势切换实例
- php实现的树形结构数据存取类实例
- ThinkPHP中关联查询实例
- PHP实现对文本数据库的常用操作方法实例演示
- C++形参与实参的区别实例解析
- java实现文件读写与压缩实例
- 基于C#实现的HOOK键盘钩子实例代码
- php实现的Captcha验证码类实例