Delphi实现树型结构具体实例
来源:本站原创|时间:2020-01-10|栏目:Delphi|点击: 次
复制代码 代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, DB, ADODB;
type
PNodeInfoEx = ^TNodeInfoEx;
TNodeInfoEx = Packed Record
NodeID : Integer;
ParentID : Integer;
NodeType : Integer;
ChnNodeTitle : String;
ImageIndex: SmallInt;
SelectedIndex: SmallInt;
end;
TForm1 = class(TForm)
tv1: TTreeView;
btn1: TButton;
qry1: TADOQuery;
procedure btn1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
function StaticBuildTree(TreeView:TTreeView ):Boolean;
function AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
function FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.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
if qry1.RecordCount >0 then
begin
qry1.First;
while Not qry1.Eof do
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
function TForm1.AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
var
ParentNode: TTreeNode;
begin
ParentNode := FindTreeItem(Treeview,AddNodeInfo^.ParentID);
If ParentNode <> nil then
Result := Treeview.Items.AddChildObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo))
else
Result := Treeview.Items.AddObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo));
if Result<>nil then
begin
Result.ImageIndex := AddNodeInfo.ImageIndex;
Result.SelectedIndex := AddNodeInfo.SelectedIndex;
end;
end;
//这里是判断是否存在其父结点
function TForm1.FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
var
i : Integer;
begin
Result := nil;
for i := 0 to Treeview.Items.Count-1 do
begin
if CurNodeID=PNodeInfoEx(Treeview.Items[i].Data)^.NodeID then
begin
Result := Treeview.Items[i];
Exit;
end;
end;
end;
//生成树结构
procedure TForm1.btn1Click(Sender: TObject);
begin
StaticBuildTree (tv1)
end;
//在窗体释放时一定要把树结点中的结构体指针给释放掉,对于在Dispose时为什么要进行强制转型后释放,以前有专门的讲解,在此不在累述
procedure TForm1.FormDestroy(Sender: TObject);
var
i : Integer;
begin
for i := 0 to tv1.Items.Count-1 do
begin
Dispose( PNodeInfoEx(tv1.Items[i].Data) )
end;
end;
end.
复制代码 代码如下:
//如何访问树结点?
procedure TForm1.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;
上一篇:wordpress主题支持自定义菜单及修改css样式实现方法
栏 目:Delphi
本文标题:Delphi实现树型结构具体实例
本文地址:https://www.xiuzhanwang.com/a1/Delphi/8653.html
您可能感兴趣的文章
- 01-10在Delphi实现在数据库中存取图像的图文演示无错
- 01-10delphi建立、读取、存贮INI文件的方法《三》
- 01-10Delphi Command模式
- 01-10delphi 正弦曲线图
- 01-10delphi建立、读取、存贮INI文件的方法《二》
- 01-10插件管理框架 for Delphi(二)
- 01-10插件管理框架 for Delphi(一)
- 01-10Delphi中判断文件是否为文本文件的函数
- 01-10delphi中一个值得大家来考虑的DLL问题
- 01-10初探Delphi中的插件编程
阅读排行
本栏相关
- 01-10在Delphi实现在数据库中存取图像的图
- 01-10delphi建立、读取、存贮INI文件的方法
- 01-10delphi 正弦曲线图
- 01-10Delphi Command模式
- 01-10delphi建立、读取、存贮INI文件的方法
- 01-10插件管理框架 for Delphi(二)
- 01-10插件管理框架 for Delphi(一)
- 01-10Delphi中判断文件是否为文本文件的函
- 01-10delphi中一个值得大家来考虑的DLL问题
- 01-10初探Delphi中的插件编程
随机阅读
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 04-02jquery与jsp,用jquery
- 01-11ajax实现页面的局部加载
- 01-10SublimeText编译C开发环境设置
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-10C#中split用法实例总结
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10delphi制作wav文件的方法
- 08-05DEDE织梦data目录下的sessions文件夹有什