菜单树

菜单树

// add by cxg 2017-4-18

unit uTree;

interface

uses
SysUtils, Classes, ComCtrls, DB, DBClient;

type
PNodeRec = ^TNodeRec;

TNodeRec = record // 树节点记录
id: string;
name: string;
pid: string;
formname: string; // add by cxg 2017-2-14
bplname: string; // add by cxg 2017-4-18
end;

procedure CreateTree(dataset: TClientDataSet; treeview: TTreeView; id, aname, parentid: string);

procedure FreeTree(treeview: TTreeView);

implementation

procedure CreateTree(dataset: TClientDataSet; treeview: TTreeView; id, aname, parentid: string);
// table struct example: id,name,pid
var
List: TStringList;
Node: TTreeNode;
Index: Integer;
PNode: PNodeRec;
begin
if not dataset.Active or dataset.IsEmpty then
Exit;
treeview.Items.Clear;
List := TStringList.Create;
try
List.Sorted := True;
dataset.First;
while not dataset.Eof do
begin
PNode := new(PNodeRec);
PNode^.id := dataset.FieldByName(id).Text;
PNode^.name := dataset.FieldByName(aname).Text;
PNode^.pid := dataset.FieldByName(parentid).Text;
// add by cxg 2017-2-14
if dataset.FindField('formname') <> nil then
PNode.formname := dataset.FindField('formname').Text;
// add by cxg 2017-4-18
if dataset.FindField('bplname') <> nil then
PNode.bplname := dataset.FindField('bplname').Text;
if (dataset.FieldByName(parentid).Text = '') or (dataset.FieldByName(id).Text = dataset.FieldByName(parentid).Text) then
// add root node
Node := treeview.Items.AddChild(nil, dataset.FieldByName(aname).Text)
else
begin
// add child node
Index := List.IndexOf(dataset.FieldByName(parentid).Text);
Node := treeview.Items.AddChild(TTreeNode(List.Objects[Index]), dataset.FieldByName(aname).Text);
end;
Node.Data := PNode;
List.AddObject(dataset.FieldByName(id).Text, Node);
dataset.Next;
end;
finally
List.Free;
end;
end;

procedure FreeTree(treeview: TTreeView);
var
i: Integer;
Node: TTreeNode;
begin
for i := treeview.Items.Count - 1 downto 0 do
begin
Node := treeview.Items[i];
Dispose(PNodeRec(Node.Data));
end;
end;

end.

posted @   delphi中间件  阅读(654)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2015-04-18 咏南C/S开发框架支持最新的DELPHI XE8开发
点击右上角即可分享
微信分享提示