复制代码代码如下:
单位1;
界面
用途
Windows、消息、SysUtils、变体、类、图形、控件、表单、
对话框、StdCtrl、ComCtrl、DB、ADODB;
类型
PNodeInfoEx = ^TNodeInfoEx;
TNodeInfoEx = 打包记录
节点ID:整数;
ParentID:整数;
节点类型:整数;
ChnNodeTitle:字符串;
图像索引:SmallInt;
选定索引:SmallInt;
结尾;
TForm1 = 类(TForm)
tv1:TTreeView;
btn1:T按钮;
qry1:TADO查询;
程序 btn1Click(发件人: TObject);
过程 FormDestroy(发件人: TObject);
私人的
{ 私人声明 }
函数 StaticBuildTree(TreeView:TTreeView ):Boolean;
函数 AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
函数 FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
民众
{ 公开声明 }
结尾;
变量
表格1:TForm1;
执行
{$R *.dfm}
函数 TForm1.StaticBuildTree(TreeView:TTreeView ):Boolean;
变量
添加节点信息:PNodeInfoEx;
开始
结果:=假;
qry1.LoadFromFile('c:/AdminixTree.xml');//这里以XML文件做为数据源
Treeview.Items.BeginUpdate;//记住:在进行批量添加数据时要使用BeginUpdate,暂时关闭由于添加数据而触发的某些事件(例如OnChange事件等)
Treeview.Items.Clear;//清空Treeview
尝试
尝试
如果 qry1.RecordCount >0 那么
开始
qry1.第一;
而不是 qry1.Eof 做
开始
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.下一个;
结尾;
结尾;
除了
Application.MessageBox('生成树结点失败',MB_ICONSTOP+MB_OK);
raise;//向上级抛异常
结尾;
qry1.关闭;
结果:=真;
最后
Treeview.Items.EndUpdate;
结尾;
结尾;
//在判断结点时,应先加入是父结点还是子结点,判断的判定是在已存在的树加入结点中是否存在该结点的ParentID
函数 TForm1.AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
变量
父节点:TTreeNode;
开始
ParentNode := FindTreeItem(Treeview,AddNodeInfo^.ParentID);
如果 ParentNode <> nil 那么
结果 := Treeview.Items.AddChildObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), 指针(AddNodeInfo))
别的
结果 := Treeview.Items.AddObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo));
如果结果 <>nil 那么
开始
结果.ImageIndex := AddNodeInfo.ImageIndex;
结果.SelectedIndex := AddNodeInfo.SelectedIndex;
结尾;
结尾;
//这里是判断是否存在其父结点
函数 TForm1.FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
变量
我:整数;
开始
结果:=零;
for i := 0 到 Treeview.Items.Count-1 做
开始
如果 CurNodeID=PNodeInfoEx(Treeview.Items[i].Data)^.NodeID 那么
开始
结果 := Treeview.Items[i];
出口;
结尾;
结尾;
结尾;
//生成树结构
过程 TForm1.btn1Click(发件人: TObject);
开始
静态构建树 (tv1)
结尾;
//在表格释放时一定要树结点中的结构体指针给释放掉,对于在Dispose时为什么要进行强制主动后释放,之前有专门的讲解,这里还没累述
过程 TForm1.FormDestroy(Sender: TObject);
变量
我:整数;
开始
对于 i := 0 到 tv1.Items.Count-1 做
开始
处置( PNodeInfoEx(tv1.Items[i].Data) )
结尾;
结尾;
结尾。
复制代码代码如下:
//如何访问树结点?
过程 TForm1.tv1MouseDown(发送者: TObject; 按钮: TMouseButton;
移位:TShiftState; X、Y:整数);
变量
pNode:TTreeNode;
开始
pNode:=tv1.GetNodeAt(x,y);
if (pNode<>nil) and (Button=mleft) then
ShowMessage(PNodeInfoEx(pNode.Data)^.ChnNodeTitle);
结尾;