主要函数有两个 type PMyRec = ^TMyRec; TMyRec = record ID:Integer; //部门编号 GetGrandChild:Boolean; //孙子节点是否已建立 end; {自定义过程,树的重建} procedure TPeopleFrm.ResetTree; var ParentNode,TheNode:TTreeNode; MyDepart:PMyRec; strSql:string; begin TreeDep.Items.Clear; with AdoQ_Dep do begin if Active then Close; SQL.Clear; Sql.Add('select * from 部门表 where 部门父号=0'); Open; end; //添加部门树根节点 if AdoQ_Dep.Eof then begin with AdoQ_DepModify do begin try Close; Sql.Clear; Sql.Add('Insert into 部门表(部门编号,部门名称,部门简码,部门父号,部门分类串,部门分类) Values (1,''所有部门'',''bumen'',0,''-1-'','' '' '); ExecSql; finally ShowMessage('部门表打开错误!'); end; end; AdoQ_Dep.Requery(); end; New(MyDepart); MyDepart^.ID :=AdoQ_Dep.fieldByName('部门编号').AsInteger; MyDepart^.GetGrandChild:=False; parentNode:=TreeDep.Items.AddObject(nil,AdoQ_Dep.FieldByName('部门名称').AsString,myDepart); ParentNode.ImageIndex:=0; //添加一级子树 ADOQ_TmpDep.Close; ADOQ_TmpDep.Sql.Clear; strSql:='select * from 部门表 where 部门父号='+IntToStr(MyDepart^.ID) +' ' ; ADOQ_TmpDep.SQL.Add(strSql); ADOQ_TmpDep.Open; while not ADOQ_TmpDep.Eof do begin New(MyDepart); MyDepart^.ID:=ADOQ_TmpDep.FieldByName('部门编号').AsInteger; theNode:=TreeDep.Items.AddChildObjectFirst(ParentNode,ADOQ_TmpDep.FieldByName('部门名称').AsString,MyDepart); MyDepart^.GetGrandChild:=false; TheNode.ImageIndex:=1; TheNode.SelectedIndex:=2; ADOQ_TmpDep.Next; end; AdoQ_Dep.Next; ADOQ_TmpDep.Close; AdoQ_Dep.Close; //先展开一级 theNode:=TreeDep.Items.GetFirstNode; if theNode<>nil then begin theNode.Selected:=True; TheNode.Expand(False); end; end;{事件:树的expand 事件, 功能:展开某节点} procedure TPeopleFrm.TreeDepExpanded(Sender: TObject; Node: TTreeNode); Var TheNode, ChildNode: TTreeNode; MyDep: PMyRec; Begin if PMyRec(Node.Data)^.GetGrandChild Then exit; //如果已经建立孙子 TheNode:=Node.GetFirstChild; while TheNode<>nil do begin ADOQ_TmpDep.Close; ADOQ_TmpDep.SQL.Clear; ADOQ_TmpDep.SQL.Add('select * from 部门表 where 部门父号='+IntToStr(PMyRec(TheNode.Data)^.Id)+' '); ADOQ_TmpDep.Open; ADOQ_TmpDep.First; while not ADOQ_TmpDep.Eof do begin New(MyDep); MyDep^.ID:=ADOQ_TmpDep.FieldByName('部门编号').Asinteger; MyDep^.GetGrandChild:=False; //底层为false ChildNode:=TreeDep.Items.AddChildObjectFirst(TheNode,ADOQ_TmpDep.FieldByName('部门名称').AsString,MyDep); childNode.ImageIndex:=1; childNode.SelectedIndex:=2; PMyRec(Node.Data)^.GetGrandChild:=True; ADOQ_TmpDep.Next; end; TheNode:=Node.GetNextChild(TheNode); end; ADOQ_TmpDep.Close; end; procedure TPeopleFrm.FormShow(Sender: TObject); begin ResetTree; with AdoQ_PeopleDep do begin Close; Filtered:=False; Filter:='部门分类串 like ''%-1-%'''; Filtered:=True; Open; end; SaveOrRestoreDBGridField(False,caption,DBGrid1); DBGrid1.PopupMenu.Tag:=9;end;
var
lv1Node: TTreeNode;
begin
TreeView1.Items.Add(nil,'Root');
lv1Node:= TreeView1.Items.AddChild(TreeView1.Items.Item[0],'Level1');
TreeView1.Items.AddChild(lv1Node, 'Level2_1');
TreeView1.Items.AddChild(lv1Node, 'Level2_2');
end;Root
|
- Level1
|
- Level2-1
|
- Level2_2
PMyRec = ^TMyRec;
TMyRec = record
ID:Integer; //部门编号
GetGrandChild:Boolean; //孙子节点是否已建立
end;
{自定义过程,树的重建}
procedure TPeopleFrm.ResetTree;
var ParentNode,TheNode:TTreeNode;
MyDepart:PMyRec;
strSql:string;
begin
TreeDep.Items.Clear;
with AdoQ_Dep do
begin
if Active then Close;
SQL.Clear;
Sql.Add('select * from 部门表 where 部门父号=0');
Open; end; //添加部门树根节点
if AdoQ_Dep.Eof then
begin
with AdoQ_DepModify do
begin
try
Close;
Sql.Clear;
Sql.Add('Insert into 部门表(部门编号,部门名称,部门简码,部门父号,部门分类串,部门分类) Values (1,''所有部门'',''bumen'',0,''-1-'','' '' ');
ExecSql;
finally
ShowMessage('部门表打开错误!');
end;
end;
AdoQ_Dep.Requery();
end;
New(MyDepart);
MyDepart^.ID :=AdoQ_Dep.fieldByName('部门编号').AsInteger;
MyDepart^.GetGrandChild:=False;
parentNode:=TreeDep.Items.AddObject(nil,AdoQ_Dep.FieldByName('部门名称').AsString,myDepart);
ParentNode.ImageIndex:=0;
//添加一级子树
ADOQ_TmpDep.Close;
ADOQ_TmpDep.Sql.Clear;
strSql:='select * from 部门表 where 部门父号='+IntToStr(MyDepart^.ID) +' ' ;
ADOQ_TmpDep.SQL.Add(strSql);
ADOQ_TmpDep.Open;
while not ADOQ_TmpDep.Eof do
begin
New(MyDepart);
MyDepart^.ID:=ADOQ_TmpDep.FieldByName('部门编号').AsInteger;
theNode:=TreeDep.Items.AddChildObjectFirst(ParentNode,ADOQ_TmpDep.FieldByName('部门名称').AsString,MyDepart);
MyDepart^.GetGrandChild:=false;
TheNode.ImageIndex:=1;
TheNode.SelectedIndex:=2;
ADOQ_TmpDep.Next;
end;
AdoQ_Dep.Next;
ADOQ_TmpDep.Close;
AdoQ_Dep.Close;
//先展开一级
theNode:=TreeDep.Items.GetFirstNode;
if theNode<>nil then
begin
theNode.Selected:=True;
TheNode.Expand(False);
end;
end;{事件:树的expand 事件,
功能:展开某节点}
procedure TPeopleFrm.TreeDepExpanded(Sender: TObject; Node: TTreeNode);
Var
TheNode, ChildNode: TTreeNode;
MyDep: PMyRec;
Begin
if PMyRec(Node.Data)^.GetGrandChild Then exit; //如果已经建立孙子
TheNode:=Node.GetFirstChild;
while TheNode<>nil do
begin
ADOQ_TmpDep.Close;
ADOQ_TmpDep.SQL.Clear;
ADOQ_TmpDep.SQL.Add('select * from 部门表 where 部门父号='+IntToStr(PMyRec(TheNode.Data)^.Id)+' ');
ADOQ_TmpDep.Open;
ADOQ_TmpDep.First;
while not ADOQ_TmpDep.Eof do
begin
New(MyDep);
MyDep^.ID:=ADOQ_TmpDep.FieldByName('部门编号').Asinteger;
MyDep^.GetGrandChild:=False; //底层为false
ChildNode:=TreeDep.Items.AddChildObjectFirst(TheNode,ADOQ_TmpDep.FieldByName('部门名称').AsString,MyDep);
childNode.ImageIndex:=1;
childNode.SelectedIndex:=2;
PMyRec(Node.Data)^.GetGrandChild:=True;
ADOQ_TmpDep.Next;
end;
TheNode:=Node.GetNextChild(TheNode);
end;
ADOQ_TmpDep.Close;
end;
procedure TPeopleFrm.FormShow(Sender: TObject);
begin
ResetTree;
with AdoQ_PeopleDep do
begin
Close;
Filtered:=False;
Filter:='部门分类串 like ''%-1-%''';
Filtered:=True;
Open;
end;
SaveOrRestoreDBGridField(False,caption,DBGrid1);
DBGrid1.PopupMenu.Tag:=9;end;